React路由规则定义与声明式导航及编程式导航分别介绍

 更新时间:2022年09月28日 16:53:25   作者:月光晒了很凉快  
这篇文章主要介绍了React路由规则的定义、声明式导航、编程式导航,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

1. 路由使用

安装路由模块:

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

yarn add react-router-dom@5

路由相关组件:

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

  • HashRouter: 使用URL的哈希值实现 (localhost:3000/#/first
  • BrowserRouter:使用H5的history API实现(localhost3000/first

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

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

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

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

注意:

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

到此这篇关于React路由规则定义与声明式导航及编程式导航分别介绍的文章就介绍到这了,更多相关React路由规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React组件化学习入门教程讲解

    React组件化学习入门教程讲解

    React是现在前端使用频率最高的三大框架之一,React率先提出虚拟DOM的思想和实现,使其保持有良好的性能。本篇文章将对React组件化的入门学习进行讲解,同时针对模块化的思想进行概述,为接下来组件化开发的文章进行知识储备
    2022-09-09
  • react 页面加载完成后自动执行标签的点击事件的两种操作方法

    react 页面加载完成后自动执行标签的点击事件的两种操作方法

    这篇文章主要介绍了react 页面加载完成后自动执行标签的点击事件,本文给大家分享两种操作方法结合示例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-12-12
  • React使用Props实现父组件向子组件传值

    React使用Props实现父组件向子组件传值

    在React中,组件之间的数据传递通常是通过属性(Props)来实现的,父组件可以通过属性向子组件传递数据,这是React组件通信的基础模式之一,本文将探讨如何使用Props来实现父组件向子组件传递数据,需要的朋友可以参考下
    2025-04-04
  • useEffect中return函数的作用和执行时机解读

    useEffect中return函数的作用和执行时机解读

    这篇文章主要介绍了useEffect中return函数的作用和执行时机,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 使用React代码动态生成栅格布局的方法

    使用React代码动态生成栅格布局的方法

    这篇文章主要介绍了使用React简短代码动态生成栅格布局的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • React组件、状态管理、代码优化的技巧

    React组件、状态管理、代码优化的技巧

    文章总结了React组件设计、状态管理、代码组织和优化的技巧,它涵盖了使用Fragment、props解构、defaultProps、key和ref的使用、渲染性能优化等方面
    2024-11-11
  • 基于React Hooks的小型状态管理详解

    基于React Hooks的小型状态管理详解

    本文主要介绍一种基于 React Hooks 的状态共享方案,介绍其实现,并总结一下使用感受,目的是在状态管理方面提供多一种选择方式。感兴趣的小伙伴可以了解一下
    2021-12-12
  • React使用Echarts/Ant-design-charts的案例代码

    React使用Echarts/Ant-design-charts的案例代码

    这篇文章主要介绍了React使用Echarts/Ant-design-charts的实例代码,本文通过实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • 详解react-webpack2-热模块替换[HMR]

    详解react-webpack2-热模块替换[HMR]

    这篇文章主要介绍了详解react-webpack2-热模块替换[HMR], 小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 使用react render props实现倒计时的示例代码

    使用react render props实现倒计时的示例代码

    这篇文章主要介绍了使用react render props实现倒计时的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12

最新评论