React Router中history对象可变的含义及示例代码逻辑疑问
React Router 相关问题解答
1、「history 对象是可变的」的具体含义
这里的可变指的是 React Router 全局维护的是同一个 history 实例,路由变化时不会生成新的 history 对象,而是直接修改原有实例上的 location、pathname 等属性值。所有组件拿到的 history 引用都指向同一个内存地址的对象,这个对象的内部属性会随路由变化动态更新。
2、示例代码的比较符号不需要替换为 ===
文档里的写法完全符合逻辑,替换反而会出错,原因如下:
- 正确写法中,
<Route>传递的props.location是不可变值,每次路由变化都会生成一个全新的 location 对象。当路由跳转后,this.props.location和prevProps.location是内存地址不同的两个对象,用!==比较返回true,正好可以正确判断「路由位置发生了变化」,符合代码的预期目标。 - 错误写法中,由于 history 是可变的,路由变化时只会修改同一个 history 实例的内部属性,不会替换实例本身。因此
this.props.history和prevProps.history永远指向同一个对象,它们的location属性也永远指向同一个内存地址,不管路由是否跳转,this.props.history.location !== prevProps.history.location永远返回false,根本无法判断路由变化,这正是文档要强调的错误用法。
内容的提问来源于stack exchange,提问作者Mitanshu
相关产品推荐
相关产品推荐

