javascript - 使用 React(本地存储)仅显示一次 Popup
问题描述
我想用 React Hooks 只显示一次弹出窗口。
- 首次访问
example.com/campaign/1234
- 显示弹出窗口
- 关闭或刷新页面。
- 再次访问
example.com/campaign/1234
并且不显示弹出窗口 - 第一次访问
example.com/campaign/0000
(是不同的 URL) - 显示弹出窗口
- 关闭或刷新页面
- 再次访问
example.com/campaign/0000
orexample.com/campaign/1234
并且没有显示弹出窗口
知道怎么做吗?我知道我需要使用local storage
,但是当用户关闭或刷新页面时如何触发事件?
这是一个沙盒。
我也读过这个线程,但它没有提到如何使用 Hooks
解决方案
如果您从不使用setStickyState
自定义挂钩的回调,则状态将保持在其初始值。
它似乎setStickyState
也有一个错误,如果密钥已更改,它将不会更新。这是我称之为的增强版本useLocalStorage
,它应该更可靠地工作:
export function useLocalStorage(key, initialDefault) {
const [val, setVal] = useState(() => {
const localStorageVal = localStorage.getItem(key);
return localStorageVal !== null
? JSON.parse(localStorageVal)
: initialDefault;
});
useEffect(() => {
if (localStorage.getItem(key) === null) {
setVal(initialDefault);
}
}, [key, initialDefault]);
useEffect(() => {
localStorage.setItem(key, JSON.stringify(val));
}, [val, key]);
return [val, setVal];
}
然后你可以像这样使用它:
const [visited, setVisited] = useLocalStorage(pageId, false);
const navigateAway = useCallback(() => {
setVisited(true)
}, [setVisited])
useEffect(() => {
// if user navigates away to a completely different site
// or refreshes the page etc
window.addEventListener("beforeunload", navigateAway);
// if user navigates to another page on the same site
return () => {
navigateAway();
window.removeEventListener("beforeunload", navigateAway);
};
}, [pageId, navigateAway]);
// ...
<dialog open={!visited}>
<p>Welcome to page {pageId}!</p>
<button onClick={() => setVisited(true)}>
Don't show again on this page
</button>
</dialog>
这是一个演示(使用 TypeScript):
推荐阅读
- c# - 如何在不修剪和不滚动条的情况下按比例缩放项目控制项目?
- amazon-web-services - 使用排序键插入表时需要对查询结果进行排序?
- html - 在过渡完成之前,我的过渡的时间部分没有过去
- app-store-connect - 已弃用的 API 用法 Apple
- c++ - c ++不存在从“std :: string”到“const char *”的合适转换函数
- python - 我没有得到其他输出
- permissions - 是否可以向非 Google 管理的电子邮件地址授予对 Google Cloud Storage 存储桶中对象的访问权限?
- c# - Entity Framework SQLQuery Oracle specified method is not supported
- c++ - How to initialize string in Class in c++ (g++ )
- r - 在 Rstudio Cloud 中安装 mxnet 包