Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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 更新状态和渲染组件的正确方法是什么?_Javascript_Reactjs_React Hooks_State - Fatal编程技术网

Javascript 更新状态和渲染组件的正确方法是什么?

Javascript 更新状态和渲染组件的正确方法是什么?,javascript,reactjs,react-hooks,state,Javascript,Reactjs,React Hooks,State,我只是想知道为什么在某些情况下,状态不会导致渲染组件 此示例不渲染组件: const [items,setItems] = useState({ item_name:'', item_price:'', color:'' }) some_method = (new_item_name) => { items.item_name=new_item_name; setItems(items); } 这样做不对吗? const [is_rendered

我只是想知道为什么在某些情况下,状态不会导致渲染组件

此示例不渲染组件:

const [items,setItems] = useState({
    item_name:'',
    item_price:'',
    color:''
})

some_method = (new_item_name) => {
    items.item_name=new_item_name;
    setItems(items);
}
这样做不对吗?

const [is_rendered, set_is_rendered] = useState(false);

const [items,setItems] = useState({
    item_name:'',
    item_price:'',
    color:''
})

some_method = (new_item_name) => {

    items.item_name=new_item_name;
    setItems(items);

    set_is_rendered(!is_rendered);
}

因为布尔值总是呈现组件,所以我想在需要时创建一个新的
状态来呈现组件。

我认为最好不要触摸对象的原始状态。而是在新对象中复制和修改我们需要的属性,然后将其传递给
setState()
。正确的方法是使用回调版本的设置状态

请尝试以下操作:

setItems(prevState => ({
   ...prevState,
   item_name: 'the new value'
}));
因此,函数看起来像:

some_method = (new_item_name) => {
   setItems(prevState => ({
      ...prevState,
      item_name: new_item_name
   }));
}

我希望这有帮助

我认为最好不要触摸物体的原始状态。而是在新对象中复制和修改我们需要的属性,然后将其传递给
setState()
。正确的方法是使用回调版本的设置状态

请尝试以下操作:

setItems(prevState => ({
   ...prevState,
   item_name: 'the new value'
}));
因此,函数看起来像:

some_method = (new_item_name) => {
   setItems(prevState => ({
      ...prevState,
      item_name: new_item_name
   }));
}

我希望这有帮助

嗯,
property way
有点主观,因为这是不需要的,而且(依我看)比直接使用当前状态更详细。这很好,但请您详细解释一下好吗?@ArnaudClaudel我认为最好不要触摸对象的原始状态。而是在新对象中复制和修改我们需要的属性,然后将其传递给
setState()
。此外,问题中提供的代码并没有按照预期更新状态。公平地说,我对你的答案投了更高的票,因为它提供了更多的解释,现在对我来说更为合理。
正确的方式
有点主观,因为这是不需要的,而且(依我看)比直接使用当前状态更为冗长。这很好,但是,请你详细解释一下好吗?@ArnaudClaudel我认为最好不要触摸物体的原始状态。而是在新对象中复制和修改我们需要的属性,然后将其传递给
setState()
。此外,问题中提供的代码没有按预期更新状态。公平地说,我对您的答案投了更高的票,因为它提供了更多的解释,现在对我来说更为合理。React将根据状态的每次更改更新组件,因此渲染
是多余的,并且会导致组件渲染两次(第一次是因为您更改了
项目
,第二次是因为
已呈现
已更改。)我建议您添加一些日志并亲自尝试,以更好地理解这一点,因为这是ReactReact中的一个重要概念,它会在状态的每次更改时更新组件,因此渲染
是多余的,并且会导致组件渲染两次(第一次是因为您更改了
,第二次是因为
已呈现
已更改。)我建议您添加一些日志,自己尝试一下,以便更好地理解这一点,因为这是React中的一个重要概念