使用HashRouter时,在使用useLocation的组件中,window.location对象和location对象与useLocation之间存在差异.

在我写这篇文章的时候,我注意到可能会对useLocation实际指向的东西感到困惑.从useLocation开始的pathname似乎实际上是没有#window.location.hash.但hash似乎根本没有指向任何东西.

老实说,我不确定我是否应该把这个问题发布在react 路由Github上,但我想在这里发布这篇文章,以防我遗漏了一些关于useLocation应该如何工作的基本信息(更重要的是关于你使用的路由).

当你把useLocation包装在<BrowserRouter><HashRouter><MemoryRouter>等等中时,它的表现会不同吗?

window.location开始的值:

{
  pathname: "/myPage/"
  hash: "#/testpath/123"
  search: ""
}

location = useLocation()开始的值:

{
  pathname: "/testpath/123"
  hash: ""
  search: ""
  key: "abc123"
  state: null
}

推荐答案

当使用HashRouter时,以及在使用useLocation的组件中, window.location对象和window.location对象之间存在差异 useLocation个对象中的location个.

当我写这篇文章时,我注意到周围可能有一个困惑 useLocation实际指向的是什么.从pathname开始 useLocation似乎实际上是window.location.hash个没有 第#号.但哈希似乎根本没有指向任何东西.

HashRouter路由使用在URL的101哈希之后定义的路径.

例如,给定:

  • 路由:<Route path="/testpath/123" element={....} />
  • 网址:"https://..../#/testpath/123"

useLocation挂钩返回的location可能如下所示:

{
    "pathname": "/testpath/123",
    "search": "",
    "hash": "",
    "state": null,
    "key": "ff78cgdt"
}

window.location相比

{
    "ancestorOrigins": {
        "0": "https://...."
    },
    "href": "https://..../#/testpath/123",
    "origin": "https://....",
    "protocol": "https:",
    "host": "....",
    "hostname": "....",
    "port": "",
    "pathname": "/",
    "search": "",
    "hash": "#/testpath/123"
}

鉴于:

  • 同样的路由:<Route path="/testpath/123" element={....} />
  • 网址:"https://..../#/testpath/123#foo"

然后,location对象将如下所示:

{
    "pathname": "/testpath/123",
    "search": "",
    "hash": "#foo",
    "state": null,
    "key": "r7bfxju4"
}
{
    "ancestorOrigins": {
        "0": "https://...."
    },
    "href": "https://..../#/testpath/123#foo",
    "origin": "https://....",
    "protocol": "https:",
    "host": "....",
    "hostname": "....",
    "port": "",
    "pathname": "/",
    "search": "",
    "hash": "#/testpath/123#foo"
}

请注意,现在唯一的区别是"foo"现在是location对象的一部分,location对象是应用程序路由使用的路由路径的"散列".它也包含在window.location的散列中,例如first散列之后的所有内容.

当你把useLocation包起来时,它的表现会不同吗? <BrowserRouter><HashRouter><MemoryRouter>,等等?

还没呢.这些路由都管理和/或维护它们自己的内部历史对象和状态,例如location在每个上下文中是什么.BrowserRouter将内部路由/导航动作耦合到浏览器的DOM,并且类似地,HashRouter使用104实际上是静态位置的内容的散列,例如,从服务器上的特定目录托管/提供的apply.MemoryRouter旨在用于非DOM环境,例如Jest测试等Node环境.

根据您使用的路由以及URL路径/etc值的不同,location个属性中的一些可能没有设置,但useLocation钩子和location对象基本上是相同的.

我认为这里没有错误或问题,因为考虑到您使用的HashRouter和控制台日志(log)记录,您描述的一切似乎都是合理的行为.

Javascript相关问答推荐

成帧器运动中的运动组件为何以收件箱开始?

如何使用侧边滚动按钮具体滚动每4个格?

格式值未保存在redux持久切片中

Rehype将hashtag呈现为URL

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

setcallback是什么时候放到macrotask队列上的?

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

更新动态数据中对象或数组中的所有值字符串

确保函数签名中的类型安全:匹配值

如何在不影响隐式类型的情况下将类型分配给对象?

JavaScript是否有多个`unfined`?

如何在Node.js中排除导出的JS文件

当我在Reaction中创建一个输入列表时,我的输入行为异常

Reaction组件在本应被设置隐藏时仍显示

Reaction Redux&Quot;在派单错误中检测到状态Mutations

在不删除代码的情况下禁用Java弹出功能WordPress

FireBase FiRestore安全规则-嵌套对象的MapDiff

使用可配置项目创建网格

在将元素追加到DOM之前,createElement()是否会触发回流?混淆abt DocumentFragment行为