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中的一个重要概念