反应清除所有键而不是浅合并单个键
React clearing all keys rather than shallow merging single key
我从 API 中提取数据,然后允许用户在 React 中修改该数据,之后我会将更新后的状态发送到服务器。
我的API提供以下JSON:
{
"id": 1,
"title": "Test Campaign",
"impressions": 12,
}
我的组件看起来像这样:
function Campaign() {
const [data, setData] = useState([])
useEffect(async () => {
const result = await axios('/campaigns/1')
setData(result.data);
}, []);
const handleChange = (event) => {
setData({[event.target.name]: event.target.value});
}
return (
<div className='row'>
<div className='col-12'>
<h2>{ data.title }</h2>
<input
type='number'
value={data.impressions}
name='impressions'
onChange={e => handleChange(e)}
/>
</div>
</div>
)
}
但是,运行 这段代码会导致 data
状态下的所有键被覆盖(因此我的 h2
标签什么都不显示)。据我了解,React State 进行了浅合并,因此在这种情况下只会更新 impressions
key:value?
功能组件的 useState
钩子实际上并没有浅合并状态更新,所以你需要自己管理它。
使用functional state update访问前一个状态浅拷贝到下一个状态。
Note
Unlike the setState
method found in class components, useState
does not automatically merge update objects. You can replicate this
behavior by combining the function updater form with object spread
syntax:
setState(prevState => {
// Object.assign would also work
return {...prevState, ...updatedValues};
});
您可能还想确保保持状态不变。由于您是通过键值对更新状态,因此我假设您 实际上 使用对象。
const [data, setData] = useState({}); // <-- empty object initial state
const handleChange = (event) => {
setData(data => ({
...data, // <-- shallow copy existing state
[event.target.name]: event.target.value,
}));
}
我从 API 中提取数据,然后允许用户在 React 中修改该数据,之后我会将更新后的状态发送到服务器。
我的API提供以下JSON:
{
"id": 1,
"title": "Test Campaign",
"impressions": 12,
}
我的组件看起来像这样:
function Campaign() {
const [data, setData] = useState([])
useEffect(async () => {
const result = await axios('/campaigns/1')
setData(result.data);
}, []);
const handleChange = (event) => {
setData({[event.target.name]: event.target.value});
}
return (
<div className='row'>
<div className='col-12'>
<h2>{ data.title }</h2>
<input
type='number'
value={data.impressions}
name='impressions'
onChange={e => handleChange(e)}
/>
</div>
</div>
)
}
但是,运行 这段代码会导致 data
状态下的所有键被覆盖(因此我的 h2
标签什么都不显示)。据我了解,React State 进行了浅合并,因此在这种情况下只会更新 impressions
key:value?
功能组件的 useState
钩子实际上并没有浅合并状态更新,所以你需要自己管理它。
使用functional state update访问前一个状态浅拷贝到下一个状态。
Note
Unlike the
setState
method found in class components,useState
does not automatically merge update objects. You can replicate this behavior by combining the function updater form with object spread syntax:setState(prevState => { // Object.assign would also work return {...prevState, ...updatedValues}; });
您可能还想确保保持状态不变。由于您是通过键值对更新状态,因此我假设您 实际上 使用对象。
const [data, setData] = useState({}); // <-- empty object initial state
const handleChange = (event) => {
setData(data => ({
...data, // <-- shallow copy existing state
[event.target.name]: event.target.value,
}));
}