【发布时间】:2020-06-07 07:09:51
【问题描述】:
我想在单击添加按钮时显示一个对话框。并且在单击隐藏按钮时不为会话显示它(使用会话存储)。
下面是我的代码,
function Parent() {
const DialogRequest = useDialogRequest();
const onAdd = () => {
DialogRequest(true);
}
render = () => {
return (
<button onClick={onAdd}>Add</button>
);
}
}
函数对话框(onHide){ 返回( {显示对话框? 隐藏:空 } ); }
const dialogRequestContext = React.createContext<ContextProps>({});
export const DialogRequestProvider = ({ children }: any) => {
const [showDialog,setShowDialog] = React.useState(false);
const onHide = () => {
setDialogOpen(false);
};
const setDialogOpen = (open: boolean) => {
if (open) {
const sessionDialogClosed = sessionStorage.getItem('dialog');
if (sessionDialogClosed !== 'closed') {
setShowDialog(open);
sessionStorage.setItem('dialog', 'closed');
}
} else {
setShowDialog(open);
}
};
return (
<DialogContext.Provider
value={{ setDialogOpen }}
>
{children}
<Dialog onHide={onHide}
showDialog={showDialog}
/>
</DialogContext.Provider>
);
};
export function useDialogRequest() {
const dialogRequestContext = React.useContext(
dialogRequestContext
);
return function DialogRequest(open: boolean) {
if (dialogRequestContext &&
dialogRequestContext.setDialogOpen
) {
dialogRequestContext.setDialogOpen(open);
}
};
}
此代码有效。但是当页面重新加载时,即使在页面重新加载之前未单击隐藏消息,对话框也不会再次打开。
我试图在页面重新加载后控制台记录对话框的值,如下所示。
if (open) {
const sessionDialogClosed = sessionStorage.getItem('dialog');
console.log('sessiondialogclosed', sessionDialogClosed); //this gives closed
if (sessionDialogClosed !== 'closed') {
setShowDialog(open);
sessionStorage.setItem('dialog', 'closed');
}
} else {
setShowDialog(open);
}
即使我在页面重新加载之前点击了隐藏按钮.....这给了我关闭会话存储项对话框的输出。
不确定这是否是它应该表现的方式。如果没有,有人可以帮我解决这个问题。
谢谢。
【问题讨论】:
-
useState中的值会在页面的整个生命周期内保持不变。它们不会在页面刷新时保留。如果你需要这样做,你可以考虑创建一个包装useState的钩子,它将值保存到localStorage,然后在页面加载时检索初始值? -
您能否提供一个示例来执行此操作。谢谢。
标签: javascript reactjs typescript