我想在 state
数组的末尾添加一个元素,这是正确的做法吗?
this.state.arrayvar.push(newelement);
this.setState({ arrayvar:this.state.arrayvar });
我担心使用 push
直接修改数组可能会有问题 - 这样做安全吗?
复制数组然后使用 setState
似乎很浪费资源。
我想在 state
数组的末尾添加一个元素,这是正确的做法吗?
this.state.arrayvar.push(newelement);
this.setState({ arrayvar:this.state.arrayvar });
我担心使用 push
直接修改数组可能会有问题 - 这样做安全吗?
复制数组然后使用 setState
似乎很浪费资源。
根据React文档所述:
把 this.state 视为不可变的。
使用 push
直接改变状态可能导致代码容易出错,即使之后进行“重置”状态也是如此。例如,这可能会导致某些生命周期方法(如 componentDidUpdate
)无法触发。
在较新的 React 版本中,推荐的方法是使用更新器函数来修改状态以防止竞态条件:
this.setState(prevState => ({
arrayvar: [...prevState.arrayvar, newelement]
}))
与使用非标准状态修改相比,内存“浪费”并不是一个问题。
早期React版本的替代语法
您可以使用concat
来获得简洁的语法,因为它会返回一个新数组:
this.setState({
arrayvar: this.state.arrayvar.concat([newelement])
})
this.setState({
arrayvar: [...this.state.arrayvar, newelement]
})
push
方法返回新数组的长度,因此不起作用。另外,setState
是异步的,React可以将多个状态更改排队到单个渲染过程中。 - David Hellsingthis.setState(state => ({ ...state, arrayvar: state.arrayvar.concat([newelement]) }));
- Christopher Campslet list = Array.from(this.state.list); list.push('woo'); this.setState({list});
当然,可以根据自己的风格偏好进行修改。 - basicdays如果你正在使用ES6
,那么这是最简单的方法。
initialArray = [1, 2, 3];
newArray = [ ...initialArray, 4 ]; // --> [1,2,3,4]
新的数组将为[1,2,3,4]
在 React 中更新您的状态
this.setState({
arrayvar:[...this.state.arrayvar, newelement]
});
使用 ES6
的最简单方法:
this.setState(prevState => ({
array: [...prevState.array, newElement]
}))
tableData = [['test','test']]
推入我的新数组之后,tableData = [['test','test'],['new','new']]
。
请问如何实现这个功能 @David 和 @Ridd? - Johncy[['test','test'],['new','new']]
请尝试:this.setState({ tableData: [...this.state.tableData, ['new', 'new']]
- Riddthis.setState({
tableData: [...this.state.tableData ,[item.student_name,item.homework_status_name,item.comments===null?'-':item.comments] ]
});
它将新数组插入两次
this.state.tableData.push([item.student_name,item.homework_status_name,item.comments===null?'-':item.comments]);
它实现了我想要的结果,但我认为这不是正确的方法。
- Johncy目前有很多人遇到更新useState钩子状态的问题。我使用这种方法来安全地更新它,并希望在这里分享。
这是我的状态
const [state, setState] = useState([])
假设我有一个名为obj1
的对象,我想将它追加到我的状态中。我建议这样做:
假设我有一个名为obj1
的对象,我想将其附加到我的状态中。我建议像这样做:
setState(prevState => [...prevState, obj1])
这将安全地在末尾插入对象,并保持状态的一致性。
setState((state) => ...
,请参见https://en.reactjs.org/docs/react-component.html#setstate - 状态更新不会立即发生,因此在使用原始状态变量时,某些更新可能会被新的更新覆盖。 - Marcin WojnarskiReact 可能会批量更新,因此正确的做法是提供一个执行更新的函数给 setState。
对于 React 更新插件,以下代码可以可靠地工作:
this.setState( state => update(state, {array: {$push: [4]}}) );
this.setState( state => ({
array: state.array.concat([4])
}));
class List extends React.Component {
constructor(props) {
super(props);
this.state = {
array: []
}
setTimeout(this.addSome, 500);
}
addSome = () => {
this.setState(
update(this.state, {array: {$push: ["First"]}}));
this.setState(
update(this.state, {array: {$push: ["Second"]}}));
this.setState(
update(this.state, {array: {$push: ["Third"]}}));
};
addSomeFixed = () => {
this.setState( state =>
update(state, {array: {$push: ["F"]}}));
this.setState( state =>
update(state, {array: {$push: ["S"]}}));
this.setState( state =>
update(state, {array: {$push: ["T"]}}));
};
render() {
const list = this.state.array.map((item, i) => {
return <li key={i}>{item}</li>
});
console.log(this.state);
return (
<div className='list'>
<button onClick={this.addSome}>add three</button>
<button onClick={this.addSomeFixed}>add three (fixed)</button>
<ul>
{list}
</ul>
</div>
);
}
};
ReactDOM.render(<List />, document.getElementById('app'));
this.setState( update(this.state, {array: {$push: ["First", "Second", "Third"]}}) )
- Albiziastate.array = state.array.concat([4])
这会改变先前的状态对象。 - Emile Bergeron如果您在React中使用函数式组件
const [cars, setCars] = useState([{
name: 'Audi',
type: 'sedan'
}, {
name: 'BMW',
type: 'sedan'
}])
...
const newCar = {
name: 'Benz',
type: 'sedan'
}
const updatedCarsArray = [...cars, newCar];
setCars(updatedCarsArray);
正如@nilgun在评论中提到的那样,您可以使用React immutability helpers。 我发现这个非常有用。
从文档中可以看到:
简单推入
var initialArray = [1, 2, 3];
var newArray = update(initialArray, {$push: [4]}); // => [1, 2, 3, 4]
initialArray 仍然是 [1, 2, 3]。
immutability-helper
表达了这个问题,并在这个方向上有很多想法和代码。 - Priya Ranjan Singhconst [chatHistory, setChatHistory] = useState([]); // define the state
const chatHistoryList = [...chatHistory, {'from':'me', 'message':e.target.value}]; // new array need to update
setChatHistory(chatHistoryList); // update the state
this.setState(preState=>({arrayvar:[...prevState.arrayvar,newelement]}))
const [data, setData] = useState([
{ id: 1, name: 'John', age: 16 },
{ id: 2, name: 'Jane', age: 22 },
{ id: 3, name: 'Josh', age: 21 }
]);
<Button
// pass the current state data to the handleAdd function so we can append to it.
onClick={() => handleAdd(data)}>
Add a row
</Button>
function handleAdd(currentData) {
// return last data array element
let lastDataObject = currentTableData[currentTableData.length - 1]
// assign last elements ID to a variable.
let lastID = Object.values(lastDataObject)[0]
// build a new element with a new ID based off the last element in the array
let newDataElement = {
id: lastID + 1,
name: 'Jill',
age: 55,
}
// build a new state object
const newStateData = [...currentData, newDataElement ]
// update the state
setData(newStateData);
// print newly updated state
for (const element of newStateData) {
console.log('New Data: ' + Object.values(element).join(', '))
}
}