当在终端中运行npm run start时,我得到以下错误。
试图导入错误:'Redirect'没有从'react-router-dom'中导出。
我重新安装了node_modules, react-router-dom, react-router。还重新启动了终端和我的电脑,但问题仍然存在。
我的代码:
import React from 'react';
import { Switch, Redirect } from 'react-router-dom';
import { RouteWithLayout } from './components';
import { Minimal as MinimalLayout } from './layouts';
import {
Login as LoginView,
Dashboard as DashboardView,
NotFound as NotFoundView
} from './views';
const Routes = () => {
return (
<Switch>
<Redirect
exact
from="/"
to="/dashboard"
/>
<RouteWithLayout
component={routeProps => <LoginView {...routeProps} data={data} />}
exact
layout={MinimalLayout}
path="/login"
/>
<Redirect to="/not-found" />
</Switch>
);
};
export default Routes;
这是我的包裹。json:进口
"react-router": "^6.0.0-beta.0",
"react-router-dom": "^6.0.0-beta.0",
重定向组件已从react-router版本6中移除。
来自react路由器文档:
不再支持<重定向v5中的>元素作为您的
路由配置(在a内)。这是由于即将发生的变化
进程期间更改路由器状态是不安全的
最初的渲染。如果你需要立即重定向,你可以选择a)
在你的服务器上(可能是最好的解决方案)还是b)渲染a
<在路由组件中导航>元素。但是,要认识到
导航将发生在useEffect中。
如果你想使用重定向组件,你将不得不使用react路由器版本5。
或者,你也可以使用react路由器v6中的导航组件。<Navigate>元素在呈现时改变当前位置
import { Navigate } from "react-router-dom";
return (
<Navigate to="/dashboard" replace={true} />
)
注意:Navigate是一个围绕useNavigate钩子的组件包装。您可以使用此钩子以编程方式更改路由。
嗨,我记得有一个钩子叫useHistory,这个钩子仍然存在,这只有一些变化,并被重命名为usenavate。使用这个,并遵循文档中的一个例子,我为我的受保护路由做了这样的返工:
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import { useAuth } from "../../contexts/AuthContext";
function ProtectedRoutes({ component: Component }, props) {
const [loading, setLoading] = useState(true);
const { currentUser } = useAuth();
const navigate = useNavigate();
useEffect(() => {
if (currentUser) {
setLoading(false);
return;
}
navigate("/");
}, []);
return <>{loading ? "Loading..." : <Component {...props} />} </>;
}
export default ProtectedRoutes;
在我的Routes中是这样使用的:
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import AuthFirebaseHelper from "./helpers/AuthFirebaseHelper/AuthFirebaseHelper";
import ProtectedRoutes from "./helpers/ProtectedRoutes/ProtectedRoutes";
import Dashboard from "./components/Dashboard";
import Home from "./components/Home";
function App() {
return (
<Router>
<Routes>
<Route path="/authentication" element={<AuthFirebaseHelper />}></Route>
<Route path="/" exact element={<Home />}></Route>
<Route
path="/restricted"
element={<ProtectedRoutes component={Dashboard} />}
></Route>
</Routes>
</Router>
);
}
导出默认App;
usenavnavigation的文档