useEffect

作者: LynnicKwan | 来源:发表于2019-06-25 23:37 被阅读0次

目标

  • 页面count会递增
  • console里面的数会递增
const App = () => {
  const [count, setCount] = useState(0)
  let load = false
  const onClick = () => {
    setCount(count + 1)
    console.log('----------------------', count)
  }
  useEffect(() => {
    window.addEventListener('click', onClick)
    return () => {
      window.removeEventListener('click', onClick)
    }
  }, [])
  return <div>{count}</div>
}

问题描述

  • 页面上的count只会改变一次,即从0变为1
  • console里的count则一直是0

原因分析

window.addEventListener中的函数引用一直缓存的是变量onClick第一次被赋的值, 所以count一直是0
这是因为useEffect没有设置依赖项,所以在组件渲染后就不会再发生改变

解决方案

每次Function Class因为setCount重新渲染的时候,变量onClick的值也发生变化。我们如果想使结果符合预期,就必须每次渲染后都为window绑定新的事件监听函数onClick,这个时候就要为useEffect设置依赖项,即count。这个依赖告诉useEffect,每次count状态发生改变的时候,都要执行回调,给window设置新的onClick函数

 useEffect(() => {
    window.addEventListener('click', onClick)
    // return 表示在下次页面更新发生之前,会销毁原来绑定的旧事件监听,这样不会造成内存泄漏
    return () => {
      window.removeEventListener('click', onClick)
    }
    // 添加依赖项
  }, [count])

使用场景

我们在使用监听scroll或resize的时候,会发现这个问题,
尤其是在做页面加载load more的时候。
代码

相关文章

  • 详解react useEffect 和 useLayoutEff

    useEffect 引用官方 使用 useEffect 完成副作用操作。赋值给 useEffect 的函数会在组件...

  • Hooks API

    useEffect useEffect的使用 参考上篇文章 执行时机: useEffect可以看做componen...

  • react hooks 之 useEffect

    useEffect useEffect 可以弥补函数组件没有生命周期的缺点。我们可以在useEffect第一个参数...

  • 从react源码分析useEffect与useLayoutEff

    本文将从useEffect的‘闪烁’问题切入,通过devtools并结合源码来分析useEffect与useLay...

  • useEffect

    目标 页面count会递增 console里面的数会递增 问题描述 页面上的count只会改变一次,即从0变为1 ...

  • useEffect

    副作用 对环境或全局变量的改变就是副作用,例如修改document.title,对自己state的改变不是副作用 ...

  • useEffect

    1. 基本使用 2. 存在依赖项 依赖项为一个空数组[]时只执行一次 只要有一个变化useEffect都会重复执行...

  • useEffect

    1.useEffect的特点1)有两个参数callback和dependencies数组;2)如果dependen...

  • useEffect

    useEffect的用法代替componentDidMount的方式,将useEffect的第二个参数传入空数组或...

  • useEffect

    使用useEffect完成副作用操作。赋值给useEffect的函数会在组件渲染到屏幕之后执行。 在函数组件主体内...

网友评论

      本文标题:useEffect

      本文链接:https://www.haomeiwen.com/subject/cgbfcctx.html