【问题标题】:React Router v4 :param conflicting with 404React Router v4:参数与404冲突
【发布时间】:2017-07-06 09:26:00
【问题描述】:

我目前正试图围绕反应路由器。目前我正在尝试完成一个看起来像这样的路由器:

<BrowserRouter>
    <div>
        <Switch>
            <Route exact path="/" component={App} />
            <Route exact path="/:pageName" component={Page} />
            <Route component={NotFound}/>
        </Switch>
    </div>
</BrowserRouter>

这个想法是 Page 组件将使用 :pageName 来呈现正确的标题和内容。但是,如果 pageName 不存在,它应该呈现 notFound (404) 页面。

目前 404 页面永远不会呈现,因为所有 url 都与 Page 路由匹配。

检查 pageName 是否存在的常规方法是什么,并且仅在存在的情况下匹配 Page 组件?我应该动态设置,还是应该页面组件检查和重定向?我该怎么想?

【问题讨论】:

    标签: reactjs react-router react-router-v4


    【解决方案1】:

    如果您希望参数 pageName 位于特定的预定义值集中,我会将这些值中的每一个列为单独的路由:

    <BrowserRouter>
        <div>
            <Switch>
                <Route exact path="/" component={App} />
                <Route exact path="/page1" component={Page} />
                <Route exact path="/page2" component={Page} />
                <Route exact path="/pagexyz" component={Page} />
                <Route path="*" component={NotFound}/>
            </Switch>
        </div>
    </BrowserRouter>
    

    如果您坚持所有页面只有一个路由,根据这篇文章you can use regexp to specify path,您可以编写只接受您将拥有的页面名称并拒绝其他页面名称的正则表达式。

    如果一组现有页面未预定义但包含在数组中,我将使用 map 生成如下路线:

    pageNames.map((name) => (<Route exact path={'/'+name} component={Page} />
    

    【讨论】:

    • 但是如何访问 Page 组件中的 :pageName 参数呢?
    • 您仍然可以获得匹配属性,您可以从中获取路径或网址。您可能需要从中删除一两个字符。或者更好的是,您可以制作 Page1 、 Page2 、 .. 等派生自 Page 的组件,并在路由器中使用这些组件
    • 如果您发现我的答案不够清楚,请帮助我如何才能更清楚。如果您知道更好的方法,请将其作为新答案提供。
    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2018-02-28
    • 2018-04-10
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多