使用React的新效果挂钩,我可以告诉React,如果在重新渲染之间某些值没有更改,则可以跳过应用效果——React文档中的示例:

useEffect(() => {
  document.title = `You clicked ${count} times`;
}, [count]); // Only re-run the effect if count changes

但上面的示例在初始渲染和后续重新渲染时应用效果,其中count已更改.如何判断React是否跳过初始渲染的效果?

推荐答案

正如指南所说,

效果挂钩useEffect增加了从功能组件执行副作用的能力.它的用途与React类中的componentDidMount、componentDidUpdate和componentWillUnmount相同,但统一为一个API.

在本指南中的示例中,预期count仅在初始渲染时为0:

const [count, setCount] = useState(0);

因此,它将作为componentDidUpdate加上额外的判断:

useEffect(() => {
  if (count)
    document.title = `You clicked ${count} times`;
}, [count]);

这就是可以代替useEffect的定制钩子的基本工作原理:

function useDidUpdateEffect(fn, inputs) {
  const didMountRef = useRef(false);

  useEffect(() => {
    if (didMountRef.current) { 
      return fn();
    }
    didMountRef.current = true;
  }, inputs);
}

由于@Tholle建议useRef而不是setState,因此获得了奖励.

Reactjs相关问答推荐

在迁移到Redux—Toolkit 2.0和Redux5.0之后,我在extraReducer和Slice方面有点挣扎,

NextJS(AppRouter)、Apollo(客户端),在根布局中使用ApolloProvider时出错

useTranslation不会在languageChanged上重新呈现组件

利用OVERPASS API端点计算某建筑的表面积

值在返回页面时不更新,即使我已经更新了它们

无法在主组件的返回语句中呈现预期组件

在每页上应用字体-NextJS

折叠并重新打开react 手风琴将重置内部状态

svg每条路径上的波浪动画

点击页脚链接时,如何更改ReactJS导航栏中的活动菜单项(样式为Tailwind CSS)?

Chart.js如何go 除边框

useEffect 和 ReactStrictMode

我无法通过 useContext 显示值

在 golang 服务器中刷新或直接 url 路径时响应 404

React设置上下文并进行导航

如何在 ChartJS 中操作 Y 轴

RTK 查询Mutations 在 StrictMode 中执行两次

我刚刚部署了我的 Vite React 站点,但我的图标/图像没有部署

Cypress ,重试不再附加到 DOM 的元素

如何在按钮左下角制作 Material UI 菜单下拉菜单