映射状态更改时组件不更新
Component not updating when mapped state changes
状态图不会在状态更改时立即更新,只会在 dom 其他操作后更新。
最初声明的状态:
const [actions, setActions] = useState({});
用于添加到状态的函数:
const addAction = function(action, value){
let actionObject = actions;
let array = [];
array.push({action: action, value:value});
actionObject[selected.id] = array;
setActions(actionObject);
}
渲染中 dom 的状态输出:
{
actions[selected.id] ? (
actions[selected.id].map((a,i) =>
<Flex key={i}>
<Text>{a.action}</Text>
<TextBox value={a.value}></TextBox>
</Flex>)
) : ('')
}
我有一个按钮,当我点击它时会调用函数 addAction。它应该添加 'action'。 Actions state 是一个具有 id 的对象,这些 id 将具有 action 及其值 ie
{
id0567: [{
action: 'click link',
value: 'example.com'
}]
}
一切似乎都工作正常,但是当我单击按钮并调用 addAction 时,它并没有加载到 dom(在 'Flex' 元素中)我必须单击其他东西然后返回加载。
这里的问题是直接分配状态,这违背了反应的做事方式。
使用 useState() 时如下:
const [actions, setActions] = useState({});
任何时候你想更新对象,你应该先制作一个可变副本(let actionObject = {...actions}
),对对象进行更改,然后使用 setState() 更新 in-state 版本对象的。
let actionObject = {...actions};
let array = [];
array.push({action: action, value:value});
actionObject[selected.id] = array;
setActions(actionObject);
状态图不会在状态更改时立即更新,只会在 dom 其他操作后更新。
最初声明的状态:
const [actions, setActions] = useState({});
用于添加到状态的函数:
const addAction = function(action, value){
let actionObject = actions;
let array = [];
array.push({action: action, value:value});
actionObject[selected.id] = array;
setActions(actionObject);
}
渲染中 dom 的状态输出:
{
actions[selected.id] ? (
actions[selected.id].map((a,i) =>
<Flex key={i}>
<Text>{a.action}</Text>
<TextBox value={a.value}></TextBox>
</Flex>)
) : ('')
}
我有一个按钮,当我点击它时会调用函数 addAction。它应该添加 'action'。 Actions state 是一个具有 id 的对象,这些 id 将具有 action 及其值 ie
{
id0567: [{
action: 'click link',
value: 'example.com'
}]
}
一切似乎都工作正常,但是当我单击按钮并调用 addAction 时,它并没有加载到 dom(在 'Flex' 元素中)我必须单击其他东西然后返回加载。
这里的问题是直接分配状态,这违背了反应的做事方式。
使用 useState() 时如下:
const [actions, setActions] = useState({});
任何时候你想更新对象,你应该先制作一个可变副本(let actionObject = {...actions}
),对对象进行更改,然后使用 setState() 更新 in-state 版本对象的。
let actionObject = {...actions};
let array = [];
array.push({action: action, value:value});
actionObject[selected.id] = array;
setActions(actionObject);