Оператор if для React Routing from query

У меня следующий вопрос относительно React и React routing. Я пытаюсь выполнить маршрутизацию на основе того, какие страны и проекты возвращаются по моему запросу. В принципе, я считаю, что мне нужен оператор if, чтобы увидеть, является ли _id каждого заголовка проектом или страной, чтобы был возвращен правильный соответствующий компонент (либо RenderCountry, либо RenderProject).

     componentDidMount() {
    client

      .fetch('*[_type == "land" || _type = = "project"] {title, slug, _type }')
      .then(country => this.setState({ country }));
  }
  render() {
    return (
      <Switch>
        {this.state.country.map(post => (
          <Route
            path = {`/${post.slug.current}`}
            exact
            component = {RenderCountry}
          />
        ))}
        <Route path = "/" exact component = {Home} />
        <Route path = "/about" exact component = {About} />
        <Route path = "/countries" exact component = {Countries} />
        <Route path = "/projects" exact component = {Projects} />
        <Route component = {FouroFour} />
      </Switch>
    );
  }

Ждем Вашего ответа! Это результаты запроса:

    {
  _type: "land",
  slug: {
    _type: "slug",
    current: "namibia"
  },
  title: "Namibia"
}
{
  _type: "land",
  slug: {
    _type: "slug",
    current: "niger"
  },
  title: "Niger"
}
{
  _type: "project",
  slug: {
    _type: "slug",
    current: "self-help-or-social-transformation"
  },
  title: "Self help or social transformation"
}
{
  _type: "project",
  slug: {
    _type: "slug",
    current: "mozambique-norway-accessibility-partnership"
  },
  title: "Mozambique/Norway Accessibility Partnership"
}
{
  _type: "project",
  slug: {
    _type: "slug",
    current: "matching-education-skills-and-work"
  },
  title: "Matching education, skills and work"
}

Не думаю, что понимаю ваш вопрос. Что-то работает не так, как ожидалось в опубликованном вами примере кода?

Niekert 21.08.2018 12:06

Мне жаль, что я недостаточно хорошо объяснил это. Я обновлю пост с дальнейшими пояснениями. Но пока: в .map мне нужен компонент для рендеринга либо страны рендеринга, либо RenderProject в зависимости от того, что такое _id текущего элемента в .map.

Kristian Munter 21.08.2018 12:27

ни в одном вашем коде нет _id. ты про _type?

azium 21.08.2018 12:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что вы почти закончили с опубликованным вами примером кода. Вы уже сопоставили все данные для создания новых компонентов <Route />. Во время этого сопоставления у вас есть доступ к _type, поэтому вы можете определить, какую опору component передать в маршрут на основе этого.

Что-то вроде этого:

  render() {
    return (
      <Switch>
        {this.state.country.map(post => (
          <Route
            path = {`/${post.slug.current}`}
            exact
            component = {post._type === 'country' ? RenderCountry : RenderProject}
          />
        ))}
      </Switch>
    );
  }

Если у вас есть разные типы компонентов для рендеринга для каждого post._type, может быть лучше создать сопоставление, чтобы у вас было что-то вроде:

const routeComponentMap = {
  land: RenderCountry,
  project: RenderProject
};

export class RenderRoute extends Component {
  constructor() {
    super();
    this.state = {
      country: [],
      project: []
    };
  }

  componentDidMount() {
    client
      .fetch('*[_type == "land" || _type = = "project"] {title, slug, _type }')
      .then(country => this.setState({ country }));
  }

  render() {
    return (
      <Switch>
        {this.state.country.map(post => (
          <Route
            path = {`/${post.slug.current}`}
            exact
            component = {routeComponentMap[post._type]}
          />
        ))}
        <Route path = "/" exact component = {Home} />
        <Route path = "/about" exact component = {About} />
        <Route path = "/countries" exact component = {Countries} />
        <Route path = "/projects" exact component = {Projects} />
        <Route component = {FouroFour} />
      </Switch>
    );
  }
}

Спасибо, Никерт! это похоже на правильное решение, но у меня возникли проблемы с его реализацией, это моя попытка dpaste.de/6eHb#L16 На веб-сайте отображается ошибка «TypeError: Cannot read property 'country' of undefined» «, это для строки 38, где определены константные маршруты

Kristian Munter 21.08.2018 15:41

Убедитесь, что вы запустили команду put const routes = ... внутри функции render! Извините, я пропустил часть окружающего кода, чтобы мой ответ был немного короче.

Niekert 21.08.2018 15:44

Эта фиксированная страна! (мы назвали его "земля"), но по какой-то странной причине он работает только для страны, но не для проекта dpaste.de/MDye <- код как таковой может помочь увидеть json, но у нас нет проблем с вызовом "проекта" в code dpaste.de/YfXv <- вывод json, с которым мы работаем. Также вы очень помогли, Никерт, большое вам спасибо!

Kristian Munter 21.08.2018 16:09

Хм, судя по примерам кода, я бы сказал, может быть, вы имеете в виду, что не работает для страны, а для проекта? Я думаю, это происходит потому, что в routeComponentMap это country: RenderCountry, но вместо этого он должен быть land: RenderCountry (потому что _type будет land вместо country, который он теперь пытается найти. Мой пример тоже обновлен. Нет проблем!

Niekert 21.08.2018 17:15

нет, он отлично работает для страны, но не для проекта. Это очень странно. мы сами видели проблему страны / земли :). спасибо за обновленный пример!

Kristian Munter 21.08.2018 17:21

Похоже, ошибка была где-то в моем проекте, спасибо Niekert, ваше решение было правильным.

Kristian Munter 22.08.2018 13:59

Другие вопросы по теме