【发布时间】:2021-04-17 11:09:15
【问题描述】:
我得到了一个反应功能组件:
const DataGrid = (props) =>
{
const [containerName, setContainerName] = useState("");
const [frameworkComponents, setFrameworkComponents] = useState(
{customLoadingOverlay: LoadingOverlayTemplate,
customNoRowsOverlay: UxDataGridCustomNoRows,
editButton: params => <ViewAndDeleteSetting {...params}
openAddConfigurationsWindow={openAddConfigurationsWindow}
onDeleteSetting={onDeleteSetting}/>,
});
useEffect(async () =>
{
if(props.containerName && props.containerName !== "")
{
setContainerName(props.containerName);
}
},[props.containerName]);
.
.
.
const onDeleteSetting = async (settingKey) =>
{
console.log("ON DELETE AND CONTAINER NAME:");
console.log(containerName); //HERE THE CONTAINER NAME IS EMPTY
...
}
return (
<UxDataGrid
frameworkComponents={frameworkComponents}/>
);
useEffect 中的容器名称存在且不为空。正如您在onDeleteSetting 的评论中看到的那样,调用此回调时,containerName 为空。我尝试在setContainerName 之后将此添加到useEffect:
setFrameworkComponents({customLoadingOverlay: LoadingOverlayTemplate,
customNoRowsOverlay: UxDataGridCustomNoRows,
editButton: params => <ViewAndDeleteSetting {...params}
openAddConfigurationsWindow={openAddConfigurationsWindow}
onDeleteSetting={onDeleteSetting}/>,
});
那没用。
如何在回调中获取名称?没有特别需要将 frameworkComponents 结构留在状态中。如果您认为它更好,它也可以移动到其他地方
【问题讨论】:
-
containerName在onDeleteSetting处理程序中为空,因为您的frameworkComponents变量仅在最初设置。即使你在调用setContainerName之后尝试设置它,React 的useState也会更新isn't immediate。如果你真的想做这样的事情,你可以添加另一个useEffect和containerName作为依赖并在其中调用setFrameworkComponents。但是您的整个代码结构看起来像是不好的做法,请尝试重构以避免在您的state中设置整个组件 -
@Kapobajza 你能用你建议的重构方式添加答案吗?
-
与过时关闭相关的问题,stackoverflow.com/questions/63307310/…,这可能会对您有所帮助。
标签: javascript reactjs closures ag-grid ag-grid-react