React@16.x(37)路由v5.x(2)路由信息

1,路由信息

Router 组件会创建一个上下文,并且向上下文中注入一些信息(该信息对开发者是隐藏的)。

Route 组件匹配到了路径,则会将这些上下文信息作为 props 传入对应的组件。

function A(props) {
    console.log(props);
    return <h1>A组件</h1>;
}
function B() {
    return <h1>B组件</h1>;
}

export default function App() {
    return (
        <Router>
            <Route path="/a" component={A}></Route>
            <Route path="/b" component={B}></Route>
        </Router>
    );
}

当访问 http://localhost:5173/a 会输出:

在这里插入图片描述

2,注入的信息

2.1,history

并不是 window.history 对象。主要利用 history 来实现无刷新跳转路由。

function A(props) {
    console.log(props);
    return (
        <h1
            onClick={() => {
                props.history.push("/b");
            }}
        >
            跳转路由/b
        </h1>
    );
}

push 也可以直接传递 search 参数:会从当前地址,跳转到带参数的地址。

props.history.push("?a=c");

其他的方法 replacegoforwardback 不多赘述。

为什么不直接使用 window.history

  1. React-router 支持2种路由模式(HashHistory),使用 React 自己的语法,可以无视路由模式来跳转。而 window.history不支持 Hash 模式。
  2. window.history.pushState 等方法的跳转,React 无法感应到地址变化,所以无法重新渲染页面。

2.2,location

和上面的 history.location 是同一个对象,放到外层更方便使用。

props.history.location === props.location // true

该对象记录了当前地址的相关信息,不过一般不使用它。如果要解析地址栏的数据,会用第3方库比如 query-string

2.3,match

重点

该对象保存了,匹配路由的相关信息。几个重要的属性:

2.3.1,isExact

当前路径和路由配置的路径,是否完全匹配。比如:

<Route path="/a" component={A}></Route>
  • 当访问 /aisExact: true,(此时 Route.exact = false
  • 当访问 /a/b/cisExact: false

注意区分和 Route 组件中的 exact,它们并没有直接关系。

2.3.2,params

获取路径规则中对应的数据。

在使用 Route.path 属性时,除了直接写路径外,还可以写一个 string pattern字符串正则):

<Route path="/a/:id" component={A}></Route>

此时,只有访问 /a/xxx 时才会匹配到 A 组件。

在这里插入图片描述

  1. 多个参数
path="/news/:year/:month/:day"

则路径必须是 /news/xx/xx/xx 才能匹配到对应路由。

  1. 可选参数
path="/news/:year?/:month/:day"

则路径必须是 /news/xx/xx/xx/news/xx/xx

  1. 直接写正则,参数必须是数字。
path="/news/:year(\d+)/:month(\d+)/:day(\d+)"

则路径必须是 /news/11/22/33

  1. 通配符
path="/news/:year(\d+)/*"

则路径必须是 /news/11/xx。这个 xx 必须存在,可以是任意合法字符。

  1. 分隔符不一定非得是 /
path="/news-:year=:month"

则路径必须是 /news-xx=xx,比如 /news-12=34

在这里插入图片描述

react-router 使用了第3方库 path-to-regexp 来将字符串正则 转换为真正的正则表达式。

3,路由传参

下面4种方式,刷新页面数据都不会丢失。

  1. history.push(),第2个参数可传参,可在 location.state 中获取数据。

  2. search 传参,通过第3方库 query-string 获取数据。

  3. hash 传参,同样可使用 query-string 获取数据。

  4. params 传参,可在 match.params 中获取数据。

非路由组件获取路由信息

文章一开始就说了,只有当 Route 组件匹配到了路径,对应的组件才会有路由的上下文信息。

那非路由组件如何获取这些信息?

  1. 将路由信息,一层层传递下去。
  2. 使用 React-router 提供的高阶组件 withRouter。将目标组件传递,它会返回一个新组件,新组件将向目标组件注入路由信息。

路由的上下文信息,对开发者是隐藏的。而在 React-router 自己提组件 withRouter 中是可以获取的。

import { BrowserRouter as Router, Route, withRouter } from "react-router-dom";

function A() {
    return (
        <>
            <h1>A组件</h1>
            <B />
        </>
    );
}
function B() {
    return (
        <>
            <h1>B组件</h1>
            <CWrapper />
        </>
    );
}

function C(props) {
    console.log(props);
    return <h1>C组件</h1>;
}

const CWrapper = withRouter(C);

export default function App() {
    return (
        <Router>
            <Route path="/a" component={A}></Route>
        </Router>
    );
}

注意,withRouter 的组件参数,必须是 Router 组件的子元素,这样才能获取到路由的上下文信息注入到目标组件中。比如 React路由守卫实现 时就遇到了这样的问题。


以上。

  • 36
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 React Router v5 中,你可以使用 React.lazy() 和 Suspense 组件来实现路由的懒加载。下面是一个示例: 首先,确保你已经安装了 `react-router-dom` 的版本为 5.x。 ```bash npm install react-router-dom@5 ``` 然后,你可以按照以下步骤来实现路由的懒加载: 1. 导入需要使用的组件和函数: ```jsx import React, { Suspense, lazy } from 'react'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; ``` 2. 创建需要懒加载的组件: ```jsx const Home = lazy(() => import('./components/Home')); const About = lazy(() => import('./components/About')); const Contact = lazy(() => import('./components/Contact')); ``` 3. 使用懒加载的组件和路由: ```jsx function App() { return ( <Router> <Suspense fallback={<div>Loading...</div>}> <Switch> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/contact" component={Contact} /> </Switch> </Suspense> </Router> ); } export default App; ``` 在上面的代码中,`Suspense` 组件用于在组件加载期间显示一个加载提示(例如 "Loading..."),直到组件加载完成。`fallback` 属性指定了加载期间显示的内容。 `lazy` 函数用于动态导入组件。传递给 `lazy` 函数的参数是一个返回 `import()` 方法的函数,该方法会异步加载组件。 在 `Route` 组件中,将懒加载的组件作为 `component` 属性的值传递。 这样,当用户访问相应的路由时,对应的组件将会被动态加载并渲染。 希望这个例子能帮到你!如果有任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下雪天的夏风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值