У меня следующий вопрос относительно 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"
}
Мне жаль, что я недостаточно хорошо объяснил это. Я обновлю пост с дальнейшими пояснениями. Но пока: в .map мне нужен компонент для рендеринга либо страны рендеринга, либо RenderProject в зависимости от того, что такое _id текущего элемента в .map.
ни в одном вашем коде нет _id. ты про _type?





Я думаю, что вы почти закончили с опубликованным вами примером кода. Вы уже сопоставили все данные для создания новых компонентов <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, где определены константные маршруты
Убедитесь, что вы запустили команду put const routes = ... внутри функции render! Извините, я пропустил часть окружающего кода, чтобы мой ответ был немного короче.
Эта фиксированная страна! (мы назвали его "земля"), но по какой-то странной причине он работает только для страны, но не для проекта dpaste.de/MDye <- код как таковой может помочь увидеть json, но у нас нет проблем с вызовом "проекта" в code dpaste.de/YfXv <- вывод json, с которым мы работаем. Также вы очень помогли, Никерт, большое вам спасибо!
Хм, судя по примерам кода, я бы сказал, может быть, вы имеете в виду, что не работает для страны, а для проекта? Я думаю, это происходит потому, что в routeComponentMap это country: RenderCountry, но вместо этого он должен быть land: RenderCountry (потому что _type будет land вместо country, который он теперь пытается найти. Мой пример тоже обновлен. Нет проблем!
нет, он отлично работает для страны, но не для проекта. Это очень странно. мы сами видели проблему страны / земли :). спасибо за обновленный пример!
Похоже, ошибка была где-то в моем проекте, спасибо Niekert, ваше решение было правильным.
Не думаю, что понимаю ваш вопрос. Что-то работает не так, как ожидалось в опубликованном вами примере кода?