Как извлекать данные в динамическом маршруте react hooks?

#reactjs #redux #react-redux #react-router #react-hooks

#reactjs #сокращение #react-redux #react-маршрутизатор #реагирующие хуки

Вопрос:

Я пишу простую коллекцию блогов. У меня есть новейший react-router и react-redux. У меня есть все блоги в моем магазине. Когда я перехожу на одну страницу блога, сначала все работает нормально, но когда я обновляю браузер или ввожу динамический URL-адрес прямо в адресную строку, данные компонента теряются. Какой тип хука я должен использовать для извлечения данных? У меня есть только это в моем одиночном блоге для извлечения данных:

  const id = useParams().id
 const blog = useSelector(state => state.blogs.find(b => b.id === id))
  

Комментарии:

1. useEffect может помочь вам извлекать данные и повторно отображать. потрясающее объяснение здесь: reactjs.org/docs/hooks-effect.html#example-using-hooks

2. Но я не могу использовать useSelector из useEffect.

Ответ №1:

Когда вы обновляете браузер, все ваше приложение перезапускается, включая ваше состояние, в котором хранятся данные.

Если вы хотите сохранить данные даже после обновления браузера, вам следует сохранить свои данные в localStorage и изменить код так, чтобы он получал состояние из данных, сохраненных в localStorage .

Как вы могли бы это сделать:
Когда вы извлекаете данные

 ...
// Where data is the variable that holds your fetched data
localStorage.setItem('data_array', JSON.stringify(data));
  

В редукторе блога

 ...
// Instead of having the initial state as empty array `[]`, you make it equal
// to whichever data is stored in the localStorage. Because if the localStorage
// have no data, it will still return an empty array `[]`
const initialState = JSON.parse(localStorage.getItem('data_array'));

export function blogReducer(state = initialState, action) {
  switch (action.type)
  ...
}
  

На странице блога

 ...
// You keep blog const as it is since we took care of the localStorage in
// the reducer
const blog = useSelector(state => state.blogs.find(b => b.id === id))
...
  

Краткое примечание:
Вы не должны полагаться на обновление браузера для получения нового сообщения в блоге / данных. Однако вы могли бы использовать setInterval() для отправки запроса на выборку каждый x раз, чтобы узнать, есть ли какие-либо новые записи / данные, или вы могли бы добавить кнопку обновления в свое приложение, которая запускает запрос на получение любых новых данных

Комментарии:

1. Пример использования localStorage ?

2. Я обновил ответ, чтобы включить пример того, как реализовать localStorage

3. Но я также не могу использовать useSelector условно.

4. Расскажу вам о лучшем решении. Вместо того, чтобы обрабатывать localStorage в blog page , мы обрабатываем его в blog reducer самом. Таким образом, вы можете сохранить свой blog page код как есть, и проблем с использованием не возникнет useSelector . Я изменил ответ, чтобы продемонстрировать это

5. Если я сохраняю информацию блога в localStorage, я получаю сообщение об ошибке: «Ошибка: была вызвана ошибка перекрестного происхождения. У React нет доступа к фактическому объекту ошибки в разработке «.