javascript - 为什么反应路由器中的默认行为不是“精确”的
问题描述
我真的很惊讶以前没有问过这个问题。这或者我以一种奇怪的方式问。
在 react router.. 中,我们这样做:
<BrowserRouter>
<Route path='/' component={Hello} />
<Route path='/there' component={There} />
</BrowserRouter>
这段代码显示了各种奇怪的行为,如果我去/there
,组件 Hello 仍然会被渲染。
解决方案是添加一个switch
组件并从最具体的部分重新排序 Route 组件。这似乎非常荒谬,尤其是作为来自后端背景的人。为什么我需要重新排序我的路线?另外,即使添加了开关,仍然存在奇怪的行为。例如,任何以/there
like开头的路线/there/was/a/time
仍然匹配
更好的最佳解决方案是exact
像这样放置 Route 组件:
<BrowserRouter>
<Route exact path='/' component={Hello} />
<Route exact path='/there' component={There} />
</BrowserRouter>
与任何其他正常框架一样,此行为提供正常的预期结果。转到website.com/there
或website.com/there/
呈现There
组件。去website.com
或website.com/
呈现Hello
我认为任何网站中的大多数路线都更适合exact
. 那么为什么不默认设置为 true 呢?如果他们愿意,允许人们将其设置为 falseexact={false}
吗?
有什么我想念的吗?我试图寻找这个问题,但没有找到答案。在他们刚刚提到的文档中,exact 的默认值为 false,没有任何进一步的解释
解决方案
这是因为react-router 的理念是成为“动态”路由器。你对 react-router 的期望通常是“静态”路由器的默认行为。
在 react-router 中,Route
组件只是检查 URL,如果匹配(URL 以 开头path
),那么它将渲染传递的组件。例如,当您想根据 URL 有条件地呈现页面的一部分时,它很有用。
使用Switch
组件是定义应用程序主要路由的正确方法,并且当您只需要基于 URL 呈现组件之一时(与switch
在 javascript 中相同)。但是为什么exact
prop 不是true
默认的呢?假设您有以下页面:
- 家: /
- X: /x
- XA:/x/a
- XB:/x/b
- 是:/是
- YC:/y/c
在这种情况下(这在大型应用程序中并不少见),您只需要在主组件中定义Home
、X
、 和Y
页面,而在X
和Y
组件中,您可以定义它们对应的子路由。
推荐阅读
- javascript - 当用户在 Bootstrap 4 中键入时检查输入字段的有效性
- javascript - 如何在 React 中处理输入类型 ='checkbox' 的签入?
- python-3.x - 代码“来自 simple_cdd.env 导入环境”这些包在哪里?
- c++11 - 采用 std::initializer_list 的函数
- wordpress - 从位于 CPT 的子字段中获取总数
- javascript - 如何制作平滑滚动效果但滚动停止在指定高度?
- pbs - 此 PBS 命令的 LSF 等效语法是什么?
- vue.js - fa 图标在 laravel 和 vue js 中被 svg 替换
- mysql - 外键约束上的 Laravel 迁移错误
- ios - NSAttributedString 文本打印出灰色而不是黑色?