在项目中,经常要使用ListView实现列表功能,有的场景是需要动态刷新ListView的界面。作为小白的我,就想着通过改变数据源来修改界面,但是数据修改了,界面不刷新。
通过state保存 第一次赋值 listview关联数据源 修改数组中的某个数据事与愿违,界面没刷新。度娘的结果:const dataTemp = datas 的操作,实现的是浅拷贝,dataTemp的数据的改变,同步到了datas。因为这两个变量的在内存中的引用地址一致。因此rowHasChanged函数未触发,界面不刷新。
为了触发rowHasChanged函数,我们需要对datas进行深拷贝,在内存中新建一个对象,并引用。深拷贝的方式:const dataTemp =JSON.parse(JSON.stringify(datas))。然后给更新state:this.setState({DataSource :this.state.DataSource.cloneWithRows(dataTemp),})。
到此,界面实现了刷新。讲这么多,其实关键点就是:浅拷贝、深拷贝的知识点。浅拷贝内存中的指向一致,深拷贝内存中的指向不一致。
网友评论