- 背景:在 React 组件中,每一次 UI 的变化,都是通过重新执行整个函数来完成的,并没有一个直接的方式,在多次渲染之间维持一个状态。
// 但是因为定义是在函数组件内部,因此在多次渲染之间,是无法重用 handleIncrement 这个函数的,而是每次都需要创建一个新的:
function Counter() {
const [count, setCount] = useState(0);
const handleIncrement = () => setCount(count + 1);
// ...
return <button onClick={handleIncrement}>+</button>
}
- 造成的问题:
即使 count 没有发生变化,但是函数组件其它状态发生变化而重新渲染时,都会重新创建一个 handleIncrement,不仅增加了系统开销,同时让 button 组件误以为 handleIncrement 而重新执行渲染
- 如何调整:
import React, { useState, useCallback } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const handleIncrement = useCallback(
() => setCount(count + 1),
[count], // 只有当 count 发生变化时,才会重新创建回调函数
);
// ...
return <button onClick={handleIncrement}>+</button>
}