Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';t spread属性与React-useState挂钩一起工作_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 为什么';t spread属性与React-useState挂钩一起工作

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

我正在使用useState钩子在功能组件中保持状态,并且希望在不必显式设置所有其他属性的情况下更新单个值,因此我认为使用spread操作符可以工作,但它不能

这是我的状态:

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,
}                                   }