如何正确使用 React `useCallback` 的依赖列表?

Yan*_*ang 4 web-frontend reactjs react-hooks usecallback use-effect

我有一个这样的例子:

代码和盒子

我想在回调中修改一个状态值,然后使用新的状态值修改另一个状态。

export default function App() {
  const [count, setCount] = useState(0);
  const [text, setText] = useState("0");
  const [added, setAdded] = useState(false);

  const aNotWorkingHandler = useCallback(
    e => {
      console.log("clicked");
      setCount(a => ++a);
      setText(count.toString());
    },
    [count, setCount, setText]
  );

  const btnRef = useRef(null);
  useEffect(() => {
    if (!added && btnRef.current) {
      btnRef.current.addEventListener("click", aNotWorkingHandler);
      setAdded(true);
    }
  }, [added, aNotWorkingHandler]);

return <button ref={btnRef}> + 1 </button>

Run Code Online (Sandbox Code Playgroud)

但是,在调用该处理程序后,count已成功增加,但text没有增加。

你们能帮我理解为什么会发生这种情况吗?以及如何干净地避免它?

谢谢你!

Nic*_*wer 6

如果countstate总是应该保持同步,只有一个是数字,一个是字符串,那么我认为有两个状态变量是错误的。相反,只拥有一个,并从中导出另一个值:

const [count, setCount] = useState(0);
const text = "" + count;
const [added, setAdded] = useState(false);

const aNotWorkingHandler = useCallback(
  e => {
    setCount(a => ++a);
  },
  []
);
Run Code Online (Sandbox Code Playgroud)

在上面的 useCallback 中,我有一个空的依赖项数组。这是因为回调中唯一使用的是 setCount。React 保证状态 setter 具有稳定的引用,因此 setCount 不可能更改,因此无需将其列为依赖项。

  • **React 保证状态设置器具有稳定的引用,因此 setCount 不可能更改。** 我只需要这句话以粗体文本显示,因为它正是我一直在寻找的内容。谢谢你! (6认同)