可能因为改变了系统node的版本,我重新npm了一个老项目的node_modules
addPortIconBtn(index) { this.state.machineListData[(this.state.current - 1) * 10 + index].iscreateport = true this.setState({ machineListData: this.state.machineListData }) }
这时我发现项目中类似这种改变数组某个值的写法,视图都不再更新,我确定数据是变化的,于是我尝试浅拷贝的写法
addPortIconBtn(index) { let arr = [...this.state.machineListData] arr[(this.state.current - 1) * 10 + index].iscreateport = true this.setState({ machineListData: arr }) }
这样依然不生效,于是我创建了最新版本的react脚手架,发现第一种写法也是可行,所以不知道到底哪里出了问题,视图是antd(4.15.2)的table,
<Table columns={this.state.columns} dataSource={this.state.machineListData} rowKey={(record) => record.dockerid}/>
react版本是16.13.1
你可以创建一个新数组,并把数组中的对象也进行浅拷贝,就行了
addPortIconBtn(index) { // 创建一个新数组,并将数组中的对象进行浅拷贝 let arr = this.state.machineListData.map((item) => ({ ...item })); // 更新指定索引处的对象属性 arr[(this.state.current - 1) * 10 + index].iscreateport = true; // 使用新数组更新 state this.setState({ machineListData: arr }); }
不要直接修改原对象
addPortIconBtn(index) { // 用 JSON.parse(JSON.stringify(xxx)) 拷贝一个新的对象 const arr = JSON.parse(JSON.stringify(this.state.machineListData)) arr[(this.state.current - 1) * 10 + index].iscreateport = true; this.setState({ machineListData: arr }); }
展开运算符只会拷贝第一层,也就是,你这里只拷贝了第一层对象,第二层对象的属性没有拷贝
let arr = [...this.state.machineListData]