Использование состояния после отправки - PullRequest
0 голосов
/ 03 октября 2019

Мне нужно иметь возможность предварительно выполнить действие сразу после того, как я обновлю свое состояние useReducer с отправкой. Но диспетчеризация выполняется асинхронно, поэтому, когда я запускаю свой следующий фрагмент кода, он использует старое состояние, прежде чем диспетчер должен был обновить его.

Я пытался использовать useEffect (() => {}, [состояние]), но это просто работает каждый раз, когда состояние обновлений. Мне нужно выполнить определенные действия в зависимости от условий ... не только каждый раз, когда обновляется состояние.

// Let's update some stuff on the server with new data!
  const handleFinishOrder = () => {

    dispatch({ type: "finish-order", payload: id }); // Set some fields to null

    socket.emit("request-update-live-data", state); // Old state gets sent to server :(
  };

Я ожидаю, что состояние будет обновлено, когда я отправлю его на сервер, но фактическое состояние, которое получитотправлено это старое состояние.

1 Ответ

0 голосов
/ 03 октября 2019

dispatch обрабатывается асинхронно, и API не предоставляет никакого способа выполнения фрагмента кода после выполнения dispatch.

На самом деле, он специально предупреждает, если вы пытаетесь передать функцию обратного вызова в dispatch:

Предупреждение: обновления состояния из useState () и useReducer () Hooks don 'Поддерживает второй аргумент обратного вызова. Чтобы выполнить побочный эффект после рендеринга, объявите его в теле компонента с помощью useEffect ().

Итак, вы должны сделать socket.emit в useEffect с соответствующим списком зависимостей.

В качестве альтернативы, вы можете сделать это в функции редуктора для определенного типа действия.

...