问题记录-记一次 react hooks 闭包陷阱

发布于 2022-01-07
2 分钟

出现闭包陷阱的场景

  • 函数里面更新 state 同时使用了 state
    const [val, setVal] = useState(0)
    const fn0 = () => {
      saveLatestVal(val)
    }
    const fn1 = () => {
      setVal(1)
      fn0()
    }
  • 有异步,多次变更复杂 state 时
const handleClick = async (key) => {
	setLoadingMap({ ...loadingMap, [key]: true });
	await delay(3000);
	setLoadingMap({ ...loadingMap, [key]: false });
};

解决方案

  • 使用 useRef,ref 具有穿透性
  • 用 useEffect,例如在嵌套函数里变更另一个 state,在 useEffect 里执行 saveLatestVal
    const [val, setVal] = useState(0)
    const [version, setVersion] = useState(0)
    const fn0 = () => {
      setVersion(1)
    }
    const fn1 = () => {
      setVal(1)
      fn0()
    }
    useEffect(() => saveLatestVal(val), [version])
  • 使用 useReducer,分离 state,对异步,多次变更复杂 state 时
const handleClick = async (key) =>
	dispatch({ [key]: true });
	await delay(3000);
	dispatch({ [key]: false });
};

本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!