在处理一个项目时,我注意到useLocation
钩子的一个奇怪行为,我找不到解释。
我有一个按钮,当点击它时,它会将您重定向到EditOrder
页面,并传递一个状态:
const navigate = useNavigate();
const handleClick = (data) => {
navigate("edit-order", {state: {order: data}})
};
在EditOrder
页面中,我用UseEffect
挂钩检查是否提供了state
,如果没有,用户将被重定向到另一个页面:
const { state } = useLocation();
const navigate = useNavigate();
useEffect(() => {
if (!state) {
navigate("some-page");
}
}, []);
奇怪的是,当我刷新页面时,我仍然可以访问它,如果我console.log(state.order)
,数据仍然存在,即使我用ctrl + shift + r
重新加载,状态也保持不变,empty cache and hard reload option
也会发生这种情况(在chrome和edge中都尝试过(。
但当我复制URL并在新的选项卡中经过它时,我立即被重定向到";某页";并且CCD_ 9将显示CCD_。
我检查了Cookie和本地存储,但在那里找不到状态数据。
有人能解释为什么会发生这种情况,以及状态数据是如何保存的吗?
编辑:
这是一个展示这种行为的youtube视频。
视频上的代码可以在这个沙盒中找到,当你在沙盒上运行代码时,它会正常运行,刷新时所有状态都会重置,但当在本地运行时,会出现这个问题(在2台不同的计算机上(。
关于位置的数字回购。状态
BrowserHistory
。
一些浏览器,如Chrome,在会话之间保持BrowserHistory
状态,而另一些浏览器(如Firefox(则不这样做。
这可能就是为什么你在本地看到这种行为,而不是在沙盒中。CodeSandbox的浏览器似乎会在刷新时清除历史状态。这也是为什么,如果您将URL复制到另一个选项卡中,重定向会起作用。BrowserHistory
是单个选项卡的本地。
简而言之,这是有意为之的行为。您需要手动清除历史状态,或者将应用程序状态存储在其他位置(如果您希望在页面之间保持,但在刷新期间而不是,则useContext
可能是一个不错的选择(。