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

2024-01-22

在做一个项目时,我注意到一个奇怪的行为useLocation我找不到解释的钩子。

我有一个按钮,单击它会将您重定向到EditOrder页面并将传递一个状态:

const navigate = useNavigate();

const handleClick = (data) => {
    navigate("edit-order", {state: {order: data}})
};

In the 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 并将其粘贴到新选项卡中时,我立即被重定向到“某个页面” 和console.log(state)将会呈现null.

我检查了 cookie 和本地存储,但找不到状态数据。

有人可以解释为什么会发生这种情况以及状态数据是如何保存的吗?

Edit:

这里有一个Youtube 视频 https://www.youtube.com/watch?v=oBGyefJpIhY这表明了这种行为。

视频中的代码可以在这个沙箱 https://codesandbox.io/s/location-state-stay-on-hard-refresh-q6bjxn?file=/src/App.js,当您在沙盒上运行代码时,它会按预期运行,刷新时所有状态都会重置,但是在本地运行时会出现此问题(在两台不同的计算机上)。

关于 location.state 的 git 存储库 https://github.com/remix-run/history/blob/main/docs/api-reference.md#locationstate


反应使用位置is based https://reactrouter.com/docs/en/v6/api#location on the 历史图书馆 https://github.com/remix-run/history/blob/main/docs/api-reference.md#location,它使用BrowserHistory在网络应用程序中。

一些浏览器 https://github.com/remix-run/history/issues/557,像Chrome一样,坚持BrowserHistory会话之间的状态,而其他(如 Firefox)则不然。

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

简而言之,这是有意的行为。您需要手动清除历史状态或将应用程序状态存储在其他地方(useContext如果您想跨页面保留,这可能是一个不错的选择,但是not跨越刷新)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

useLocation 挂钩即使在硬刷新时也能保持状态 的相关文章

随机推荐

  • 如何在MEF中区分不同目录的优先级?

    我有一个 AggregateCatalog 其中包含 AssemblyCatalog 和 DirectoryCatalog 我希望他们像这样工作 如果两个目录都能找到导出 请从 DirectoryCatalog 中选择一个 如果它们都找不到
  • 在另一个元素上方/下方滚动时更改文本颜色?

    我不确定这种效果的正确术语是什么 我想说它是混合模式或剪切路径的东西 我想要做的是 当文本滚动到另一个元素上方 或下方 以使文本更改其颜色时 请参阅下面的示例图片 因此 默认情况下 文本是浅灰色的 然后当它滚动到灰色条下方 或上方 不确定应
  • ASP.NET MVC 中的约定有多大的可塑性?

    具体来说 控制器类名是否必须具有Controller后缀 如果您愿意 您可以在不破坏内容的情况下更改项目中的文件夹结构吗 是否还有其他可以被覆盖的约定 以及如何覆盖 只要您知道框架如何运作 大多数约定都是可塑的 让我们来讨论两个最大的约定
  • CosmosDB 中的索引数组

    为什么 CosmosDB 默认情况下不索引数组 默认索引路径是 path 这不是意味着 索引一切 吗 不是 索引除数组之外的所有内容 如果我将数组字段添加到索引中 如下所示 path tags 它将工作并开始索引该特定数组字段 但我的问题是
  • MySQL yyyy-mm-ddThh:mm:ss.sssZ 到 yyyy-mm-dd hh:mm:ss [重复]

    这个问题在这里已经有答案了 我想上传包含以下内容的 csv 文件yyyy mm ddThh mm ss sssZ data 当我设置DATETIME输入MySQL 我收到错误代码 1292 MySQL 如何上传yyyy mm ddThh m
  • 字符串如何存储在 VBA 字典结构中?

    因为我目前正在演奏大量的字符串 看看另一个问题 数组和Arraylist的VBA内存大小 https stackoverflow com questions 20526324 vba memory size of arrays and ar
  • “热门”哈希键在 Amazon DynamoDB 上的实践中会如何影响整个过程?

    首先 这是一个支持document http docs aws amazon com amazondynamodb latest developerguide GuidelinesForTables html为 DynamoDB 提供有关如
  • JSON.stringify 与序列化

    Is JSON stringify 相当于序列化或有效序列化 或者它只是实现序列化的必要步骤 序列化 换句话说 就是JSON stringify 对于序列化来说足够但不是必需的 或者是必要但不充分 或者说它对于 JavaScript 对象的
  • 单元测试:初学者问题

    我终于开始进行单元测试了 因为我知道我应该这样做一段时间 但我有几个问题 我应该或不应该重新测试父母 测试孩子们是否在课堂上 没有方法被覆盖 从概念上讲 您如何测试 提交了表格的一部分 我在用着 PHP Edit 我问这个问题的原因是我有一
  • C# 中用于关闭 Windows 窗体窗体的转义按钮

    我已经尝试过以下方法 private void Form1 KeyDown object sender System Windows Forms KeyEventArgs e if Keys e KeyValue Keys Escape t
  • 如何防止 jquery ajax 对数据参数上的某些字符进行编码?

    我正在使用 jquery ajax 从三方 Web 服务查询数据 问题是我需要传递冒号字符 作为数据的一部分 不对其进行编码 但 ajax 方法会自动对所有非字母字符进行编码 所以问题是如何防止 jquery ajax 对数据参数上的某些字
  • Numpy 赋值,如“numpy.take”

    是否可以按照 take 功能的工作方式分配给 numpy 数组 例如 如果我有一个数组a 索引列表inds和所需的轴 我可以使用 take 如下 import numpy as np a np arange 12 reshape 3 1 i
  • TypeScript 属性装饰器:访问其他属性

    我有一个这样的类点 class Point test admin x number 6 y number 5 使用测试装饰器 function test myValue string function t target Object pro
  • T-SQL 列表表、列

    在 T SQL SQL Server 2000 中 如何列出数据库中的所有表和列 此外 在单独的查询中 有一种方法可以列出所有列以及数据类型和约束 NULL 等 谢谢 请查看信息图式 http learn microsoft com en
  • 如何使用 Objective C 将应用程序分配到 Mac OS X Lion 的所有桌面(空间)?

    我正在尝试在 Mac OS X Lion 上创建一个应用程序 该应用程序需要将应用程序分配给所有桌面 空间 这可以通过右键单击应用程序的停靠栏图标并选择来手动完成选项 gt 分配到 gt 所有桌面 但是 我需要找到一种通过 Objectiv
  • Bootstrap(3.1.1) 字形在 Firefox 中不起作用

    我偶然发现了 Bootstrap Glyphicons 无法与 Firefox 配合使用但与其他浏览器配合正常工作的问题 Q How to make Glyphicons from Bootstrap 3 1 1 work with fir
  • 启用 GlassFish 压缩

    如何启用玻璃鱼压缩 我在 http lister 属性中启用了压缩 但没有改变回应 登录管理控制台 localhost 4848 前往Network Config gt Network Listener 选择要启用 gzip 的侦听器 gt
  • Arduino Nano 上的 WiFi

    我无法找到的虚拟问题 我用来将 WiFi 802 11b g n 添加到 Raspberry Pi 的扩展板也可以在 Nano 上使用吗 换句话说 向 Arduino Nano 板添加 WiFi 有多容易 可行 Thanks Arduino
  • 设置 xcode 项目的默认字体样式、颜色和大小

    我正在开发的应用程序有一个特定的配色方案 所以我想知道是否可以设置 默认 背景颜色 文本颜色和字体大小 以便每次我在界面中创建新视图或标签时Builder 我不必更改所有这些参数 从 iOS 5 开始 有UIAppearance所有标准 U
  • useLocation 挂钩即使在硬刷新时也能保持状态

    在做一个项目时 我注意到一个奇怪的行为useLocation我找不到解释的钩子 我有一个按钮 单击它会将您重定向到EditOrder页面并将传递一个状态 const navigate useNavigate const handleClic