如何在 React 中卸载时保存到自定义挂钩中的上下文?

问题描述 投票:0回答:1

我有以下简化的自定义挂钩:

function useSpecialState(defaultValue, key) {
  const { stateStore, setStateStore } = useContext(StateStoreContext);

  const [state, setState] = useState(
    stateStore[key] !== undefined ? stateStore[key] : defaultValue
  );

  const stateRef = useRef(state);

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

  useEffect(() => {
    return () => {
      setStateStore((prevStateStore) => ({
        ...prevStateStore,
        [key]: stateRef.current,
      }));
    };
  }, []);

  return [state, setState];
}

目标是在卸载时保存到上下文,但是此代码不起作用。

感谢您的阅读!

reactjs hook react-context react-custom-hooks
1个回答
0
投票

要解决这个问题,您可以使用 deps 数组来指定即使状态没有改变也应该调用 useEffect 钩子。 deps 数组应包含 useEffect 挂钩所依赖的变量。在这种情况下,useEffect 挂钩取决于状态变量。因此,您可以像这样更新 useEffect 挂钩:

function useSpecialState(defaultValue, key) {
  const { stateStore, setStateStore } = useContext(StateStoreContext);

  const [state, setState] = useState(
    stateStore[key] !== undefined ? stateStore[key] : defaultValue
  );

  const stateRef = useRef(state);

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

  useEffect(() => {
    return () => {
      setStateStore((prevStateStore) => ({
        ...prevStateStore,
        [key]: stateRef.current,
      }));
    };
  }, [state]);

  return [state, setState];
}
© www.soinside.com 2019 - 2024. All rights reserved.