我有一个View
和Column
组件。我使用registerColumn
方法在View
上下文中存储列refs
:
const [columns, setColumns] = useState([]);
const registerColumn = (node) => {
const column = {
someUniqueId: Math.random(),
node,
// more props
};
setColumns(prev => [...prev, column])
}
const context = {
columns,
registerColumn
}
<ViewContext.Provider values={context}>
<View>
<Column/>
<Column/>
<Column/>
</View>
<View>
<Table/>
</View>
</ViewContext.Provider>
我真正困惑的是Column
组件。每当我尝试注册列并在之后获取更新的长度时,它都不会按时更新,因为setState
异步工作:
const {columns, registerColumn} = useContext(ViewContext);
const ref = useRef(null);
useEffect(() => {
registerColumn(ref.current);
// Here is where updated column length but it keeps saying it's 0 length
console.log(`Hello from column number ${columns.length}`);
}, []);
[...]
文档说,我可以使用useEffect
columns
作为依赖项,并在下次渲染时更新长度。但是,我需要在调用registerColumn
后立即使用更新的状态 - 使用另一种useEffect
基本上意味着破坏执行上下文和延迟任务的需要,并且可能引入其他回调只是为了解决这个问题。
我是 React 的新手,但我很确定还有其他可能性可以解决这个问题,所以任何帮助将不胜感激。
在useEffect中更新setState和在useEffect中更新控制台日志将不起作用,因为useState异步工作,并对所有状态进行批处理并更新一次。它正在更新状态,但它不会反映该状态,因为会批量更新。
您可以将其他 useEffect 与列的依赖关系一起使用,因此每次 registerColumn 更新时,都会调用第二个 useEffect 并控制台记录该值。
useEffect(() => {
registerColumn(ref.current);
}, []);
useEffect(() => {
console.log(`Hello from column number ${columns.length}`);
},[columns]);