reactjs - 我如何使用 React 上下文来准确地获取路由器,并且只在我需要的地方?
问题描述
我已经建立了一个最小的例子来展示这个问题。简而言之,如果我想在组件中使用路由器,例如因为它Route
嵌套在其中,那么我需要使用withRouter
, 通过该组件的每个祖先来钻取路由器道具,即使这些祖先不使用路由器自己。
我认为它与问题 #6072有关,但它被标记为已修复。我已经阅读了 react-router 中的“处理更新阻塞”文档。
为什么这是必要的?这意味着我需要保守地添加withRouter
到每个组件,因为通常我无法预测哪些组件会有需要路由器的后代。我认为 React 中的上下文是为了让我摆脱这种情况,这样我就可以在需要的地方准确地拉出路由器,而在中间的任何地方都忘记它。有没有办法做到这一点?
解决方案
我相信你正在打这个:
重要提示:withRouter 不会像 React Redux 的 connect 那样订阅位置更改来进行状态更改。相反,在位置更改从组件传播出去之后重新渲染。这意味着 withRouter 不会在路由转换时重新渲染,除非其父组件重新渲染。如果您使用 withRouter 来防止更新被 shouldComponentUpdate 阻止,那么 withRouter 包装实现 shouldComponentUpdate 的组件很重要。
来自:https ://reacttraining.com/react-router/web/api/withRouter
所以:如果您不将“IgnoreRouter”组件设置为observer
. 我在你的密码箱里试过了。
// from this:
let IgnoresRouter = observer(() => (
<div>
<h1>IgnoresRouter</h1>
<UsesRouter />
</div>
));
// to this:
let IgnoresRouter = () => (
<div>
<h1>IgnoresRouter</h1>
<UsesRouter />
</div>
);
原因:作为观察者,ignoresRouter 组件没有“依赖”或要观察的值,这意味着:它不会重新渲染。
mobx-react.observer
将为您实现 shouldComponentUpdate 。(这就是为什么使用 mobx 更容易获得更好的性能)。但现在它正在和你对抗。
如果您删除观察者,它将重新渲染,因为mobx-react
不再控制渲染(shouldComponentUpdate)。因此,参考文档的引用,现在父级 (ignoreRouter) 正在重新渲染,因此子级正在重新渲染withRouter
。
现在,由于您使用 mobx,您可能想退后一步,阅读mobx 作者的这篇优秀文章,并可能将 react-router 替换为可以说更好的东西。人们已经根据这些原则构建了路由器:https ://github.com/nareshbhatia/mobx-state-router
我真的无法判断它是否“很棒”,因为我自己没有使用过mobx-state-router
,但是我根据相同的原理制作了自己的自定义解决方案,所以最后,它与 mobx-state-router 非常相似,它就像一个魅力。
推荐阅读
- php - 将文本添加到标签元素搜索栏 Wordpress
- javascript - 需要帮助了解闭包
- php - 用于显示 id 大于 4 的每个类别的最大视图的 sql 代码
- angular - 使用 FormControlName 作为选择器聚焦
- sql-server - 查找列值链 - 跟进
- ios - 更改时间后奇怪的NSDate
- mongodb - 多个 orOperator 的条件查询抛出限制错误
- ios - 如何在一个手势期间禁用/启用 UITableView 中的滚动(iOS - Swift)
- python - SQLAlchemy 引擎结果代理错误(Flask Python)
- c# - 根据另一列中包含的文本保存数据