我有一个状态数组,让我们说这个.state.arr。 我想在这个状态属性中添加一些内容,然后再更改一些属性。
选项1
onChange(event){
this.state.arr.push('newvalue');
...
this.setState({some:'val',arr:this.state.arr})
}
选项2
onChange(event){
var newArr = this.state.arr;
...
newArr.push('newvalue');
...
this.setState({some:'val',arr:newArr})
}
所以..我知道this.state应该被视为不可变的。但是可以像在选项1中那样使用它,我仍然从中设置状态,或者我需要使用类似选项2的东西,因此总是首先在内存中复制
答案 0 :(得分:58)
目前,这是最好的方法。
globals [timer]
答案 1 :(得分:55)
您提供的两个选项都是相同的。它们都仍指向内存中的同一对象并具有相同的数组值。您应该将状态对象视为不可变,但是您需要重新创建数组,使其指向新对象,设置新项,然后重置状态。例如:
onChange(event){
var newArray = this.state.arr.slice();
newArray.push("new value");
this.setState({arr:newArray})
}
答案 2 :(得分:33)
如果您使用的是ES6语法,则可以使用spread operator将新项目作为单行添加到现有阵列中。
// Append an array
const newArr = [1,2,3,4]
this.setState({ arr: [...this.state.arr, ...newArr] });
// Append a single item
this.setState({ arr: [...this.state.arr, 'new item'] });
答案 3 :(得分:16)
使用concat的另一种简单方法:
this.setState({
arr: this.state.arr.concat('new value')
})
答案 4 :(得分:2)
onChange() {
const { arr } = this.state;
let tempArr = [...arr];
tempArr.push('newvalue');
this.setState({
arr: tempArr
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
答案 5 :(得分:1)
最好的一天。
this.setState({ myArr: [...this.state.myArr, new_value] })
答案 6 :(得分:0)
如果你想继续向我一直在使用的数组中添加一个新对象:
_methodName = (para1, para2) => {
this.setState({
arr: this.state.arr.concat({para1, para2})
})
}
答案 7 :(得分:0)
handleValueChange = (value) => {
let myArr= [...this.state.myArr]
myArr.push(value)
this.setState({
myArr
})
这可以完成工作。
答案 8 :(得分:0)
这可能不会直接回答您的问题,但是是为了解决类似以下情况的情况
state = {
currentstate:[
{
id: 1 ,
firstname: 'zinani',
sex: 'male'
}
]
}
解决方案
const new_value = {
id: 2 ,
firstname: 'san',
sex: 'male'
}
用新值替换当前状态
this.setState({ currentState: [...this.state.currentState, new_array] })
答案 9 :(得分:0)
用于带有挂钩的功能组件
const [searches, setSearches] = useState([]);
// Using .concat(), no wrapper function (not recommended)
setSearches(searches.concat(query));
// Using .concat(), wrapper function (recommended)
setSearches(searches => searches.concat(query));
// Spread operator, no wrapper function (not recommended)
setSearches([...searches, query]);
// Spread operator, wrapper function (recommended)
setSearches(searches => [...searches, query]);
来源:https://medium.com/javascript-in-plain-english/how-to-add-to-an-array-in-react-state-3d08ddb2e1dc
答案 10 :(得分:0)
使用 Hook 的捷径:
const [value, setValue] = React.useState([]);
setValue([...value,newvalue]);