【发布时间】:2021-07-10 07:49:24
【问题描述】:
我有以下结构
=父组件(以列表作为状态)
== 子组合列表={list})
=== Sub Comp2 list={list}
==== 节点列表={list}
export const Node = (props) => {
// some state setup
const [checked, setChecked] = useState(false)
const handleCheckbox = () => {
if(!checked){
//Checkbox checked, add this Node to list in Parent Component
props.updateList(someLabel)
}
else{
props.removeFromList(someLabel)
}
}
return(
<TreeItem
icon = {<Checkbox checked={checked} onChange={handleCheckbox}}
>
{expanded && !fetching ? childNodes : <TreeItem label="reached end" />
</TreeItem>
)
}
现在这按我的预期工作,但问题是,如果我折叠并展开其中一个父节点,它是一个 TreeView,我会丢失选中的值。
为了解决这个问题,我提出了
useEffect(() => {
var inList = props.list.find(function(item) { return item.name === label} ) !=== undefined
if(inList){ setChecked(true)} else{setChecked(false)}
}, [])
现在上述工作按预期工作,但前提是我转到表单的下一页然后返回。问题是当列表更新时,useEffect 还在使用列表的旧状态。
如何强制 useEffect 使用最新的状态,或强制状态更新,因为它是异步的?
【问题讨论】:
-
第二个参数是
useEffect(fn, props)指定何时重新运行效果。在您的代码中,您有[]永远不会重新运行效果。您需要[props.list],因为当list更新时,您的效果需要重新运行
标签: javascript reactjs