【发布时间】:2020-08-26 13:42:21
【问题描述】:
我有一个 View 和 Column 组件。我使用registerColumn 方法将列refs 存储在View 上下文中:
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 后立即使用更新的状态 - 使用 another useEffect 基本上意味着破坏执行上下文和需要延迟任务,加上可能引入其他回调只是为了得到围绕这个。
我是 React 的新手,但我很确定还有其他方法可以解决这个问题,因此我们将不胜感激。
【问题讨论】:
标签: javascript reactjs react-hooks state react-context