反应路由器 v6 探索 #135

简介: 反应路由器 v6 探索 #135

前言


没事翻了翻 的文档,发现已推到了 版本,这个版本做了很大的改动,让我们一起看看吧React Routerv6.2.2


为什么推出 v6


  • 推出 的最大原因是 的出现v6React Hooks
  • v6写的代码要比 代码更加紧凑和优雅v5

我们通过代码来感受下,这是 写的伪代码v6

import { Routes, Route, useParams } from "react-router-dom";
function App() {
    return (
        <Routes>
            <Route path="blog/:id" element={<Head />} />
        </Routes>
  );
}
function Head() {
    let { id } = useParams();
    return (
        <>
            <Footer />
        </>
    );
}
function Footer() {
    let { id } = useParams();
}

这是 写的伪代码v5

import * as React from "react";
import { Switch, Route } from "react-router-dom";
class App extends React.Component {
    render() {
        return (
            <Switch>
                <Route
                    path="head/:id"
                    render={({ match }) => (
                        <Head id={match.params.id} />
                    )}
                />
            </Switch>
        );
    }
}
class Head extends React.Component {
    render() {
        return (
            <>
                <Footer id={this.props.id} />
            </>
        );
    }
}
class Footer extends React.Component {
    render() {
        return (
            <>
                <ButtonComponent id={this.props.id} />
            </>
        );
    }
}

这个例子表明

  • Hooks消除了使用 访问路由器内部状态的需要<Route render>
  • 手动传递 将该状态传播到子组件的需要props
  • 应用程序包体积更小


增加了哪些特性?


  1. <Switch>升级为<Routes>
  • Routes 内的所有 和 是相对的。这使得 和 中的代码更精简、更可预测
  • 路由是根据最佳匹配,而不是按顺序遍历,这避免了由于路由不可达而导致的错误
  • 路由可以嵌套在一个地方,而不是分散在不同的组件中
  1. 新钩子 代替 useRoutesreact-router-config

之前:

import React, { lazy } from 'react';
import PrivateRoute from '@components/PrivateRoute/index';
const Dashboard = lazy(() => import('@pages/dashboard/index'));
const Abount = lazy(() => import('@pages/abount/index'));
const routes = [
    {
        path: '/home',
        component: Dashboard
    },
    {
        path: '/about',
        component: Abount
    },
];
const RouteWithSubRoutes = route => (
    <PrivateRoute path={route.path} component={route.component} routes={route.routes} />
);
const routeConfig = routes.map((route, i) => <RouteWithSubRoutes key={i} {...route} />);
export default routeConfig;

现在

function App() {
    let element = useRoutes([
        { path: '/', element: <Home /> },
        {
            path: 'users',
            element: <Users />,
            children: [
                { path: '/', element: <UsersIndex /> },
                { path: ':id', element: <UserProfile /> },
                { path: 'me', element: <OwnUserProfile /> },
            ]
        }
    ]);
    return element;
}

就感觉更优雅一些

  1. 用 代替 useNavigateuseHistory

之前

import { useHistory } from "react-router-dom";
function App() {
    let history = useHistory();
    function handleClick() {
        history.push("/home");
    }
    return (
        <div>
            <button onClick={handleClick}>go home</button>
        </div>
    );
}

现在

import { useNavigate } from "react-router-dom";
function App() {
    let navigate = useNavigate();
    function handleClick() {
        navigate("/home");
    }
    return (
        <div>
            <button onClick={handleClick}>go home</button>
        </div>
    );
}

这个变化不是很大

  1. Route 的变化
  • 4.1 移除,使用 代替<Route exact>/*
<Route path="/*" element={<Home />} />

`

  • 4.2 使用 代替<Route children><Route element>
import Profile from './Profile';
// v5
<Route path=":userId" component={<Profile />} />
// v6
<Route path=":userId" element={<Profile />} />
  • 4.3 Outlet
    我们使用一个 元素作为占位符。在 这种情况下, 组件如何呈现其子路由。因此,将根据当前位置 呈现一个 或 元素<Outlet><Outlet>Users<Outlet><UserProfile><OwnUserProfile>
  • 4.4
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="/" element={<UsersIndex />} />
        <Route path=":id" element={<UserProfile />} />
        <Route path="me" element={<OwnUserProfile />} />
        </Route>
      </Routes>
    </BrowserRouter>
    );
}
function Users() {
    return (
      <div>
          <nav>
        <Link to="me">My Profile</Link>
      </nav>
      <Outlet />
      </div>
    );
}


体验 v6


这里我们使用 来创建项目,安装好之后,进入项目,安装 依赖create-react-appreact-router-dom@6

$ npx create-react-app react-app
$ cd react-app
$ npm install react-router-dom@6

src/index.js 在编辑器中打开, 从顶部附近导入 并将 包装在 BrowserRouterreact-router-dom<APP><BrowserRouter>

// src/index.js
import * as React from "react";
import * as ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
import "./index.css";
import App from "./App";
import * as serviceWorker from "./serviceWorker";
ReactDOM.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>,
    document.getElementById("root")
);

打开 并用一些路由替换默认标记src/App.js

// App.js
import * as React from "react";
import { Routes, Route, Link } from "react-router-dom";
import "./App.css";
function App() {
    return (
        <div className="App">
            <h1>Welcome to React Router!</h1>
                <Routes>
                    <Route path="/" element={<Home />} />
                    <Route path="about" element={<About />} />
                </Routes>
        </div>
    );
}

现在,仍在 ,创建你的路由组件src/App.js

// src/App.js
function Home() {
    return (
        <>
            <main>
                <h2>Home</h2>
            </main>
            <nav>
                <Link to="/about">About</Link>
            </nav>
        </>
    );
}
function About() {
    return (
        <>
            <main>
                <h2>About</h2>
            </main>
            <nav>
                <Link to="/">Home</Link>
            </nav>
        </>
    );
}

运行 ,您应该会看到 标识npm startHome


如何升级 v6


官方的迁移指南在这里:React Router v6 迁移指南


参考文章


结语


如果你正在用 重构你的应用,我的建议是可以尝试Hook

目录
相关文章
|
3月前
|
人工智能 JSON 测试技术
Harness Engineering 是什么?AI 编程工程化的三次进化
Harness Engineering 凭什么刷屏 AI 圈?从提示词到上下文再到 Harness,一文讲透它的来龙去脉和五大核心模块。
|
2月前
|
人工智能 运维 文字识别
企业大模型本地化部署与数据安全实践:从 RAG 权限过滤到审计闭环
本文聚焦企业大模型本地化部署中的数据安全痛点,以RAG问答系统为例,详解权限过滤前置、元数据治理、审计闭环等关键实践,提供可落地的分层架构与FastAPI代码骨架,强调“模型看不见无权数据”才是安全底线。
337 0
|
6月前
|
人工智能 安全 开发工具
玩转AI研发系统:从环境搭建到流程自动化
深度使用AI研发后,我彻底改变了对AI编程的认知——它并非简单的代码辅助,而是融合AIGC大模型与软件工程全流程管理的一站式DevOps智能协作中台。其核心功能精准破解研发效率痛点,下文结合实操心得与真实案例,拆解其核心技术能力及使用方法,助力研发提质增效。
661 3
|
8月前
|
人工智能 自然语言处理 安全
OpenClaw(原Moltbot、Clawdbot)部署AI助手流程,新手小白也能按步骤完成搭建
OpenClaw(前身为Moltbot、Clawdbot)是一款低门槛AI智能助手工具,核心依托自然语言理解能力,可自动完成办公自动化、多工具协同、基础任务处理等工作,无需用户掌握编程技能。2026年,通过阿里云平台部署OpenClaw,可快速获得稳定运行的AI智能助手,支持7×24小时后台运行,适配个人办公、轻量团队协作等多场景需求。本文严格遵循官方部署逻辑,拆解从前期准备到功能启用的完整流程,确保信息原汁原味,小白也能按步骤完成部署。
752 1
|
10月前
|
数据采集 存储 调度
定时抓取与更新:用Python爬虫构建自己的新闻简报系统
定时抓取与更新:用Python爬虫构建自己的新闻简报系统
|
人工智能 监控 数据可视化
企业级LLMOps落地指南:蜂巢架构×可视化编排实战
本文将基础的单应用扩展成多应用,并实现工作流组件,包括:多应用模块设计、工作流模块设计、LangGraph实现图应用、前端Vue-Flow组件使用、工作流转LLM工具设计思路、关联工作流登技巧。
635 3
企业级LLMOps落地指南:蜂巢架构×可视化编排实战
|
域名解析 人工智能 缓存
无前端经验如何快速搭建游戏站:使用 windsurf 从零到上线的详细指南
本指南涵盖游戏站页面初稿设计、工具配置、内容设计与功能实现及部署上线的全流程。通过参考优秀网站设计,利用v0.dev平台完成页面布局和样式调整,并下载代码进行后续开发。使用Windsurf配置工作空间规则,确保以用户易懂的方式推进项目。逐步实现多语言支持、favicon设置、嵌入游戏等功能,确保网页专业且用户体验良好。最后通过购买域名、GitHub托管代码、Vercel部署等步骤将游戏站成功上线。
976 10
|
搜索推荐 安全 数据挖掘
QuickBI行级权限:精细化数据访问控制,轻松实现千人千面
随着企业数据量的快速增长和应用场景的多样化,数据权限管理变得至关重要。QuickBI的行级权限功能通过条件组合授权和用户标签授权两种模式,实现了灵活、精细的数据权限控制。条件组合授权适用于多规则配合场景,如不同部门仅能看到自身产品线数据;用户标签授权则适合大规模个性化权限管理,如按地区限制数据可见性。该功能简化了配置步骤,提高了权限管理效率,确保数据安全合规且有效利用。
1300 1
|
安全 网络安全 网络架构
解释子网为零和全一子网:概念、原理与应用
解释子网为零和全一子网:概念、原理与应用
675 1
|
Python
Python的Virtualenv与Venv环境管理器
介绍Python的两种环境管理工具Virtualenv和venv,包括它们的安装、创建、激活、退出环境以及查看帮助信息的方法,同时对比了两者的特点和使用场景。
835 3
Python的Virtualenv与Venv环境管理器