【问题标题】:React Router wildcard paths on root directory根目录上的 React Router 通配符路径
【发布时间】:2018-03-12 05:06:19
【问题描述】:

有没有可能像大多数社交媒体网站一样做类似的事情

somesite.com/username 但仍有某些路径,例如 /login 或 /settings

ReactDOM.render(
    <BrowserRouter>
        <div>
            <Route path="/:id - but not /login or /settings" component={User} />
            <Route path="/login" component={Login} />
            <Route path="/settings" component={Settings} />
        </div>
    </BrowserRouter>, document.getElementById('root')
);

建议使用exact

<BrowserRouter>
    <div>
        <Route path="/:id" component={User} />
        <Route exact path="/settings" component={Settings} />           

    </div>
</BrowserRouter>, document.getElementById('root')

const User = () => {    
    return (
        <h1>user</h1>
    )
}

const Settings = () => {    
    return (
        <h1>settings</h1>
    )
}

转到 /settings 会显示

用户

设置

【问题讨论】:

  • 解释更多你的要求
  • 我想以一种可以通过 somesite.com/sangram 或 somesite.com/totalnoob 访问用户配置文件的方式使用路由器,同时还允许用户使用 /settings 或 /login 访问其他组件

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


【解决方案1】:

是的,只需将不带变量的路径移到带变量的路径上方即可:

<Switch>
  <Route path="/login" component={Login} />
  <Route path="/settings" component={Settings} />
  <Route path="/:id" component={User} />
</Switch>

您需要这样做,因为 React Router 将匹配从第一个到最后一个的路由 - 如果您将带有 :id 的路由放在第一位,它将始终匹配。

这里使用 Switch 组件的目的是确保只有 first 匹配的路由会渲染它的组件。

【讨论】:

  • 当我尝试这样做时,用户组件的内容会显示在 /login 和 /settings 路由上
  • 我刚刚更新了答案 - 正如 Jan 所提到的,您可能需要设置 exact 属性...或者使用 Switch
  • exact 属性在这里不起作用,因为几乎任何没有/ 的字符串都将“完全”匹配模式"/:id"
【解决方案2】:

是的,通过使用exact 属性:

ReactDOM.render(
    <BrowserRouter>
        <div>
            <Route path="/:id" component={User} />
            <Route path="/login" exact={true} component={Login} />
            <Route path="/settings" exact={true} component={Settings} />
        </div>
    </BrowserRouter>, document.getElementById('root')
);

查看文档:https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Route.md#exact-bool

【讨论】:

猜你喜欢
  • 2018-09-29
  • 2021-03-29
  • 1970-01-01
  • 2019-09-05
  • 2018-05-09
  • 2022-07-21
  • 2011-11-09
  • 1970-01-01
  • 2011-04-13
相关资源
最近更新 更多