美好的一天!我有一个带有数组子级的嵌套状态,我想知道setState的正确和最佳方法。
这是一个示例状态对象。
已编辑,忘记了lists
是array of objects
。
this.state = {
lists:
[{
name: 'sampleList',
id: 15,
permission: {
canRead: true,
canWrite: false
}
}]
}
}
我使用它来设置权限属性的状态,但状态不会更新。
this.setState({
...this.state, lists: {
...this.state.lists, key: [
...this.state.lists.key, permission : {
...this.state.lists.key.permission,
canRead: !this.state.lists.key.permission.canRead
}
]
}
});
希望您能帮助我。谢谢!
答案 0 :(得分:2)
您可以创建lists
数组的副本,然后将要更改的索引的对象替换为同一对象的副本,但是要在其中更改permission
。
示例
class App extends React.Component {
state = {
lists: [
{
name: "sampleList",
id: 15,
permission: {
canRead: true,
canWrite: false
}
}
]
};
updateList = (index, canRead, canWrite) => {
this.setState(prevState => {
const lists = [...prevState.lists];
lists[index] = { ...lists[index], permission: { canRead, canWrite } };
return { lists };
});
};
render() {
return (
<div>
<button onClick={() => this.updateList(0, false, true)}>
Update state
</button>
<div>{JSON.stringify(this.state)}</div>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
答案 1 :(得分:1)
使用setState
更改数组的特定元素的方法是不更改而直接复制数组的所有项目,但目标项目除外,这可以使用.map
和{ {1}}语句:
if