[React] Handle Deep Object Comparison in React's useEffect hook with the useRef Hook

When you smart component need to handle server request, it would be good to make sure it won't send multi same request to the backend. For example a search input component

 

The way to prevent it is by check whether the search query is the same as previous one. if it is then stop server request

 

The second argument to React's useEffect hook is an array of dependencies for your useEffect callback. When any value in that array changes, the effect callback is re-run. But the variables object we're passing to that array is created during render, so our effect will be re-run every render even if the shape of the object is the same. So let's solve this by doing our own equality check from within the effect callback and useEffect hooks..

 

复制代码
function Query({query, variables, normalize = data => data, children}) {
  const client = useContext(GitHub.Context)
  const [state, setState] = useReducer(
    (state, newState) => ({...state, ...newState}),
    {
      loaded: false,
      fetching: false,
      data: null,
      error: null,
    },
  )

  useEffect(() => {
    if (isEqual(previousInputs.current, [query, variables])) {
      return
    }
    setState({fetching: true})
    client
      .request(query, variables)
      .then(res =>
        setState({
          data: normalize(res),
          error: null,
          loaded: true,
          fetching: false,
        }),
      )
      .catch(error =>
        setState({
          error,
          data: null,
          loaded: false,
          fetching: false,
        }),
      )
  })

  const previousInputs = useRef()
  useEffect(() => {
    previousInputs.current = [query, variables]
  })

  return children(state)
}
复制代码

 

posted @   Zhentiw  阅读(406)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2019-04-29 [Algorithm] Calculate Pow(x,n) using recursion
2019-04-29 [Vuex] Use Namespaces in Vuex Stores using TypeScript
2019-04-29 [Algorithm] Fibonacci Sequence - Anatomy of recursion and space complexity analysis
2017-04-29 [Node.js] Test Node RESTful API with Mocha and Chai
2016-04-29 [Typescript] Introduction to Generics in Typescript
2015-04-29 [Whole Web, Node.js, PM2] Restarting your node.js app on code change using pm2
2015-04-29 [Whole Web, Node.js PM2] Loggin with PM2
点击右上角即可分享
微信分享提示