react native ListView中数据变了,但是ListView不刷新的解决方法

适用条件

  • ListView的数据类型是数组对象,对象的某些个属性需要用到界面的响应中,例如

{text: 'row', selected: true}


点击时selected = !selected,row的颜色根据selected进行变换。

解决方法

  • 相当残忍及吃内存的方式   
let newData = JSON.parse(JSON.stringify(dataSource._dataBlob.s1));
  •  利用Object.assign 
  • 使用Immutable.js 
  • 还有种绕远路的方式,就是在有数据的时候,多出来一个对象放dataSource的数据,在修改的时候修改那份,再直接cloneWithRows(修改之后的数据)


以下是我使用时候的具体介绍。

具体情景是,ListView每一行是一个选择器,点击该行,该行的数据取反,相应的选择器的状态也跟着变化。 我当时的数据类型大概是这样子的:

[ 
  	  {selected: false,}, 
  	  {selected: false,}, 
  	  {selected: false,},
   	  ... 
	]


简而言之就是数组对象。然后我每次点击的时候,大概做了这样子的事情:

let newData = dataSource._dataBlob.s1; 
newData[rowID].isSelected = !newData[rowID].isSelected;
this.setState({ 
  dataSource: this.state.dataSource.cloneWithRows(newData) 
})



 

再将newData 用cloneWithRows的方法setState到ListView的数据中。然后就出现问题了,数据虽然变化了,但是眼睛能看到的选择器的状态根本不变啊...就就尴尬了...

最后好好琢磨了一番,发现了问题的所在,rowHasChanged每次返回的都是false,都是false!! 就是rowHaschange接受到的前后的数据都是一样的!怎么可能是一样的!不是取反了吗 我又琢磨了一番。这次真的发现了问题的所在。

let newData = dataSource._dataBlob.s1;


这句话就是罪魁祸首 ! 这样的拷贝的话是浅拷贝,当改变newData的值 ,dataSource._dataBlob.s1也跟着在变。所以rowHaschange接收到的前后数据确实是一样的。但是数组中又是对象的情况,要达到深拷贝的话,最简单,最残忍的方法就是

	let newData = JSON.parse(JSON.stringify(dataSource._dataBlob.s1)); 

这是上面的第一种方式,第二种是Object.assign。

    let newData = dataSource._dataBlob.s1; 
	let _item = Object.assign({}, newData[rowID], {'isSelected': false}); 
	this.setState({ 
	  dataSource: this.state.dataSource.cloneWithRows(Object.assign({}, newData, {[rowID]: _item})),
 	}) 




===============================================~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

若有错误之处,还望指点。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
React Native ,可以使用 Crypto 模块来进行数据加密。具体步骤如下: 1. 安装 Crypto 模块 在终端运行以下命令: ``` npm install crypto-js ``` 2. 引入 Crypto 模块 在需要使用加密的文件,引入 Crypto 模块: ```javascript import CryptoJS from 'crypto-js'; ``` 3. 进行数据加密 使用 CryptoJS.AES 对象进行数据加密。例如,使用 AES-256-CBC 加密算法对数据进行加密: ```javascript const key = CryptoJS.enc.Utf8.parse('1234567890123456'); const iv = CryptoJS.enc.Utf8.parse('1234567890123456'); const data = '要加密的数据'; const encrypted = CryptoJS.AES.encrypt(data, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); const encryptedData = encrypted.toString(); ``` 其,key 和 iv 分别为加密密钥和初始向量,data 是要加密的数据。加密后的数据通过 encrypted.toString() 方法获取。 4. 进行数据解密 使用 CryptoJS.AES 对象进行数据解密。例如,使用 AES-256-CBC 加密算法对数据进行解密: ```javascript const key = CryptoJS.enc.Utf8.parse('1234567890123456'); const iv = CryptoJS.enc.Utf8.parse('1234567890123456'); const encryptedData = '加密后的数据'; const decrypted = CryptoJS.AES.decrypt(encryptedData, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); const decryptedData = decrypted.toString(CryptoJS.enc.Utf8); ``` 其,key 和 iv 分别为加密密钥和初始向量,encryptedData 是加密后的数据。解密后的数据通过 decrypted.toString(CryptoJS.enc.Utf8) 方法获取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值