在React中,setState更新操作后没有更新state中的数据的问题。为什么setState后,没有更新到state中的值
-
问题描述:经常会看到这样一个问题,明明已经调用setState的方法了,但是state的值不改变,或者是数据改变了,但是没有重新渲染。找到了几个解决办法,记录一下。
-
思路一、可能是setState(value)中的value值的引用地址与state的一样
就比如最常用遇到的,对象或者数组的更新操作可能失败(最常遇到) 可能是这样的:**
const [a,seta] = useState<number[]>([])
()=>{const b = a;b.push(1);seta(b)}
以上代码的结果,肯定是a变量是不会改变的,可以用useEffect函数去监听一下useeffect(()=>{console.log(a)},[a])
原因很简单,就是因为
b=a,这是种浅拷贝方式,而且push只是往数组里添加元素并返回长度,所以在react看来,b和a没有区别,就不会导致更新操作。
所以一般正确的办法是:使用扩展运算符,所以就是: seta([…b])
[…b]这是一个新的数组,然后扩展b数组的元素到新数组,引用地址已经不一样了
所以总结:善用…扩展运算符
如果这还不行,那就使用函数式的setState,也就是会把setState中的函数的返回值作为最新的state去更新,而且在函数式中,可以从参数获取到最新的state的值
也就是还可以这样: seta(value=>[…value,1]) 这是最保险的方式了
-
思路二、可能调用这个set方法的onClick点击事件,被父元素的点击事件给覆盖了,而父组件也有set方法,这可能就会导致覆盖掉了子元素的set事件
就像是这样的问题,如果父子元素的点击事件都有更新state的操作,就会导致其中之一的更新state失败
最好的办法就是让他的另一个子元素来操控父元素的点击事件