7

当触发导航到路由的动作时,动作会触发一个新状态,该状态router.location.pathname根据浏览器的history.

另一个属性也发生了变化:router.location.key, 为一个新的随机字符串。

两种状态之间的差异,显示键如何随路径名变化。

即使路径名本身没有改变(从页面本身单击指向页面的链接),key仍然会更新。

两种状态之间的差异,显示只有键是如何变化的。

key财产的目的是什么?在哪些情况下,我希望我自己的状态key在非常动作调度时随机生成更新?为什么它不是一个简单递增的数字?

4

3 回答 3

8

connected-react-router简单地存储位置对象,然后使用历史react-router创建位置对象。在属性的自述文件中描述:historykey

位置也可能具有以下属性:

location.key - 表示此位置的唯一字符串(在 createBrowserHistory 和 createMemoryHistory 中支持)

它在内部使用(例如,在https://github.com/ReactTraining/history/blob/master/modules/createBrowserHistory.js中查找当前历史堆栈中的位置)并且应该被视为react-router. 我怀疑随机键而不是递增的序列号只是实现唯一 ID 的最简单方法(您不必存储当前序列号)。

于 2018-11-11T14:06:05.120 回答
1

当再次访问时,这会导致当前路线不必要的重新渲染,因为道具发生了变化。解决此问题的一种方法是使用React.memo, 并比较location.path保持不变的。但是,如果您的组件收到其他道具,则必须小心,因此将它们包括在比较中。

于 2021-09-04T14:09:10.627 回答
0

来自React Router 文档

每个位置都有一个唯一的密钥。这对于基于位置的滚动管理、客户端数据缓存等高级案例很有用。因为每个新位置都有一个唯一的键,所以您可以构建将信息存储在普通对象、new Map() 甚至 locationStorage 中的抽象。

于 2022-01-28T12:50:57.000 回答