React中setState页面不刷新怎么回事,如何处理
Admin 2022-07-11 群英技术资讯 828 次浏览
const [textList, setTextList] = useState(原数组); setTextList(新数组);
当修改原数组时,如果原数组是个深层数组(不只一层),使用setTextList修改时,不会触发页面刷新
这个涉及到可变对象he不可变对象的知识,在vue和react中,如果更新可变对象时,可能会引起视图更新,这是因为,vue和react默认都是浅监听,只会监听数据的第一层,内层数据发生改变,并不会监听到。
这里我的解决方案是,先将原数组深拷贝,赋值给新数组,再修改新数组,将修改后的新数组传递进去,这样就会引起视图更新。
var lists = textList.concat(); lists.splice(index, 1); setTextList(lists);
当使用react,写如图组件时,发现一个很关键的问题,当选择用class写的时候,很容易通过组件更新渲染。
当我决定用函数式组件hooks来重构我的组件的时候,发现了一个很难搞的问题,当我通过onChange去改变父组件value的时候,value的值改了,竟然没有重新渲染组件????
一脸懵逼的我,于是试图将class组件时先将value设为空再赋值-----失败了
于是试图通过钩子的生命周期看了一遍。。。。------失败了
还是百度吧------发现了同样的问题。。。发现用只要再后面加slice()
于是本着先解决问题的态度,将图中红圈位置改为了onChange(value.slice())
-----于是,解决了这个神奇的问题。
现在问题解决了,回过头来看看到底怎么回事。。。
查看文档发现一句话useState里数据务必为immutable (不可赋值的对象)
也就是ass component的state也提倡使用immutable数据,但不是强制的,因为只要调用了setState就会触发更新。所以再class组件中没有出现这种问题,或者通过改变为空再赋值是可以触发更新的。
但是再使用useState时,如果在更新函数里传入同一个对象时将无法触发更新。
于是解决思路就是通过slice() 返回一个新的对象去赋值是解决问题的关键。。。。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
用JS怎样做点击复制文本的功能?点击按钮实现复制文本的功能还是比较实用的,例如下本实现的复制邀请码的功能,此外点击复制文本的应用场景还有很多。感兴趣的朋友可以参考下文实例,接下来我们就一起来了解看看。
yield关键字只能用于生成器函数,它表示暂停函数内部代码的执行,并返回当前迭代数据。如果没有下一个yield,next返回对象的done将被放置为true。
目录vuex-persistedstate将vuex本地存储使用场景Vuex-persistedstateAPIvuex的本地存储vuex是什么vuex中的五大核心当然vuex的本地存储还有一种方式vuex-persistedstate将vuex本地存储使用场景最近在做Vue项目中的登录模块,登陆成功后获取到token
使用typescript类型实现ThreeSum 目录 前言 思路整理 实现TwoSum 实现减法 元祖中是否包含差值 递归元组 测试 实现ThreeSum 实现排序 实现ThreeSum 测试 前言 本文执行环境typescript,版本4.7.4 不使用typescript的计算能力,通过类型来实现ThreeSum 思路整理 实现ThreeSum之前我们先降低下难度,实现TwoSum,因为TwoSum可以作为ThreeSum的基础泛型 TwoSum需要准备什么呢? 递归元组,模拟for循环 减法,递归过程中求出差值 对每一项差值判断是否存在
1、安装socket.ionpminstallsocket.io2、创建服务端代码server.jsvarapp=require('http').createServer(handler),io=require('socket.io').listen(app),fs=require('fs')app.listen(8080);io.set
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008