我正在使用路由在react中创建应用程序下面是我的代码

Main.jsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import './index.css'
import { Router } from 'react-router-dom'

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <Router>
      <App />
    </Router>
  </React.StrictMode>
)

App.jsx

import { Route } from "react-router-dom"
import Home from "./Pages/Home"

function App() {
  return (
    <>
      <Route path="/" exact component={Home} />
    </>
  )
}

export default App

Home.jsx就是一个例子.

import Header from "../Components/Header/Header";

function Home() {
  return <><Header /></>
}

export default Home;

依赖性:

"dependencies": {
  "react": "^18.2.0",
  "react-dom": "^18.2.0",
  "react-router-dom": "^6.22.3"
},
"devDependencies": {
  "@types/react": "^18.2.64",
  "@types/react-dom": "^18.2.21",
  "@vitejs/plugin-react": "^4.2.1",
  "eslint": "^8.57.0",
  "eslint-plugin-react": "^7.34.0",
  "eslint-plugin-react-hooks": "^4.6.0",
  "eslint-plugin-react-refresh": "^0.4.5",
  "vite": "^5.1.6"
}

我犯了错误:

未捕获的TypeError:无法读取新路由上未定义的属性‘路径名’

为什么我会得到这个错误?

推荐答案

Issue

您看到的错误是由导入和使用低级Router组件引起的,该组件有几个必需的props .

请参见Router:

declare function Router(
  props: RouterProps
): React.ReactElement | null;

interface RouterProps {
  basename?: string;
  children?: React.ReactNode;
  location: Partial<Location> | string; // <-- required!
  navigationType?: NavigationType;
  navigator: Navigator;                 // <-- required!
  static?: boolean;
}

它是丢失的locationprops 具有路由需要的pathname属性.

你可以在source中看到,低层Router试图从未定义的locationprops 中解体.

export function Router({
  basename: basenameProp = "/",
  children = null,
  location: locationProp, // <-- no default/fallback value
  navigationType = NavigationType.Pop,
  navigator,
  static: staticProp = false,
  future,
}: RouterProps): React.ReactElement | null {
  .....

  if (typeof locationProp === "string") {
    locationProp = parsePath(locationProp);
  }

  let {
    pathname = "/", // <-- attempted destructure from undefined!
    search = "",
    hash = "",
    state = null,
    key = "default",
  } = locationProp;

  ....
}

您还在其他组件中遗漏了Reaction-RouterV6 API的其他关键部分,即所有Route个组件都需要呈现到一个包含路径匹配逻辑的Routes组件中,并且Route组件API也发生了显著变化.

Solution

您几乎永远不需要使用低级Router组件.你应该使用一个高级路由,例如BrowserRouterHashRouterMemoryRouter等,它们都实现了Router组件所需的基本props .

Main.jsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import './index.css'
import { BrowserRouter as Router} from 'react-router-dom'

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <Router>
      <App />
    </Router>
  </React.StrictMode>
);

更新App组件中的路由渲染以将所有Route组件包装在Routes中,以便它们可以匹配,并更新Route组件以使用正确的elementprops 来渲染路由的内容.elementprops 预计会有React.ReactNode,或者更通俗地说是JSX.

App.jsx

import { Routes, Route } from "react-router-dom"
import Home from "./Pages/Home"

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      ... other routes ...
    </Routes>
  );
}

export default App;

有关更完整的详细信息,请参见:

Javascript相关问答推荐

使用TMS Web Core中的HTML模板中的参数调用过程

窗口.getComputedStyle()在MutationObserver中不起作用

在Three JS中看不到补间不透明度更改效果

Html文件和客户端存储的相关问题,有没有可能?

我在Django中的视图中遇到多值键错误

在forEach循环中获取目标而不是父对象的属性

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

面对代码中的错误作为前端与后端的集成

使用Document.Evaluate() Select 一个包含撇号的HTML元素

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

不同表的条件API端点Reaction-redux

如何通过Axios在GraphQL查询中发送数组

在SuperBase JS客户端中寻址JSON数据

如果我的列有条件,我如何呈现图标?

为什么我的Navbar.css没有显示在本地主机页面上?

我在哪里添加过滤器值到这个函数?

将延迟加载的模块转换为Eager 加载的模块

KeyboardEvent:检测到键具有打印的表示形式

Js问题:有没有办法将数据从标记表转换成图表?

使用JavaScript或PHP从div ID值创建锚标记和链接