Дождитесь обновления состояния с помощью перехватчика useState, а затем запустите код внутри функции

#javascript #reactjs #asynchronous #callback #use-state

#javascript #reactjs #асинхронный #обратный вызов #use-state

Вопрос:

 const startLive = () => {
    // connect to websocket only on start button
    
     setliveChartState({
      ...liveChartState,
      liveActive: !liveChartState.liveActive,
      historicLiveActive: true,
      start: new Date(),
    });

/*- - - -after updation - - - >*/
    const { ws, liveActive } = liveChartState;
    
    // if clicked on stop then close websocket
    if (!liveActive amp;amp; ws) {
      ws.close();
    clearLiveInterval();
    }
    // if clicked on  start and websocket close then connect
    if ((!ws || ws.readyState === WebSocket.CLOSED)amp;amp; liveActive) connect();
    fetchData("historic");
  };
  

Функция startlive вызывается при нажатии кнопки start… Эта функция используется для обновления состояния, а затем для выполнения кода, который появится позже, как уже упоминалось.

Но он запускается, когда setlivechartstate даже не завершил обновление.

Я не хочу использовать перехват Use effect, поскольку я просто хочу запускать код только при нажатии кнопки, поскольку он работает как start, так и stop, а также liveActive также изменяется в других функциях.. Таким образом, использование useEffect с этой зависимостью создало проблему

Каков наилучший способ заставить эту функцию работать и запускать код только после завершения обновления

Ответ №1:

Новое установленное значение состояния будет доступно только при следующем рендеринге. Я бы предложил использовать useeffect. Или вы могли бы вместо этого использовать useReducer. Это тоже сработало бы