在react—router v6(https://reactrouter.com/en/main/route/route)的文档中,

省略路径使此路径成为"布局路径".它参与UI嵌套,但不向URL添加任何段

为什么这不起作用?

const App = () =>
  <Routes>
    <Route path='/abc' element={<p>abc</p>} />
    <Route element={<MyComponent />}></Route>
  </Routes>
    
const MyComponent = () =>
  <Routes>
    <Route path='/def' element={<p>def</p>} />
  </Routes>

在本例中,导航到"/def"会出现错误:

没有匹配位置的路由"/def"

如果我在引用MyComponent的路由上添加path='*',那么它可以正常工作,但似乎文档告诉我我不需要这样做(事实上,就我所见,文档没有提到path='*').

推荐答案

Issue

为什么这不起作用?

const App = () =>
  <Routes>
    <Route path='/abc' element={<p>abc</p>} />
    <Route element={<MyComponent />}></Route>
  </Routes>
    
const MyComponent = () =>
  <Routes>
    <Route path='/def' element={<p>def</p>} />
  </Routes>

我认为你把布局路径与100条路径的作用与101条路径混为一谈,任何路由组件都可以在ReactTree中进一步渲染.像这样的无路径布局路由不参与路由匹配,因此它希望声明嵌套路由以便they可以参与.

const App = () =>
  <Routes>
    <Route path='/abc' element={<p>abc</p>} />
    <Route element={<MyComponent />}>
      {/* no nested routes to match 🤷🏻‍♂️ */}
    </Route>
  </Routes>

Explanation

布局路由

使用布局布线时,可以直接包裹和渲染嵌套布线.布局路由的目的是提供一些"公共UI"和一个Outlet,用于嵌套路由将其内容呈现到其中.

使用布局路由的示例.

const App = () => (
  <Routes>
    <Route path='/abc' element={<p>abc</p>} />
    <Route element={<MyComponent />}> // <-- parent route
      <Route                          // <-- nested route
        path='def'                    // <-- "/def"
        element={<p>def</p>}          // <-- rendered into Outlet
      />
    </Route>
  </Routes>
);

const MyComponent = () => (
  <div>
    {/* Common UI header, etc */}
    <Outlet />
    {/* Common UI footer, etc */}
  </div>
);

后代路由

在呈现后代路由时,布局路由不起作用.

One 102 distinction though is that in order for descendent routes to be reachable and matchable the parent route 103 append the wildcard matcher, or 100, to its 101.

后代路由建立其到其父路由的路径relative.这就是为什么当您向父路由添加path="*"时,您的代码工作.这将与第一条路由匹配的"/abc"相匹配.

使用派生路由的示例.

const App = () => (
  <Routes>
    <Route path='/abc' element={<p>abc</p>} />
    <Route     // <-- parent route
      path="*" // <-- match anything but "/abc"
      element={<MyComponent />}
    />
  </Routes>
);

const MyComponent = () => (
  <div>
    {/* Common UI header, etc */}
    <Routes>
      <Route       // <-- descendent route
        path='def' // <-- "/" + "def" -> "/def"
        element={<p>def</p>}
      />
    </Routes>
    {/* Common UI footer, etc */}
  </div>
);

Javascript相关问答推荐

React对话框模式在用户单击预期按钮之前出现

序列查找器功能应用默认值而不是读取响应

如何获取转换字节的所有8位?

警告!合同执行期间遇到错误[执行已恢复](Base Layer 2)

如何找出摆线表面上y与x相交的地方?

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

在服务器上放置了Create Reaction App Build之后的空白页面

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

用于在路径之间移动图像的查询

如何将数组用作复合函数参数?

如何在Svelte中从一个codec函数中调用error()?

JS Animate()方法未按预期工作

如何用javascript更改元素的宽度和高度?

在不扭曲纹理的情况下在顶点着色器中旋转UV

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

Django模板中未加载JavaScript函数

React数组查找不读取变量

Refine.dev从不同的表取多条记录

验证Java脚本函数中的两个变量