我不知道为什么会收到此错误,也无法在任何地方找到答案。我已经卸载了 react-router-dom
包并重新安装了它,但它仍然告诉我 switch 模块不是从 react-router-dom 导出的。这是我的代码。
我得到的错误:
尝试导入错误:“Switch”未从“react-router-dom”导出。
代码
import React from 'react';
import './App.css';
import NavBar from './components/navbar.js';
import Footer from './components/footer.js';
import Home from './components/pages/homepage/home.js';
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
function App() {
return (
<Router>
<div className="app-container">
<NavBar />
<Switch>
<Route path="/home" component={Home} />
</Switch>
<Footer />
</div>
</Router>
);
}
export default App;
withRouter
未导出的问题:stackoverflow.com/q/66465750/630364
在 react-router-dom v6 中,“Switch”被路由“Routes”取代。您需要从
import { Switch, Route } from "react-router-dom";
至
import { Routes ,Route } from 'react-router-dom';
您还需要更新 Route 声明
<Route path="/" component={Home} />
至
<Route path='/welcome' element={<Home/>} />
在 react-router-dom 中,您也不需要在 Route 声明中使用确切的。
有关详细信息,您可以访问官方文档:upgrade to react-router-dom v6
如果您使用的是 react-router-dom
v6,看起来 Switch
已替换为 Routes
这是使用 react-router-dom V6 的示例
import React from 'react'
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'
import '../styles/global.css'
import Layout from '../containers/Layout'
import Home from '../pages/Home'
import Login from '../containers/Login'
import RecoveryPassword from '../containers/RecoveryPassword'
import NotFound from '../pages/NotFound'
const App = () => {
return (
<Router>
<Layout>
<Routes>
<Route exact path="/" element={<Home/>}/>
<Route exact path="/login" element={<Login/>}/>
<Route exact path="/recovery-password" element={<RecoveryPassword/>}/>
<Route path="*" element={<NotFound/>}/>
</Routes>
</Layout>
</Router>
);
}
export default App;
我也面临同样的问题,我在网上搜索了很多,但根据我的问题我没有得到任何答案。
所以我卸载了react-router-dom的版本6:
npm uninstall react-router-dom
并安装了 react-router-dom 5.2.0 版本:
npm install react-router-dom@5.2.0
语法已更改
旧语法
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
<Switch>
<Route path="/home" component={Home} />
</Switch>
新语法:
import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";
<Routes>
<Route path="/home" element={<Home/>} />
</Routes>
Redirect
呢?
Navigate
替换了 Redirect
如果您使用的是 react-router-dom 版本 6,请使用此
// This is a React Router v6 app
import {
BrowserRouter,
Routes,
Route,
Link,
Outlet
} from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="users" element={<Users />}>
<Route path="me" element={<OwnUserProfile />} />
<Route path=":id" element={<UserProfile />} />
</Route>
</Routes>
</BrowserRouter>
);
}
function Users() {
return (
<div>
<nav>
<Link to="me">My Profile</Link>
</nav>
<Outlet />
</div>
);
}
在 react-router-dom v6 中,Switch 已被替换为 Routes。使用这种格式:
import { BrowserRouter as Router, Routes, Route} from 'react-router-dom';
<Router>
<Routes>
<Route exact path="/" component={component} />
<Route exact path="/path2" component={component2} />
<Route exact path="/path3" component={component3} />
</Routes>
</Router>
"react-router-dom": "^6.2.2"
不支持路由组件上的道具 component
。
react-router-dom
已更新到版本 6。现在他们已将 <Switch/>
组件重命名为 <Routes/>
。也有很多变化。
您应该花一些时间阅读文档。这是 react-router-v6-doc 的链接。
我能够通过从 Switch 更改为 Routes 来修复它所以你应该有这样的东西:
<Routes>
<Route path='/home' element={<Home/>} />
</Routes>
并且您还需要将 imort 从 Switch 更改为 Routes:
import { Routes, Route } from "react-router-dom";
<Switch>
替换为 <Routes>
前:
import { Route, Switch} from 'react-router'
<Router>
<Switch>
<Route />
<Route />
</Switch>
</Router>
现在:
import { Route, Routes} from 'react-router'
<Router>
<Routes>
<Route />
<Route />
</Routes>
</Router>
只需使用 Routes 而不是 Switch。
从改变
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
<Switch>
<Route path="/home" component={Home} />
</Switch>
至
import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";
<Routes>
<Route path="/home" element={ <Home />} />
</Routes>
在 react-router-dom v6 Switch 被替换为 Routes
和带有元素的组件
{componentName} 与 {}
您必须先检查 npm 包版本。要检查,请运行 npm info react-router-dom version
。
如果包版本 >= 6.0.0,则必须更改
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
至
import { BrowserRouter as Router,Routes, Route, Link } from "react-router-dom";
也必须改变
<Route path="/home" component={Home} />
至
<Route path="/home" element={<Home/>} />
我通过更改渲染路线以使用 element
的方式解决了我的错误。
至:
import React from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import { Home } from "./app";
import { Login, Register } from "./auth";
const R: React.FC = () => {
return (
<Router>
<Routes>
<Route path="/login" caseSensitive={false} element={<Login />} />
<Route path="/register" caseSensitive={false} element={<Register />} />
<Route path="/" caseSensitive={false} element={<Home />} />
</Routes>
</Router>
);
};
export default R;
基本上在 v6.*
之前:
import React from "react";
import { BrowserRouter as Router, Route, Switch} from "react-router-dom";
import { Home } from "./app";
import { Login, Register } from "./auth";
const R: React.FC = () => {
return (
<Router>
<Switch>
<Route path="/login">
<Login />
</Route>
<Route path="/register">
<Register/>
</Route>
<Route path="/">
<Home/>
</Route>
</Switch>
</Router>
);
};
export default R;
v6.*
之后
import React from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import { Home } from "./app";
import { Login, Register } from "./auth";
const R: React.FC = () => {
return (
<Router>
<Routes>
<Route path="/login" caseSensitive={false} element={<Login />} />
<Route path="/register" caseSensitive={false} element={<Register />} />
<Route path="/" caseSensitive={false} element={<Home />} />
</Routes>
</Router>
);
};
export default R;
Switch
是从 react-router
而不是 react-router-dom
导出的(我认为 Route
也是如此)。
react-router-dom
从 react-router
重新导出所有内容。
react-router
& react-router-dom
写 <Routes>
而不是 <Switch>
。
在终端中运行:
npm install --save react-router react-router-dom
这对我有帮助。或者检查文件 package.json 并在 "react-dom": "^17.0.2",
之后添加以下内容:
"react-router": "^6.0.0",
如果您使用的是 react-router-dom
v6,则必须将 Switch 更改为 Routes,如下例所示:
import { Switch, ... } from 'react-router-dom';
而不是导入 Switch
导入路线 import { Routes, ...} from 'react-router-dom';
然后,而不是使用 component = {ComponentName}, use element={<ComponentName/>}
,如下所示:
import { Routes, Route, ...} from 'react-router-dom';
.
.
.
<Routes>
<Route exact path='/' element={<Home/>}></Route>
</Routes>
如果您使用的是 react-router-dom 版本 6,则需要将 Switch
更新为 Routes
。以下语法对我有用:
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import './App.css';
import Home from './components/Home';
function App() {
return (
<div>
<Router>
<Routes>
<Route path="/" exact element={<Home />} />
</Routes>
</Router>
</div>
);
}
export default App;
你的 react-router-dom 版本是什么?
"react-router": "^5.2.0",
"react-router-dom": "^5.2.0",
如果它高于 1,那么您需要删除节点模块并使用 npm install --save
重新安装节点模块。
我遇到过同样的问题。在项目终端上,键入以下命令。您无需对代码进行任何更改。
npm 卸载 react-router-dom npm 安装 react-router-dom@5.2.0
Switch已被Routes取代
来源更新路由(react-router-dom 语法)#1386(howtographql GitHub)
https://i.stack.imgur.com/rXUMA.png
/*Step 1: Step 1. Upgrade to React 16.8+ and react-router-dom v5.2
npm uninstall react-router-dom
npm install react-router-dom@5.2
/*Step 2: Update the react-router-dom import statement.*/
//Change import { Switch, Route } from "react-router-dom";
//to
import { Routes ,Route } from 'react-router-dom';
/*Step 3: Upgrade the syntax and replace "Switch" with "Routes" and "component" with "element" */
//Change
// <Switch>
// <Route path="/home" component={HomePage} />
// </Switch>
//to
<Routes>
<Route path="/home" element={<HomePage/>} />
</Routes>
//Alternatively you can also downgrade the react-router-version as suggested in other solutions,
//However, rather than going backwards, I would suggest to upgrade to latest version of react-router-dom and its syntax.
import {
BrowserRouter as Router,
Routes,
Route,
Link
} from "react-router-dom";
function App() {
return (
<>
<Router className="App">
<Navbar/>
<Routes>
<Route path='/'>
</Route>
</Routes>
</Router>
</>
);
}
export default App;
一个解法:
删除 node_modules 文件夹。在 package.json 文件中,将 react-router-dom 版本(在我的例子中为版本 6)更改为 "react-router-dom": "^5.2.1"
然后在终端运行:
npm install
安装依赖项,然后运行 npm start
重新启动
我解决了这样的问题:
yarn add react-router-dom@5,3,0
这实际上不是您或 React 或您的代码的问题。这只是 react-router-dom 的更新版本。用路由替换 Switch。
而已。只需使用 Routes 而不是 Switch,它就可以正常工作。
在 react-router-dom
v6 中,switch
被 Routes
取代。下面是配置 react-router-dom
v6 的简单示例。
import * as React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Layout from './components/Layout';
import ProtectedRoute from './components/ProtectedRoute';
import LoginPage from './pages/LoginPage';
import WizardPage from './pages/WizardPage';
import RequestsPage from './pages/RequestsPage';
import './App.scss'
export class App extends React.Component {
public render() {
const sharedRouteProps = { exact: true, authenticationPath: '/login' };
const wizardRouteProps = { ...sharedRouteProps, path: "/", component: WizardPage };
const requestsRouteProps = { ...sharedRouteProps, path: "/requests", component: RequestsPage };
return (
<Layout>
<Router>
<Switch>
<Route exact path='/login' component={LoginPage} />
<ProtectedRoute {...wizardRouteProps} />
<ProtectedRoute {...requestsRouteProps} />
</Switch>
</Router>
</Layout>
);
}
}
安装 react-router-dom v6.0.2 后出现此错误。
用路由替换 Switch 解决了这个问题:
import {BrowserRouter as Router, Route, Routes} from "react-router-dom";
如果您使用的是较新版本的 react-router-dom
(例如,在我的例子中为 ^6.2.1),您应该将 <Switch>
更改为 <Routes>
并将 <Route>
与 component={<SampleComponent />}
参数一起使用。
特别是下面的代码示例:
import { BrowserRouter as Router, Routes, Route} from 'react-router-dom';
import MyComponent from './containers/MyComponent';
export default function AppRoutes() {
return (
<Routes>
<Route exact path="/" component={<MyComponent />}>
</Route>
</Routes>
);
}
如果您安装了 react-router 和 react-router-dom v6 beta,只需像这样卸载:
npm uninstall --save react-router react-router-dom
并安装它:
npm install --save react-router react-router-dom
它将安装非测试版的最新版本。
然后我们只需要重新启动 Visual Studio Code 或您处理它的任何文本编辑器。
Home
到<Home/>
的变化,我第一眼没注意到。