useLocation挂钩即使在硬刷新时也能保持状态



在处理一个项目时,我注意到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台不同的计算机上(。

关于位置的数字回购。状态

React的useLocation基于历史库,该历史库在web应用程序中使用BrowserHistory

一些浏览器,如Chrome,在会话之间保持BrowserHistory状态,而另一些浏览器(如Firefox(则不这样做。

这可能就是为什么你在本地看到这种行为,而不是在沙盒中。CodeSandbox的浏览器似乎会在刷新时清除历史状态。这也是为什么,如果您将URL复制到另一个选项卡中,重定向会起作用。BrowserHistory是单个选项卡的本地。

简而言之,这是有意为之的行为。您需要手动清除历史状态,或者将应用程序状态存储在其他位置(如果您希望在页面之间保持,但在刷新期间而不是,则useContext可能是一个不错的选择(。

最新更新