reactjs 如何在React Router v6中重定向?

5kgi1eie  于 2022-11-04  发布在  React
关注(0)|答案(9)|浏览(282)

我正在尝试升级到React路由器v6(react-router-dom 6.0.1)。
下面是我的更新代码:

import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom';

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/lab" element={<Lab />} />
    <Route render={() => <Navigate to="/" />} />
  </Routes>
</BrowserRouter>

最后一个Route正在将其余路径重定向到/
但是,我得到了一个错误
TS 2322:类型'{渲染:()=〉元素;}“不能赋值给类型”IntrinsicAttributes &(PathRouteProps|布局路径属性|索引路由属性)“。 属性“render”在类型“IntrinsicAttributes &(PathRouteProps”上不存在|布局路径属性|索引路由属性)“。
但是,根据文档,它确实有renderRoute,我如何正确使用它?

7gs2gvoe

7gs2gvoe1#

我认为您应该使用无匹配路由方法。
请在文档中查看此内容:* 添加“无匹配”路由 *

import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom';

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/lab" element={<Lab />} />
    <Route
        path="*"
        element={<Navigate to="/" replace />}
    />
  </Routes>
</BrowserRouter>

为了保持历史记录的干净,您应该设置replace prop。这将避免用户单击“上一步”后出现额外的重定向。

ny6fqffe

ny6fqffe2#

我找到了另一种方法:

import { useNavigate } from "react-router-dom";
let navigate = useNavigate();

useEffect(() => {
   if (LoggedIn){
      return navigate("/");
   }
},[LoggedIn]);

请参阅 * 概述、导航 *。

5fjcxozz

5fjcxozz3#

创建文件RequireAuth.tsx

import { useLocation, Navigate } from "react-router-dom";
import { useAuth } from "../hooks/Auth";

export function RequireAuth({ children }: { children: JSX.Element }) {
  let { user } = useAuth();
  let location = useLocation();

  if (!user) {
    return <Navigate to="/" state={{ from: location }} replace />;
  } else {
    return children;
  }
}

导入组件到需要用户私有的路由器:

import { Routes as Switch, Route } from "react-router-dom";

import { RequireAuth } from "./RequireAuth";
import { SignIn } from "../pages/SignIn";
import { Dashboard } from "../pages/Dashboard";

export function Routes() {
  return (
    <Switch>
      <Route path="/" element={<SignIn />} />
      <Route
        path="/dashboard"
        element={
          <RequireAuth>
            <Dashboard />
          </RequireAuth>
        }
      />
    </Switch>
  );
}
f4t66c6m

f4t66c6m4#

在React的第5版中,也就是 react-router-dom,我们有Redirect组件,但是在React的第6版中,它被更新为Navigate组件。
我们可以在这些组件中传递replace,以避免单击后退和前进选项时不必要的重定向。
使用示范附于下:

<Route  path="/" element={user ? <Home /> : <Register />} />
<Route path="/login" element={user ? <Navigate to="/" replace /> :  <Login />}  />
<Route path = "/register" element={user ? <Navigate to="/" replace /> :  <Register />} />
bgibtngc

bgibtngc5#

import { useState } from "react"
import { Navigate } from "react-router-dom"
const [login, setLogin] = useState(true)
return (<>
{!login && <Navigate to="/login" />}
<>)
khbbv19g

khbbv19g6#

import { useNavigate } from "react-router-dom";
import { Button } from "@mui/material";

const component =()=>{

    const navigate = useNavigate();

    const handelGoToLogin = () => {
        navigate('/auth/login')
    }

    return(<>
        //.........

        <Button onClick={handelGoToLogin} variant="outlined" color="primary" size="large" fullWidth>
             Back
        </Button>

    </>)
}
hmtdttj4

hmtdttj47#

适用于REACT版本6
看看这个例子

import React from "react";
import Form from "./compo/form";
import ReactDOM from "react-dom/client";
import { createBrowserRouter, RouterProvider, Route,Routes,Navigate } from "react-router-dom";

const router = createBrowserRouter([
  {
    path: "/",
    element: <Form />
  },
  {
    path: "/about",
    element: <h1>hola amigo,you are in about section</h1>
  },
  {
    path:"*",
    element:<Navigate to="/" replace />
  }
]);

const root = ReactDOM.createRoot(document.getElementById("root"));

root.render(
  <React.StrictMode>
    <RouterProvider router={router}></RouterProvider>
  </React.StrictMode>
);
hsvhsicv

hsvhsicv8#

对于类组件,首先要制作一个功能组件,然后使用HOC技术使用useNavigate React钩子。
就像这样:

文件 * 使用浏览器.js*

import {useNavigate} from 'react-router-dom';

export const withRouter = WrappedComponent => props => {
    return (<WrappedComponent {...props} navigate={useNavigate()}/>);
};

然后在其他类组件中使用它,如下所示:

export default withRouter(Signin);

使用这样的道具进行重定向:

this.props.navigate('/');
kse8i1jr

kse8i1jr9#

<BrowserRouter>
        <Routes>
          <Route path="/home" index element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/" element={<Navigate to="/home" replace />} />
        </Routes>
      </BrowserRouter>

相关问题