深层次更新的关键是逐层重建而非解构,即复制路径上每一层结构,仅在目标位置替换新值;动态更新则结合展开运算符与计算属性名实现任意键的精准修改。

用展开运算符做深层次更新,关键不是“解构”,而是“逐层重建”——它不拆开对象取值,而是复制路径上每一层结构,只在目标位置替换新值。这种方式天然契合不可变更新要求,也避免了直接修改原数据引发的副作用。
更新嵌套对象中的单个字段
当状态是类似 { user: { profile: { name: 'Alice', age: 30 } } } 的结构,要改 profile.age,就得从外到内逐层展开:
- 先展开顶层对象,保留其他字段(如可能存在的
settings、token) - 再展开
user对象,保留user.id、user.email等未改动字段 - 接着展开
profile,最后只覆盖age
写法示例:
setUser(prev => ({prev,
user: {
prev.user,
profile: {
prev.user.profile,
age: 31
}
}
setConfig(prev => ({
prev,
config: {
prev.config,
features: [...prev.config.features, 'c']
}
setSections(prev => ({
prev,
['section-2']: {
...prev['section-2'],
fields: [...prev['section-2'].fields, newField]
}










