【问题标题】:why isn't "exact" the default behaviour in react router为什么反应路由器中的默认行为不是“精确”的
【发布时间】:2018-11-27 10:29:43
【问题描述】:

我真的很惊讶以前没有问过这个问题。这个或者我在以一种奇怪的方式问。

在 react router.. 中我们这样做:

<BrowserRouter>
    <Route path='/' component={Hello} />
    <Route path='/there' component={There} />
</BrowserRouter>

这段代码显示了各种奇怪的行为,如果我去/there,组件 Hello 仍然会被渲染。

解决方案是添加一个switch 组件并从最具体的路由组件重新排序。这似乎非常荒谬,尤其是作为来自后端背景的人。为什么我需要重新排序我的路线? 另外,即使添加了开关,仍然存在奇怪的行为。例如,任何以/there 开头的路线(如/there/was/a/time)仍然匹配

更好的最佳解决方案是将exact 放在 Route 组件上,如下所示:

<BrowserRouter>
    <Route exact path='/' component={Hello} />
    <Route exact path='/there' component={There} />
</BrowserRouter>

这种行为提供了与任何其他正常框架一样的正常预期结果。转到website.com/therewebsite.com/there/ 会呈现There 组件。并转到website.comwebsite.com/ 呈现Hello

我认为任何网站中的大多数路由都更适合exact。那么为什么不默认设置为 true 呢?如果他们想喜欢exact={false},是否允许人们将其设置为false?

我有什么遗漏吗?我试图寻找这个问题,但没有找到答案。在他们刚刚提到的文档中,exact 的默认值是 false,没有任何进一步的解释

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    这是因为react-router's philosophy 是一个“动态”路由器。你对 react-router 的期望通常是“静态”路由器的默认行为。

    在 react-router 中,Route 组件只是检查 URL,如果匹配(URL 以 path 开头),那么它将渲染传递的组件。例如,当您想根据 URL 有条件地呈现页面的一部分时,它很有用。

    使用Switch 组件是定义应用程序主路由的正确方法,并且当您需要基于 URL 仅呈现其中一个组件时(与 javascript 中的 switch 相同)。但是为什么 exact 属性默认不是 true 呢?假设您有以下页面:

    • 首页:/
    • X: /x
      • XA:/x/a
      • XB:/x/b
    • 是:/是
      • YC:/y/c

    在这种情况下(这在大型应用程序中并不少见),您只需在主组件中以及 X 和 @987654332 上定义 HomeXY 页面@组件,可以定义它们对应的子路由。

    【讨论】:

    • 2018 年的问题
    • @Adam 一些用户仍在支持它,所以我认为它可能对某人有所帮助:)
    • 我讨厌默认行为的愚蠢选择,exact 不是默认行为绝对是愚蠢的。
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多