React 18 最佳实践
在组件外部声明 CSS
不要在其他组件中声明组件
让子组件决定是否应该渲染
使用 useCallback 和 useMemo
- 使用 useCallback 防止函数重新创建
- 使用 useCallback 防止依赖项更改
- 使用 useCallback 防止 useEffect 触发
- 不要将外部函数包装在 useCallback 中
- 不要将 useMemo 与空依赖数组一起使用
useEffect 相关
- 当不需要依赖项时,向 useEffect 添加空依赖项
- 始终将所有依赖项添加到 useEffect 和其他 React Hooks
hooks
- 不要在 If 语句中使用 Hook
- return 后不使用 Hook
当组件不应重新渲染时,使用 useRef 而不是 useState
可以通过用 useRef 替换 useState 来优化组件渲染。来看下面的例子:
import { useEffect } from "react";
const Component = () => {
const [triggered, setTriggered] = useState(false);
useEffect(() => {
if (!triggered) {
setTriggered(true);
// …
}
}, [triggered]);
};当运行上面的代码时,组件将在调用 setTriggered 时重新渲染。在这种情况下,触发状态变量可能是确保 effect 仅运行一次的一种方法。
由于在这种情况下触发变量的唯一用途是跟踪函数是否已被触发,因此不需要组件渲染任何新状态。因此,可以将 useState 替换为 useRef,这样更新时就不会触发组件重新渲染。
import { useRef } from "react";
const Component = () => {
const triggeredRef = useRef(false);
useEffect(() => {
if (!triggeredRef.current) {
triggeredRef.current = true;
// …
}
}, []);
};当使用 useRef 时,React 将在组件卸载并再次安装时重置其值。在这种情况下,就可以要使用 useRef。