Как получить доступ к новому состоянию useReducer внутри функции пользовательского хука - PullRequest
2 голосов
/ 25 февраля 2020

У меня есть пользовательский хук, использующий useReducer.

function useMyCustomHook() {
   const [state, dispatch] = useReducer(EntityReducer, initialState);

   // console.log(state); // 1- state is up to date here

   const customDispatch = (action) => {
       dispatch({ ...action }); // first call EntityReducer by action.type

       //2- I use state and dispatch here(for example:use state for call an api, then dispatch response)
       // but the state is previous not new state?

       switch (action.type) {
           case "something":
               // use dispatch and state here                     
               return state;
       }
   }

   return [state, customDispatch];
}

, использующий пользовательский хук:

function HomePage(props) {
    const [state, dispatch] = useMyCustomHook();

    // for example use dispatch on click a button

    return (<div>...</div>)
}

Проблема: state - это прежнее состояние внутри customDispatch. Как я могу это исправить?

Заранее спасибо.

1 Ответ

2 голосов
/ 27 марта 2020

Насколько я понял, ваше состояние устарело в реакционных хуках (захваченных замыканием).

Тогда у вас есть следующие решения:

1- useEffect с зависимостями

useEffect(() => {
 // state will be updated here
 // declare 'customDispatch' here
}, [state,...]);

2- useRef внутри useMyCustomHook как:

const [state, dispatch] = useReducer(EntityReducer, initialState);
const stateRef=useRef(state);

useEffect(() => {
        stateRef.current=state;
});

const customDispatch = (action) => {
// use state.current instead of state(state.current will be updated)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...