Javascript 为什么';t spread属性与React-useState挂钩一起工作
我正在使用useState钩子在功能组件中保持状态,并且希望在不必显式设置所有其他属性的情况下更新单个值,因此我认为使用spread操作符可以工作,但它不能 这是我的状态:Javascript 为什么';t spread属性与React-useState挂钩一起工作,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我正在使用useState钩子在功能组件中保持状态,并且希望在不必显式设置所有其他属性的情况下更新单个值,因此我认为使用spread操作符可以工作,但它不能 这是我的状态: const [state, setState] = useState({ data: [], currentIndex: 0, editMode: false }); 有人能解释为什么这不起作用 setState({ editMode: value, ...state }); …如果发生以下情况: setSt
const [state, setState] = useState({
data: [],
currentIndex: 0,
editMode: false
});
有人能解释为什么这不起作用
setState({ editMode: value, ...state });
…如果发生以下情况:
setState({ editMode: value, data: [], currentIndex: 0 });
有什么区别?我可以使用扩展运算符吗?还是我误解了什么
这里有一个例子来说明这个问题。只需颠倒顺序:
setState({ ...state, editMode: value });
否则,您将用旧值覆盖编辑模式的值。只需颠倒顺序:
setState({ ...state, editMode: value });
否则,您将使用旧值覆盖
editMode
的值。要使用useState
钩子更新对象,请使用以下函数语法:
setState(prevState => ({ ...prevState, editMode: value }));
要使用useState
钩子更新对象
,请使用以下函数语法:
setState(prevState => ({ ...prevState, editMode: value }));
一切都是为了订单。考虑以下几点:
const state={
数据:[],
当前索引:0,
编辑模式:false
};
常量值=真;
const result={editMode:value,…state};
const result2={editMode:value,数据:[],currentIndex:0};
constresult3={…状态,editMode:value};
控制台日志(结果);
console.log(result2);
console.log(result3)代码>都是关于订单的。考虑以下几点:
const state={
数据:[],
当前索引:0,
编辑模式:false
};
常量值=真;
const result={editMode:value,…state};
const result2={editMode:value,数据:[],currentIndex:0};
constresult3={…状态,editMode:value};
控制台日志(结果);
console.log(result2);
console.log(result3)代码>执行{editMode:value,…state}
相当于:
{ {
editMode: value,
data: [], data: [],
currentIndex: 0, -------> currentIndex: 0,
editMode: false editMode: false
} }
由于键不能在对象中重复,最后一个editMode
键值对将覆盖第一个,从而删除第一个editMode:value
。相反,你可以先传播:
{...state, editMode: value}
这将用新对象editMode
覆盖状态下的editMode
:
{ {
data: [], data: [],
currentIndex: 0, currentIndex: 0,
editMode: false, ------->
editMode: value, editMode: value,
} }
执行{editMode:value,…state}
相当于:
{ {
editMode: value,
data: [], data: [],
currentIndex: 0, -------> currentIndex: 0,
editMode: false editMode: false
} }
由于键不能在对象中重复,最后一个editMode
键值对将覆盖第一个,从而删除第一个editMode:value
。相反,你可以先传播:
{...state, editMode: value}
这将用新对象editMode
覆盖状态下的editMode
:
{ {
data: [], data: [],
currentIndex: 0, currentIndex: 0,
editMode: false, ------->
editMode: value, editMode: value,
} }