react useRef().current变化无法触发useffect更新原因

本文解释了useRef在React组件中的行为,强调它不会引起重新渲染,而useState的更新则会导致渲染。当在onClick事件中改变useRef的值,useEffect不会捕获变化,除非同时使用useState来触发渲染。
摘要由CSDN通过智能技术生成
首先我们要清楚的是:
  1. useRef返回的对象在整个生命周期中保持不变。
  2. useRef 只会在组件渲染的时候更新一次。
  3. 更新useRef().current的值,不会引起组件的重新渲染。
  4. 只有当useSate更新时,才会引起组件的重新渲染,useEffect才能监测到变化。
  5. 更新useRef的是副作用,一般写在useEffect或者事件处理方法里。
如果我们像下面这样写,useEffect里的内容是无法打印出来的。因为useRef().current并不会引起组件的重新渲染,从而useEffect也监测不到变化。
function DemoTest() {
  const refObj = useRef(0)
  
  useEffect(() => {
    console.log('refObj.current=>', refObj.current)
  }, [refObj.current])

  return <div onClick={() => {
    refObj.current = 1;
    console.log('点我了');
  }} style={{ cursor: 'pointer' }}>DemoTest</div>
}

打印结果如下:
在这里插入图片描述

但是如果我们加了一个useSate,结果就会不同了。
function DemoTest() {
  const refObj = useRef(0)
  const [stateValue, setStateValue] = useState('A')

  useEffect(() => {
    console.log('refObj.current=>', refObj.current)
  }, [refObj.current])

  return <div onClick={() => {
    refObj.current = 1;
    console.log('点我了');
    setStateValue('b')
  }} style={{ cursor: 'pointer' }}>DemoTest</div>
}
看!useEffect内的内容已经打印出来了。那是因为onClick里面更新setStateValue(‘b’)的值,引起了组件渲染,从而触发useEffect监测到页面变化。

在这里插入图片描述

因此,useRef不能随便用,要用对。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值