当前位置: 首页 > 知识库问答 >
问题:

前端 - 萌新提问关于 react 的路由问题?

井旺
2023-09-17

项目是 Umi 创建的,用的路由插件是 react-router-dom

有两个页面,第一个页面通过 Link 组件跳转到第二个页面,第二页页面是 router 文件夹里的 router-page,第一个页面的代码如下:

import { Link } from 'umi';export default function HomePage() {  return (    <div>      <ol style={{ display: 'flex', flexDirection: 'column' }}>        <li>          <Link to="/router/router-page">路由</Link>        </li>      </ol>    </div>  );}

.umirc 里也的路由也添加好了:

{ path: '/router/router-page', component: 'router/router-page' },

可以成功的从第一页跳转到第二页。

然后第二页 router-page.tsx 里的代码如下:

import { Component } from 'react';import { NavLink, Route, Routes } from 'react-router-dom';export default class RouterPage extends Component {  render() {    return (      <div style={{ margin: '20px' }}>        <nav>          <NavLink to="">首页</NavLink>          <NavLink to="/about">关于</NavLink>        </nav>        <RouterView></RouterView>      </div>    );  }}function RouterView() {  return (    <Routes>      <Route path="" element={<Home></Home>}></Route>      <Route path="/about" element={<About></About>}></Route>    </Routes>  );}function Home() {  return (    <div>      <h1>首页内容</h1>    </div>  );}function About() {  return (    <div>      <h1>关于页面内容</h1>    </div>  );}

页面显示如下:

image.png

现在的问题是,我点击“关于”按钮,页面直接变白板了,然后控制台提示:

You rendered descendant <Routes> (or called useRoutes()) at "/router/router-page" (under <Route path="/router/router-page">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.

Please change the parent <Route path="/router/router-page"> to <Route path="/router/router-page/*">.

No routes matched location "/about"

根据它的提示,我去把 Link 改了下:

<Link to="/router/router-page/*">路由</Link>

结果第二个页面全都变白板了。

我是 react 新手,想请教下大家这个问题应该如何解决?

共有2个答案

孙佐
2023-09-17
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";import ReactDOM from 'react-dom/client'function HomePage() {  return (    <div>      <Link to="/router/router-page">跳转路由页面</Link>    </div>  );}function RouterPage() {  return (    <div>      <h1>路由页面</h1>      <Link to='/router/router-page/RouterPageHome'>RouterPageHome</Link>      <Link to='/router/router-page/RouterPageAbout'>RouterPageAbout</Link>      <Routes>        <Route path="RouterPageHome" element={<div>路由页面Home</div>}></Route>        <Route path="RouterPageAbout" element={<div>路由页面About</div>}></Route>      </Routes>    </div>  );}function App() {  return (    <div>      <BrowserRouter>        <Routes>          <Route path="/" element={<HomePage />}></Route>          <Route path="/router/router-page/*" element={<RouterPage />} />        </Routes>      </BrowserRouter>    </div>   );}ReactDOM.createRoot(document.getElementById('root')).render(<App />)
戚英逸
2023-09-17

根据你的描述,问题可能出在 RouterView 的定义上。在 RouterView 中,你正在渲染 HomeAbout 组件,但它们的路径似乎不匹配。在 React Router v6 中,你需要在 <Route> 组件上设置 element 属性,而不是直接渲染组件。

你的 RouterView 应该像这样修改:

function RouterView() {  return (    <Routes>      <Route path="/router/router-page" element={<Home></Home>}></Route>      <Route path="/router/router-page/about" element={<About></About>}></Route>    </Routes>  );}

这将确保只有当路径为 "/router/router-page" 或 "/router/router-page/about" 时,HomeAbout 组件才会被渲染。如果路径不匹配这些,React Router 将选择其他匹配的组件。

然后,你的 Link 组件应该像这样修改:

<Link to="/router/router-page/*">路由</Link>

现在,当你点击“关于”按钮时,React Router 将匹配正确的路由,并渲染正确的组件。

 类似资料:
  • 我正在尝试在我的URL中传递参数,但我的阅读有问题。我正在使用react-router v4。 网址:http://localhost:3000/reset?token=123我试着这样读: 但这打印空对象。奇怪的是,我试图将问号更改为其他字符,看起来它解决了我的问题,但我还是想保留问号。 网址:http://localhost:3000/reset_token=123 这已经工作了< code

  • 例如我创建了一个dataHook main.ts中 页面有个按钮就执行v.value += 1,为什么console.log还是原值1呢?

  • 在放开最后一行注释后执行 : A的引用内存反而降低了,A对B的引用好像并没有解除,为什么会降低内存了? 为什么A对象的内存降低了呢

  • React中的useCallback 下面的代码中Com是父组件,Button是子组件,子组件接收父组件的count2和setCount2,子组件中使用了memo(Button)导出 子组件Button 在上面的代码中,如果点击count1++的按钮(不使用useCallback),父组件会重新渲染,但是子组件也会刷新,然而子组件中的count2依赖没有变化,所以只能是handleClick2函数

  • 我有一个模型(加载到内存中),它在生产中使用来自消息队列消息/数据来进行预测。我有一个单独的过程,每隔几个小时重新训练模型(必要的)。在每次重新训练发生时,触发模型将新训练的版本重新加载到内存中的最佳方法是什么?目前,我只是让生产模型每隔一段时间或每1000条消息重新加载一次。 我想,如果不是消息队列,而是一个WebServer的话,这会更容易。这样我就可以有一个可以触发重新加载的endpoint

  • <script setup lang="ts"> import UserCommodityInfo from "@/store/home/commodity/Info.ts"; import { storeToRefs } from "pinia"; import CardChild from './CardChild/index.vue' import { ref, onMounted } fr