在 React 状态下更新数组中的对象
Update an Object in an Array in React State
在 React 状态下更新数组中的对象:
- 使用该
map()
方法遍历数组。 - 在每次迭代中,检查是否满足特定条件。
- 更新满足条件的对象并按原样返回所有其他对象。
应用程序.js
import {useState} from 'react'; const App = () => { const initialState = [ {id: 1, country: 'Austria'}, {id: 2, country: 'Belgium'}, {id: 3, country: 'Canada'}, ]; const [data, setData] = useState(initialState); const updateState = () => { const newState = data.map(obj => { // 👇️ if id equals 2, update country property if (obj.id === 2) { return {...obj, country: 'Denmark'}; } // 👇️ otherwise return object as is return obj; }); setData(newState); }; return ( <div> <button onClick={updateState}>Update state</button> {data.map(obj => { return ( <div key={obj.id}> <h2>id: {obj.id}</h2> <h2>country: {obj.country}</h2> <hr /> </div> ); })} </div> ); }; export default App;
我们传递给
Array.map
方法的函数被数组中的每个元素(对象)调用。
无论我们从传递给map()
方法的函数返回什么,都会插入到新数组中。
该
map()
方法不会改变原始数组,它会返回一个新数组。在每次迭代中,我们检查对象是否具有id
等于 的属性2
。
如果是,我们使用
扩展运算符 (…)
解压缩对象的其他键值对,然后覆盖该
country
属性。
如果不满足条件,我们将按原样返回对象。
在 React 应用程序中不要直接改变状态是非常重要的。当我们专门使用该
setState
方法来更新组件的状态时,React 可以更轻松地跟踪更改并仅重新呈现必要的内容。当我单击按钮时,状态数组中的第二个对象得到更新。
您还可以将一个函数传递给setState
我们从
useState挂钩中获取的方法。
该函数以当前状态调用,可用于更新状态数组中的特定对象。
应用程序.js
import {useState} from 'react'; const App = () => { const initialState = [ {id: 1, country: 'Austria'}, {id: 2, country: 'Belgium'}, {id: 3, country: 'Canada'}, ]; const [data, setData] = useState(initialState); const updateState = () => { // 👇️ passing function to setData method setData(prevState => { const newState = prevState.map(obj => { // 👇️ if id equals 2, update country property if (obj.id === 2) { return {...obj, country: 'Denmark'}; } // 👇️ otherwise return object as is return obj; }); return newState; }); }; return ( <div> <button onClick={updateState}>Update state</button> {data.map(obj => { return ( <div key={obj.id}> <h2>id: {obj.id}</h2> <h2>country: {obj.country}</h2> <hr /> </div> ); })} </div> ); }; export default App;
代码示例实现了相同的结果。
但是,这次我们直接将函数传递给setData
方法。该函数以当前状态调用,我们可以使用它来计算下一个状态。
无论我们从回调函数返回什么,都会被设置为新状态。