从reach/router切换到react-router时,如何设置basename?

Posted

技术标签:

【中文标题】从reach/router切换到react-router时,如何设置basename?【英文标题】:When switching from reach/router to react-router, how do you set basename? 【发布时间】:2022-01-23 01:18:32 【问题描述】:

我正在从reach/router 迁移到react-router v6,我有一组这样的路由

<Router basename=appPath>
  <Dashboard path="/" />
  <DashboardMessages path="messages"/>
  <DashboardTasks path="tasks" />
  <AboutPage path="about" />
</Router>

但是在 v6 的 react-router 的新样式中,它看起来像:

<Routes>
  <Route path="/" element=<Dashboard />>
    <Route
      path="messages"
      element=<DashboardMessages />
    />
    <Route path="tasks" element=<DashboardTasks /> />
  </Route>
  <Route path="about" element=<AboutPage /> />
</Routes>

但路线不采用基本名称。我该如何设置?


更新:在文档中它说:

"该道具可用于制作所有路线和链接 在您的应用程序中,相对于他们的 URL 路径名的“基本”部分 所有股。 "

但如果你这样做:

<Router basename=appPath>
 <Routes>
  <Route path="/" element=<Dashboard />>
    <Route
      path="messages"
      element=<DashboardMessages />
    />
    <Route path="tasks" element=<DashboardTasks /> />
  </Route>
  <Route path="about" element=<AboutPage /> />
 </Routes>
<Router>

Typescript 抱怨说:

 Type ' children: Element; basename: string; ' is missing the following properties from type 'RouterProps': location, navigator

我猜我可以从 useLocation() 获取位置,但似乎没有办法获取导航器。

【问题讨论】:

我没有遇到与您相同的错误。你能提供一个可重现的例子吗? @TheTisiboth 你在尝试react-router-dom v6 吗?检查文档中的Router 接口/类型声明,locationnavigator 是必需的道具。 是的,看这里:codesandbox.io/s/keen-danilo-956mz?file=/src/index.js 啊,我明白了,我没有使用路由器组件,而是使用 BrowserRouter,我猜这就是混乱的来源 【参考方案1】:

使用管理导航上下文的高级路由器之一。

BrowserRouter HashRouter NativeRouter MemoryRouter

例子:

import  BrowswerRouter as Router, Routes, Route  from 'react-router-dom';

<Router basename=appPath>
 <Routes>
  <Route path="/" element=<Dashboard />>
    <Route
      path="messages"
      element=<DashboardMessages />
    />
    <Route path="tasks" element=<DashboardTasks /> />
  </Route>
  <Route path="about" element=<AboutPage /> />
 </Routes>
<Router>

Router 是所有其他路由器共享的低级接口。

【讨论】:

以上是关于从reach/router切换到react-router时,如何设置basename?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用到达路由器的多个反应悬念回退?

使用反应路由器重定向

从表中删除行(无法读取null的属性'data')

从 MDI 切换到 SDI 并再次切换回来

[FMX]将 Android 程序切换到后台及从后台切换到前台实现

linux怎样切换到root用户,linux从普通用户切换到root