#javascript #reactjs #react-router #jsx
#javascript #reactjs #реагирующий маршрутизатор #jsx
Вопрос:
Я знаю, что поведение / функция react-router по умолчанию не помогает нам легко перезагружать текущий компонент, но мне это действительно нужно в моем приложении.
Мое приложение имеет дело с продуктами. У меня есть список продуктов, который я могу загрузить, и когда я нажимаю на элемент, в нем отображаются соответствующие сведения о продукте.
На этой странице у меня есть ссылки на связанные продукты, которые загружают тот же компонент, но с другой информацией о продукте, расположенной по адресу
<Route path="/products/:id/details" component={ProductDetail} />
Я извлекаю данные в своем componentWillMount, и кажется, что если я только изменю URL, новый компонент НЕ будет смонтирован, и поэтому у меня всегда отображаются мои старые данные, ничего не извлекая.
Как новичок, использующий React, я ищу некоторую помощь или некоторые приемы для перезагрузки компонента, соответствующего этой странице. Я имею в виду возможность перезагрузки ProductDetail с помощью хорошего продукта.
Я попытался осмотреться с помощью componentWillUpdate (метод, в котором я вижу, что URI маршрутизатора изменяется: D), но я не могу setState внутри него, чтобы перезагрузить мой компонент (похоже, это вообще не очень хорошая практика)
Есть идеи, как я могу заставить это работать?
РЕДАКТИРОВАТЬ: согласно первому ответу, я должен использовать onEnter. Теперь я застрял на способе передачи состояния / реквизита соответствующему компоненту :
const onEnterMethod = () => {
return fetch(URL)
.then(res => res.json())
.then(cmp => {
if (cmp.length === 1) {
// How to pass state / props to the next component ?
}
});
};
Ответ №1:
Способ обработки зависит от того, используете ли вы flux, redux или как вы хотите управлять своими действиями. Кроме того, я бы попытался использовать свойство onChange компонента Route (проверьте документы React router):
<Route path="/products/:id/details" component={ProductDetail} onChange={someMethod} />
А затем в someMethod создайте действие, если вы используете redux или, однако, выполняется в потоке.
Сокращение будет:
<Route path="/products/:id/details" component={ProductDetail} onEnter={onEnterHandler(store)} />
И обработчик onEnterHandler с хранилищем redux:
function onEnterHandler(store) {
return (nextState, replace) => {
store.dispatch({
type: "CHANGEPRODUCT",
payload: nextState.params.id
})
};
}
А затем в вашем компоненте ProductDetail вы должны напечатать новую информацию (для завершения этой части потребуется немного больше знаний в библиотеках redux и redux-sagas).
Имейте в виду, что React — это всего лишь часть представления, пытаться решить все эти проблемы, используя только react, не только не рекомендуется, но и может испортить ваш код.
Комментарии:
1. Спасибо за это, я думаю, что я ищу onEnter, я отредактирую свой вопрос 😉
2. Это зависит от того, что вы используете, если redux или flux. Я не знаю о потоке, но я опубликую пример redux.