React & Redux — обработка изменения состояния после вызова API в useEffect

Мне нужна помощь от вас в моем случае в действии вызова редуктора и получения значения редуктора состояния. Новое значение редуктора состояния после действия вызова недоступно в useEffect.
Это моя функция действий:

export const checkItem = () => (dispatch, getState) => {
  axios
    .get(mainUrl+'/api/cekitem')
    .then(res => {
      dispatch({
        type: ITEM_CHECK,
        payload: res.data
      })
    })
    .catch(err =>{
      dispatch(returnErrors(err.response.data || 'Terjadi kesalahan', err.response.status || 404))
    });
};

И это моя функция редуктора:

export default function(state = initialState, action) {
  switch (action.type) {
    case ITEM_CHECK:
      return {
        ...state,
        items: action.payload.data,
        loading: false
      };
    default:
      return state;
  }
}

Я пытаюсь вызвать действие в моем файле app.js внутри useEffect.

export const TheItemModule = () => {
  const classes = useStyles();
  const [itemABC, setItemABC] = useState(false);

  const dispatch = useDispatch();
  const itemRedux = useSelector(state => state.dashboard.items)

  useEffect(() => {
    dispatch(checkItem);
    
    if (itemRedux) {
      // hope this is called after itemRedux trigered by checkItem
      // or some method for manipulated item
      // example:
      setItems(true) 
    }
  }, [checkItem]);

  render() {
    return (
      {itemABC && <div>Cek ABC & 123</div>}
    )
  }
}

Примечание. Этот пример упрощен из моего реального случая. Я надеюсь, что этот пример понятен.

Когда checkItem вызывается в useEffect, itemRedux в useEffect больше не срабатывает, поэтому состояние itemABC не обновляется. Может быть, кто-то может помочь мне дать представление. Большое спасибо.

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

Ответы 1

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

Действие отправки является асинхронным, поэтому селектор не имеет значения при запуске этого кода. Я думаю, вы могли бы создать новый useEffect, чтобы слушать изменения itemRedux, например:

export const TheItemModule = () => {
  const classes = useStyles();
  const [itemABC, setItemABC] = useState(false);

  const dispatch = useDispatch();
  const itemRedux = useSelector(state => state.dashboard.items)

  useEffect(() => {
    dispatch(checkItem);
  }, [checkItem]);

  useEffect(() => {
    if (itemRedux) {
      // hope this is called after itemRedux trigered by checkItem
      // or some method for manipulated item
      // example:
      setItems(true) 
    }
  }, [itemRedux])

  render() {
    return (
      {itemABC && <div>Cek ABC & 123</div>}
    )
  }
}

о, так решение простое. useEffect можно вызывать более одного раза. Спасибо, что сэкономили мое время.

Fitra Zul Fahmi 22.12.2020 12:57

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

Похожие вопросы

Как я могу сохранить все состояния компонента в одном массиве, а затем передать его родителю?
Как отфильтровать значение, точно равное заданному входу в реагирующей таблице?
Stepper реакции-окончательной формы (форма мастера) с использованием формы машинописного текста не отображается
Как я могу протестировать событие click, которое изменяет состояние useState с помощью фермента?
Не удается прочитать свойство «путь» неопределенного при загрузке изображения на внешний интерфейс (реагировать)
Реагировать. Запускать функцию внутри onChange, только если прошло N времени без onChange
Изменить класс в зависимости от ответа API
Ошибка: слишком много повторных рендеров. React ограничивает количество рендеров, чтобы предотвратить бесконечный цикл. Не удалось найти код, вызывающий это
Безопасно ли передавать JWT дочерним компонентам React?
Как защитить маршрут от пользователя до доступа без оплаты?