当前位置: 首页 > news >正文

React路由规则的定义、声明式导航、编程式导航

文章目录

  • 1. 路由使用
  • 2. 声明式导航
  • 3. 编程式导航


1. 路由使用

安装路由模块:

路由模块不是react自带模块,需要安装第3方模块:

yarn add react-router-dom@5

路由相关组件:

  1. 路由模式组件:包裹整个应用,一个React应用只需要使用一次

    HashRouter: 使用URL的哈希值实现 (localhost:3000/#/first

    BrowserRouter:使用H5的history API实现(localhost3000/first

  2. 导航组件:用于指定导航链接, 最终Link会编译成a标签

    Link: 不会有激活样式

    NavLink:如果地址栏中的地址和 to 属性相匹配,则会有激活样式

  3. 路由规则定义组件:指定路由规则和对应匹配成功后要渲染的组件

    Route:

    path属性:路由路径,在地址栏中访问的地址

    component属性:和规则匹配成功后渲染的组件 /render/children

各组件关系示意图:

在这里插入图片描述

定义路由的模式:

为了日后让当前项目中所有的组件都受到路由控制,定义在index.js中,在最顶层定义路由模式。src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './utils/init'

// 引入路由相关组件  路由模式组件,告诉当前项目,我们要使用的路由模式
// HashRouter hash路由模式
// BrowserRouter history路由模式,上线时,需要对nginx进行配置
import { BrowserRouter as Router, HashRouter } from 'react-router-dom'

ReactDOM.render(
  <Router>
    <App />
  </Router>,
  document.getElementById('root')
)

定义路由规则:

路由规则组件可以定义在src/index.js文件中,也可以定义在App组件中。

本次定义在src/App.js文件中。

import React, { Component } from 'react'
// Route 定义路由规则  路由地址和匹配成功后要渲染的组件
import { Route } from 'react-router-dom'

// 匹配成功后渲染的组件
import Home from './views/Home'
import About from './views/About'

class App extends Component {
  render() {
    return (
      <div>
        <h3>App组件</h3>
        <hr />
        {/* 定义路由规则 */}
        <Route path="/home" component={Home} />
        <Route path="/about" component={About} />
      </div>
    )
  }
}

export default App

在这里插入图片描述

2. 声明式导航

描述:

使用 Link 或 NavLink 组件完成声明式导航的定义、

Link/NavLink 区别:

  • Link组件不会根据路由的变化而添加或修改编译后html标签中的属性

  • NavLink会根据路由的变化而自动修改编译后html标签中的属性

    如果当前的路由规则和 Navlink 中的 To 所写的规则一致则添加 class 样式,

    默认名称为 active,可以通过 activeClassName 来修改匹配成功后样式名称。

使用:

import React, { Component } from 'react'
// Route 定义路由规则  路由地址和匹配成功后要渲染的组件
// Link 导航组件,它编译生成后的html标签只能是 a
// NavLink 导航组件,它编译生成后的html标签只能是 a,但是它有激活样式(地址栏中的地址和to属性匹配,就有内置样式名)
import { Route, Link, NavLink } from 'react-router-dom'

// 匹配成功后渲染的组件
import Home from './views/Home'
import About from './views/About'

class App extends Component {
  render() {
    return (
      <div>
        <h3>App组件</h3>
        <div>
          {/* <Link to="/home">Home</Link> ---
          <Link to="/about">About</Link> */}
          {/* 
            NavLink 匹配规则,默认为模糊匹配
            严格匹配:exact
            修改激活样式名称:activeClassName='aaa'
          */}
          {/* <NavLink exact activeClassName='aa' to="/">Home</NavLink> --- */}
          <NavLink exact to="/">Home</NavLink>---
          <NavLink to="/about">About</NavLink>
        </div>
        <hr />

        {/* 定义路由规则 */}
        {/* 
        匹配默认为模糊匹配,而且它还会一直匹配到没有规则组件为止
        严格匹配:exact
        */}
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
      </div>
    )
  }
}

export default App

在这里插入图片描述

利用 Switch 严格匹配路由:

import React, { Component } from 'react'
// Route 定义路由规则  路由地址和匹配成功后要渲染的组件
// Link 导航组件,它编译生成后的html标签只能是 a
// NavLink 导航组件,它编译生成后的html标签只能是 a,但是它有激活样式(地址栏中的地址和to属性匹配,就有内置样式名)
// Switch 多个路由规则只匹配一个
import { Route, Link, NavLink, Switch } from 'react-router-dom'

// 匹配成功后渲染的组件
import Home from './views/Home'
import About from './views/About'

class App extends Component {
  render() {
    return (
      <div>
        <h3>App组件</h3>
        <div>
          {/* <Link to="/home">Home</Link> ---
          <Link to="/about">About</Link> */}
          {/* 
            NavLink 匹配规则,默认为模糊匹配
            严格匹配:exact
            修改激活样式名称:activeClassName='aaa'
          */}
          {/* <NavLink exact activeClassName='aa' to="/">Home</NavLink> --- */}
          <NavLink exact to="/">Home</NavLink>---
          <NavLink to="/about">About</NavLink>
        </div>
        <hr />

        {/* 定义路由规则 */}
        {/* 
        匹配默认为模糊匹配,而且它还会一直匹配到没有规则组件为止
        严格匹配:exact
        */}
        <Switch>
        <Route path="/about" component={About} />
        {/* 注意这个规则要放在最后,否则所有路由都会走 home 页面 */}
        <Route path="/" component={Home} />
        </Switch>
      </div>
    )
  }
}

export default App

在这里插入图片描述

重定向和404:

import React, { Component } from 'react'
// Route 定义路由规则  路由地址和匹配成功后要渲染的组件
// Link 导航组件,它编译生成后的html标签只能是 a
// NavLink 导航组件,它编译生成后的html标签只能是 a,但是它有激活样式(地址栏中的地址和to属性匹配,就有内置样式名)
// Switch 多个路由规则只匹配一个
// Redirect 重定向  使用它,一定要用到Switch,否则有死循环的问题
import { Route, Link, NavLink, Switch, Redirect } from 'react-router-dom'

// 匹配成功后渲染的组件
import Home from './views/Home'
import About from './views/About'
// import Detail from './views/Detail'
import Notfound from './views/Notfound'

class App extends Component {
  render() {
    return (
      <div>
        <h3>App组件</h3>
        <div>
          <NavLink exact to="/">Home</NavLink>---
          <NavLink to="/about">About</NavLink>
        </div>
        <hr />
        <Switch>
        {/* 如果你想用对于匹配渲染成功后的组件使用编程式导航,你默认情况下,你只能在规则匹配成功后的组件本身中使用,它的子组件都不行 */}
        <Route path="/home" component={Home} />
        <Route path="/about" component={About} />
        {/* 重定向 */}
        <Redirect exact from="/" to="/home" />
        {/* 以上的路由没有一个匹配成功的,则用404页面 path属性不要写 */}
        <Route component={Notfound} />
        </Switch>
      </div>
    )
  }
}

export default App

在这里插入图片描述

3. 编程式导航

App.jsx:

import React, { Component } from 'react'
import { Route, Link, NavLink, Switch, Redirect } from 'react-router-dom'

// 匹配成功后渲染的组件
import Home from './views/Home'
import About from './views/About'
// import Detail from './views/Detail'
import Notfound from './views/Notfound'

class App extends Component {
  render() {
    return (
      <div>
        <h3>App组件</h3>
        <div>
          <NavLink exact to="/">Home</NavLink>---
          <NavLink to="/about">About</NavLink>
        </div>
        <hr />

        <Switch>
        {/* 如果你想用对于匹配渲染成功后的组件使用编程式导航,你默认情况下,你只能在规则匹配成功后的组件本身中使用,它的子组件都不行 */}
        <Route path="/home" component={Home} />
        <Route path="/about" component={About} />

        {/* 重定向 */}
        <Redirect exact from="/" to="/home" />
        {/* 以上的路由没有一个匹配成功的,则用404页面 path属性不要写 */}
        <Route component={Notfound} />
        </Switch>
      </div>
    )
  }
}

export default App

home组件:

import React, { Component } from 'react'
import Btn from './Btn'

class Home extends Component {
  jumpUrl = () => {
    // 写法1
    // this.props.history.push('/about')
    // 写法2
    this.props.history.push({
      pathname: '/about'
    })
  }

  render() {
    return (
      <div>
        <h3>首页展示</h3>
        <button onClick={this.jumpUrl}>home组件中回关于</button>
        <Btn {...this.props} />
      </div>
    )
  }
}

export default Home

btn组件:

import React, { Component } from 'react'

class Btn extends Component {
  jumpUrl = () => {
    this.props.history.push('/about')
  }
  render() {
    return <button onClick={this.jumpUrl}>在btn组件中回关于</button>
  }
}

export default Btn

在这里插入图片描述

注意:

  1. 如果你想用对于匹配渲染成功后的组件使用编程式导航,默认情况下,你只能在规则匹配成功后的组件本身中使用,它的子组件都不行
  2. 直接匹配的路由的子组件要想使用编程式导航,则需要给他传递 props

相关文章:

  • Java_四种内部类
  • Java lang包简介说明
  • 推荐一款替代Navicat的MySQL数据库管理工具-HeidSQL
  • R语言使用lm函数构建分层线性回归模型(添加分组变量构建分层线性回归模型)、使用summary函数获取分层线性回归模型汇总统计信息
  • Maven坐标查找方法及Maven-Search 插件的使用(保姆级教学)
  • 搭建nodejs环境
  • 【Android】之屏幕适配
  • 【JavaScript】五个常用功能/案例:计时器 | 流程控制 | 闭包应用 | arguments剩余参数 | 二次封装函数
  • Java Applet
  • 回归分析与模型诊断——作业
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • CF1443C题解
  • Tomcat相关概念
  • 网上商城之订单
  • 数学建模----拟合的实现
  • 「面试题」如何实现一个圣杯布局?
  • 【译】理解JavaScript:new 关键字
  • 11111111
  • eclipse的离线汉化
  • Java新版本的开发已正式进入轨道,版本号18.3
  • spring-boot List转Page
  • 如何解决微信端直接跳WAP端
  • 自定义函数
  • ionic异常记录
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #pragma预处理命令
  • (007)XHTML文档之标题——h1~h6
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (多级缓存)多级缓存
  • (分享)自己整理的一些简单awk实用语句
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)nsfocus-绿盟科技笔试题目
  • .gitignore文件_Git:.gitignore
  • .net 按比例显示图片的缩略图
  • .NET分布式缓存Memcached从入门到实战
  • .net项目IIS、VS 附加进程调试
  • [ Linux ] Linux信号概述 信号的产生
  • [APIO2015]巴厘岛的雕塑
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!
  • [Codeforces] probabilities (R1600) Part.1
  • [hdu 2896] 病毒侵袭 [ac自动机][病毒特征码匹配]
  • [Labtools 27-1429] XML parser encountered a problem in file
  • [LeetBook]【学习日记】获取子字符串 + 颠倒子字符串顺序
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
  • [Linux] LVS+Keepalived高可用集群部署
  • [MTK]安卓8 ADB执行ota升级
  • [Noi2015]程序自动分析
  • [SystemVerilog]常见设计模式/实践