981377660LMT / ts

ts学习
6 stars 1 forks source link

useImperativeHandle 防止被闭包 #440

Open 981377660LMT opened 7 months ago

981377660LMT commented 7 months ago
981377660LMT commented 7 months ago

解法1:使用 useStatefulRef (非常安全)

function useStatefulRef<T> (initialValue: T): [React.MutableRefObject<T>, (newValue: T) => void] {
  const valueRef = useRef(initialValue);
  const [, setState] = useState(initialValue);
  const setStateWithoutClosure = (newValue: T) => {
    valueRef.current = newValue;
    setState(newValue);
  };
  return [valueRef, setStateWithoutClosure];
}
981377660LMT commented 7 months ago

解法2:将函数传递给setState来解决闭包问题 (有局限性)

this.setState((prevState) => {
  return {counter: prevState.counter + 1};
});

传递了一个函数给setState,这个函数接收前一个状态prevState作为参数,并返回一个新的状态。这样,我们就可以确保每次都是基于最新的状态进行更新,避免了闭包问题。

但是,需要注意的是,这种方法只能解决状态更新的闭包问题,对于其他类型的闭包问题(如在useEffect或setTimeout中捕获旧的props或state值),还需要其他的解决方法,如使用useRef。