当触发导航到路由的动作时,动作会触发一个新状态,该状态router.location.pathname
根据浏览器的history
.
另一个属性也发生了变化:router.location.key
, 为一个新的随机字符串。
即使路径名本身没有改变(从页面本身单击指向页面的链接),key
仍然会更新。
key
财产的目的是什么?在哪些情况下,我希望我自己的状态key
在非常动作调度时随机生成更新?为什么它不是一个简单递增的数字?
当触发导航到路由的动作时,动作会触发一个新状态,该状态router.location.pathname
根据浏览器的history
.
另一个属性也发生了变化:router.location.key
, 为一个新的随机字符串。
即使路径名本身没有改变(从页面本身单击指向页面的链接),key
仍然会更新。
key
财产的目的是什么?在哪些情况下,我希望我自己的状态key
在非常动作调度时随机生成更新?为什么它不是一个简单递增的数字?
connected-react-router
简单地存储位置对象,然后使用历史包react-router
创建位置对象。在属性的自述文件中描述:history
key
位置也可能具有以下属性:
location.key - 表示此位置的唯一字符串(在 createBrowserHistory 和 createMemoryHistory 中支持)
它在内部使用(例如,在https://github.com/ReactTraining/history/blob/master/modules/createBrowserHistory.js中查找当前历史堆栈中的位置)并且应该被视为react-router
. 我怀疑随机键而不是递增的序列号只是实现唯一 ID 的最简单方法(您不必存储当前序列号)。
当再次访问时,这会导致当前路线不必要的重新渲染,因为道具发生了变化。解决此问题的一种方法是使用React.memo
, 并比较location.path
保持不变的。但是,如果您的组件收到其他道具,则必须小心,因此将它们包括在比较中。
每个位置都有一个唯一的密钥。这对于基于位置的滚动管理、客户端数据缓存等高级案例很有用。因为每个新位置都有一个唯一的键,所以您可以构建将信息存储在普通对象、new Map() 甚至 locationStorage 中的抽象。