? ? 在項目中,經(jīng)常要使用ListView實(shí)現(xiàn)列表功能,有的場景是需要動態(tài)刷新ListView的界面。作為小白的我,就想著通過改變數(shù)據(jù)源來修改界面,但是數(shù)據(jù)修改了,界面不刷新。

通過state保存

第一次賦值

listview關(guān)聯(lián)數(shù)據(jù)源

修改數(shù)組中的某個數(shù)據(jù)
? ? 事與愿違,界面沒刷新。度娘的結(jié)果:const dataTemp = datas 的操作,實(shí)現(xiàn)的是淺拷貝,dataTemp的數(shù)據(jù)的改變,同步到了datas。因?yàn)檫@兩個變量的在內(nèi)存中的引用地址一致。因此rowHasChanged函數(shù)未觸發(fā),界面不刷新。
為了觸發(fā)rowHasChanged函數(shù),我們需要對datas進(jìn)行深拷貝,在內(nèi)存中新建一個對象,并引用。深拷貝的方式:const dataTemp =JSON.parse(JSON.stringify(datas))。然后給更新state:this.setState({DataSource :this.state.DataSource.cloneWithRows(dataTemp),})。
? ? 到此,界面實(shí)現(xiàn)了刷新。講這么多,其實(shí)關(guān)鍵點(diǎn)就是:淺拷貝、深拷貝的知識點(diǎn)。淺拷貝內(nèi)存中的指向一致,深拷貝內(nèi)存中的指向不一致。