react-router-dom v6 版本使用内容详解

1.路由组件

(1-1) v6 方式一 react-router-dom 常规
(1-2) v6 方式二 react-router-dom 使用 useRoutes

2.页面跳转

(2-1) Link 组件跳转
(2-2) useNavigate hooks跳转,代替useHistory

3.获取路由的参数

(3-1) useParams 获取动态路由的值
(3-2) useSearchParams 获取查询字符串的值
(3-3) useLocation 获取上一个页面传递进来的 state 参数 v5、v6一样

介绍:

v6 较 v5版本,在常用的路由组件管理、页面跳转、页面跳转带参等功能使用,需要注意。

官网:https://reactrouter.com/docs/en/v6

安装:

//自己选一个,几种方式都可以
npm方式:
    npm install --save react-router-dom

cnpm方式:
    cnpm install --save react-router-dom

yarn方式:
    yarn add react-router-dom
    
指定版本:使用@
    yarn add react-router-dom@5.2.1

见:package.json文件内dependencies新增了react-router-dom的版本号,即安装成功
重启下项目(不需要install)

1.路由组件
BrowserRouter:引用不变
Routes:替换 v5 的 Switch 组件
Route:引用不变。参数 element 替换 v5 的 component、render 组件

(1-1) 创建 src/routers/index.js

import Home from '../views/Home';
import About from '../views/About'
import Err404 from '../views/Err404'
const routers = [
  {
    title: '首页',
    path: '/',
    component: Home,
  },
  {
    title: '关于',
    path: '/inbox',
    component: About,
  },
  {
    title: '404',
    path: '/inbox',
    component: Err404,
  }
];

export default routers;

(1-2) 调用

v6 方式一 react-router-dom 常规(推荐 - 可以设置title更方便)

// v6 方式一
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import routers from './routers';

const App = () => {
  return (
    <Router>
      <Routes> // 不是老版本的:Switch
        {routers.map((item, index) => {
          return (
            <Route
              key={index}
              exact
              path={item.path}
              element={<item.component />} // 不是老版本的:component 或 render
              // onEnter、onBeforeMount、onMounted事件,会在组件初始化时执行一次,切换路由不执行
              // 若 修改 document.title 查看文档:https://blog.csdn.net/weixin_44461275/article/details/122843160
            />
          );
        })}
      </Routes>
    </Router>
  );
};

export default App;


//v5
import React from 'react';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import routers from './routers';

const App = () => {
  return (
    <Router>
      <Switch>
        {routers.map((item, index) => {
          return (
            <Route
              key={index}
              exact
              path={item.path}
              render={() => { // 推荐使用 render 不用 component
                document.title = item.title;
                return <item.component />;
              }}
              //或:
              //component={<item.component />}
            />
          );
        })}
      </Switch>
    </Router>
  );
};

export default App;

v6 方式二 react-router-dom + 使用 useRoutes

//路由json组件
import Layout from '../layout'
import About from '../views/About'
import Home from '../views/Home'
import AboutIndex from '../views/About/Component/AboutIndex'
import AboutList from '../views/About/Component/AboutList'
import Error404 from '../views/Error404'

const routes = [
    {
        path: "/",
        element: <Layout />, 
        children: [
            {
                index : true,
                element: <Home />
            },
            {
                path: "/about",
                element: <About />,
                children: [
                    { index : true, element: <AboutIndex />},
                    { path : "/about/:id", element :<AboutList />}
                ]
            },
        ]
    },
    {
       path: "*",
       element: <Error404 />,
    }
]

export default routes

//app.js
import React from 'react';
import { BrowserRouter as Router, useRoutes } from 'react-router-dom';
import routers from '../routers';

function App() {
  const GetRoutes = () => useRoutes(routers); //一定要是函数内
  
  return (
    <Router>
      <GetRoutes />
    </Router>
  );
}

export default App;

2.页面跳转
(2-1) Link 组件跳转

import React from "react";
import { Link } from "react-router-dom";

function DEMO() {
  return (
    <Link to="/aaa">点击跳转页面</Link>
  );
}

export default DEMO;

(2-2) useNavigate hooks跳转,代替useHistory

import React from "react";
import { useNavigate } from "react-router-dom";

function DEMO() {
    const navigate = useNavigate();

    // 点击跳转页面
    function hrefAaa() {
        navigate('/aaa')
    }

    // history replace模式
    function hrefReplace() {
        navigate("/aaa", { replace: true });
    }

    // history.go(-1)
    function historyBack() {
        navigate(-1);
    }
    
    // 跳转带参数
    function hrefState() {
      navigate("/test", {
        state: { test: 111 },
      });
    }
    
    return (
        <>
            <div onClick={hrefAaa}>点击跳转页面</div>
            <div onClick={hrefReplace}>history replace模式</div>
            <div onClick={historyBack}>返回上一个页面</div>
        </>
    );
}

export default DEMO;

3.获取路由的参数
useParams 获取动态路由的值
useSearchParams 获取查询字符串的值
useLocation 获取上一个页面传递进来的 state 参数 v5、v6一样

import React,{ useEffect } from "react";
import { useParams, useSearchParams, useLocation } from "react-router-dom";

export default function GoodsDetail() {
  const params = useParams(); // 获取动态路由的值
  const [searchParams, setSearchParams] = useSearchParams(); // 获取查询字符串的值
  const location = useLocation(); // 获取上一个页面传递进来的 state 参数
  
  useEffect(() => {
    // 一个对象,key 为动态字符串的 key
    console.log(params); // {id: '123'}

    console.log(location.state); // { test: 111 }  上一个页面带参获取 非url上面的search

    // 输入 http://localhost:3000/goods/123?name=1111
    console.log(searchParams.get("name")); // 111
  }, []);

  const handleSetSearch = () => {
    // 新增-修改
    setSearchParams({
      keyName: 2222
    }); // /aaa?keyName=2222
  };
  
  return (
    <div onClick={handleSetSearch}>Page</div>
  );
}

来自:https://blog.csdn.net/weixin_44461275/article/details/122968904

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容