简体   繁体   English

如何在 React Router v6 中重定向?

[英]How can I redirect in React Router v6?

I am trying to upgrade to React Router v6 ( react-router-dom 6.0.1 ).我正在尝试升级到 React Router v6 ( react-router-dom 6.0.1 )。

Here is my updated code:这是我更新的代码:

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>

The last Route is redirecting the rest of paths to / .最后一条Route将 rest 的路径重定向到/

However, I got an error但是,我收到一个错误

TS2322: Type '{ render: () => Element; TS2322: 类型 '{ render: () => Element; }' is not assignable to type 'IntrinsicAttributes & (PathRouteProps | LayoutRouteProps | IndexRouteProps)'. }' 不可分配给类型 'IntrinsicAttributes & (PathRouteProps | LayoutRouteProps | IndexRouteProps)'。 Property 'render' does not exist on type 'IntrinsicAttributes & (PathRouteProps | LayoutRouteProps | IndexRouteProps)'.类型“IntrinsicAttributes & (PathRouteProps | LayoutRouteProps | IndexRouteProps)”上不存在属性“render”。

However, based on the documentation , it does have render for Route .但是,根据文档,它确实具有Routerender How can I use it correctly?我怎样才能正确使用它?

I think you should use the no match route approach.我认为您应该使用不匹配路由方法。

Check this in the documentation.在文档中检查这一点。

https://reactrouter.com/docs/en/v6/getting-started/tutorial#adding-a-no-match-route https://reactrouter.com/docs/en/v6/getting-started/tutorial#adding-a-no-match-route

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>

Update - 18/03/2022更新 - 2022 年 3 月 18 日

To keep the history clean, you should set replace prop.为了保持历史干净,你应该设置replace道具。 This will avoid extra redirects after the user click back.这将避免用户单击返回后的额外重定向。 Thanks @Paul for this tip.感谢@Paul 这个提示。

I found another way to do this:我找到了另一种方法来做到这一点:

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

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

https://reactrouter.com/docs/en/v6/getting-started/overview#navigation https://reactrouter.com/docs/en/v6/getting-started/overview#navigation

Create the file RequireAuth.tsx创建文件 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 the component to need user a private router:导入需要用户私有路由器的组件:

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>
  );
}

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

FOR react-router VERSION 6对于 react-router 版本 6

New example after editing-----> (more simple easy to read)编辑后的新示例-----> (更简单易读)

import {BrowserRouter as Router,Routes,Route} from 'react-router-dom';
import Home from '../NavbarCompo/About';
import Contact from '../NavbarCompo/Contact';
import About from '../NavbarCompo/About';
import Login  from '../NavbarCompo/Login';
import Navbar from '../Navbar/Navbar';
import Error from '../pages/error';
import Products  from '../pages/products';
import Data from '../NavbarCompo/Data';

const Roter=()=>{
    return (
    <Router>

            <Navbar />
        <Routes>
            
            <Route path='/' element={<Home />} />
            <Route path='/about' element={<About />} />
            <Route path='/contact' element={<Contact />} />
            <Route path='/login' element={<Login />} />
            <Route path='/product/:id' element={<Products />} />
            <Route path='/data' element={<Data />} />
            <Route path ='*' element={<Error />} />
        </Routes>


    </Router>
    )
}
export default Roter;

Look at the example看例子

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>
);

check this out https://reactrouter.com/en/main/start/overview检查这个https://reactrouter.com/en/main/start/overview

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

In V5 of react ie.在反应的 V5 中,即。 react-router-dom we had Redirect component. react-router-dom 我们有 Redirect 组件。 But in V6 of react it is updated to Navigate components.但是在 React V6 中,它被更新为导航组件。

We can pass replace in this components to avoid unnecessary redirects on clicking back and forward option.我们可以在此组件中传递替换,以避免在单击后退和前进选项时发生不必要的重定向。

Demonstration for usage is attached below :下面附上使用演示:

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

for class components, at the first you should make a functional component then use HOC technical to use useNavigate react hook.对于类组件,首先您应该制作一个功能组件,然后使用 HOC 技术使用 useNavigate react hook。 like this:像这样:

withrouter.js: withrouter.js:

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

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

then use use it in other class components like this:然后在其他类组件中使用它,如下所示:

export default withRouter(Signin);

and use props for redirect like this:并使用道具进行重定向,如下所示:

this.props.navigate('/');

This is an example using useHistory from react-router-dom这是一个使用react-router-dom中的useHistory的示例

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

const { REACT_APP_REST } = process.env;

function AllProducts() {

    const history = useHistory();

    const route = () => {
        history.push("/admin/product");
    }

    return (
        <>
            <Button
                className="btn-fill btn-wd"
        
                onClick={() => {
                    route()
                }}
            >
                NEW PRODUCT
            </Button>


        </>
    );
}

export default AllProducts;

import { useNavigate } from "react-router-dom";从“react-router-dom”导入 { useNavigate }; import { Button } from "@mui/material";从“@mui/material”导入{按钮};

const component =()=>{常量组件 =()=>{

const navigate = useNavigate();

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

return(<> //.........返回(<> //............

Back 后退

</>) </>)

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM