五分钟教你了解一下react路由知识

目录
  • 什么是路由
  • 纯组件的基本使用
  • 纯组件使用的注意点
  • 路由的基本初体验
  • HashRouter和BrowserRouter
  • Link组件和NavLink组件
  • Route和Switch组件
  • 路由传参

什么是路由

简单的说就是根据不同的地址,web服务器处理不同的业务以及逻辑。

以下代码全部运行在react脚手架中

纯组件的基本使用

// 组件更新机制:
// 只要父组件重新渲染了, 所有的组件子树, 也会更新

// 性能优化
// 1. 减轻state

// 2. 避免不必要的重新渲染 (性能优化)
//    shouldComponentUpdate(nextProps, nextState) { .... }
//    钩子函数返回一个布尔值, true要更新 false不更新
//    手动实现固然是可以的, 但是太麻烦

// 3. 实际官网提供了一个纯组件, 内部已经帮你实现好了 shouldComponentUpdate 的逻辑
//    会帮你进行props 和 state的比对, 决定是否要更新
//    普通组件: class App extends React.Component
//    纯组件:   class App extends React.PureComponent  会比普通组件, 多一个比对数据的过程

//    比如: 一个组件要渲染出来, 性能损耗很大, 此时可以考虑纯组件, 避免掉一些无意义的更新
//    不是所有的场景, 都要用纯组件, 正常应该都用普通组件

import React from 'react'
import ReactDOM from 'react-dom'

class App extends React.PureComponent {
  state = {
    nameList: ['帅鹏', '吕布', '张飞'],
    currentName: '',
  }
  render() {
    console.log('App-render')
    return (
      <div>
        <h1>我是App组件</h1>
        <h3>结果: {this.state.currentName}</h3>
        <button onClick={this.handleClick.bind(this)}>点名</button>
      </div>
    )
  }
  handleClick() {
    const randomIndex = parseInt(Math.random() * this.state.nameList.length)
    const currentName = this.state.nameList[randomIndex]

    this.setState({
      currentName,
    })
    console.log(currentName)
  }

  // 需求: 如果state的值, 没有发生变化, 其实也不需要更新, 避免一些不必要的更新
  // shouldComponentUpdate(nextProps, nextState) {
  //   if (this.state.currentName === nextState.currentName) {
  //     return false
  //   } else {
  //     return true
  //   }
  // }
}
ReactDOM.render(<App></App>, document.getElementById('root'))

纯组件使用的注意点

// 4. 纯组件的使用注意点  (如果纯组件有子组件, 子组件也要是纯组件 (一家子都纯))
// (1) 纯组件内部进行的是浅层对比, 值类型没有问题, 复杂类型只比较地址
// (2) 使用纯组件, 更新数据时, 简单类型没有问题, 复杂类型更新了, 是需要修改地址的(新对象 / 新数组)

import React from 'react'
import ReactDOM from 'react-dom'

class App extends React.PureComponent {
  state = {
    nameList: ['帅鹏', '吕布', '张飞'],
    currentName: '',
    obj: {
      name: 'zs',
      age: 18,
    },
  }
  render() {
    console.log('App-render')
    return (
      <div>
        <h1>我是App组件</h1>
        <p>name: {this.state.obj.name}</p>
        <p>{this.state.nameList}</p>
        <button onClick={this.handleClick.bind(this)}>改值</button>
      </div>
    )
  }
  handleClick() {
    // 要更新对象, 要准备一个新对象
    // const obj = { ...this.state.obj }
    // obj.name = 'ls'
    // this.setState({
    //   obj: obj,
    // })
    // 要更新数组, 要准备一个新数组
    // this.setState({
    //   nameList: [...this.state.nameList, '王五'],
    // })
    const arr = [...this.state.nameList]
    arr.push('王五')
    this.setState({
      nameList: arr,
    })
  }
}
ReactDOM.render(<App></App>, document.getElementById('root'))

路由的基本初体验

import React from 'react'
import ReactDOM from 'react-dom'
import { HashRouter, Link, Route } from 'react-router-dom'

// 路由的使用:
// 1. 下载 yarn add react-router-dom
// 2. react-router-dom是一个包, 包含了很多的组件
// 3. HashRouter组件, 是整个的路由对象, 一个项目就一个, 需要将整个项目的内容包裹
// 4. Link组件, 渲染成一个 a 链接, 可以用于路由跳转, 通过 to 配置路径
// 5. Route组件, 配置路由规则(哪个路径匹配哪个组件), 也是路由出口!
//    每个Route互相之间是独立的, 只要路径匹配, 就可以展示配置的组件

// 定义了三个函数组件
const Home = () => <div>我是Home组件</div>
const Login = () => <div>我是Login组件</div>
const User = () => <div>我是User组件</div>

class App extends React.PureComponent {
  render() {
    return (
      <div>
        <h1>我是App组件</h1>
        <ul>
          <li>
            <Link to="/home">首页</Link>
          </li>
          <li>
            <Link to="/login">登录</Link>
          </li>
          <li>
            <Link to="/user">用户</Link>
          </li>
        </ul>

        {/* 只要path路径, 和地址栏的路径匹配, 就会展示配置的组件 */}
        <Route path="/home" component={Home}></Route>
        <Route path="/login" component={Login}></Route>
        <Route path="/user" component={User}></Route>
      </div>
    )
  }
}
ReactDOM.render(
  <HashRouter>
    <App></App>
  </HashRouter>,
  document.getElementById('root')
)

HashRouter和BrowserRouter

import React from 'react'
import ReactDOM from 'react-dom'
import { HashRouter as Router, Link, Route } from 'react-router-dom'

// Router组件, 有两种 HashRouter, BrowserRouter
// 1. HashRouter底层实现基于: 地址栏的hash值, 基于锚点跳转实现的
// 2. BrowserRouter底层实现基于: h5 的 history API, 地址栏没有 #
//   (如果要用开发时, 没有问题, 但是上线了, 是需要后台配置的)

// 定义了三个函数组件
const Home = () => <div>我是Home组件</div>
const Login = () => <div>我是Login组件</div>
const User = () => <div>我是User组件</div>

class App extends React.PureComponent {
  render() {
    return (
      <div>
        <h1>我是App组件</h1>
        <ul>
          <li>
            <Link to="/home">首页</Link>
          </li>
          <li>
            <Link to="/login">登录</Link>
          </li>
          <li>
            <Link to="/user">用户</Link>
          </li>
        </ul>

        {/* 只要path路径, 和地址栏的路径匹配, 就会展示配置的组件 */}
        <Route path="/home" component={Home}></Route>
        <Route path="/login" component={Login}></Route>
        <Route path="/user" component={User}></Route>
      </div>
    )
  }
}
ReactDOM.render(
  <Router>
    <App></App>
  </Router>,
  document.getElementById('root')
)

Link组件和NavLink组件

import React from 'react'
import ReactDOM from 'react-dom'
import { HashRouter as Router, NavLink, Route } from 'react-router-dom'
import './index.css'

// Link组件 和 NavLink组件
// 1. Link组件, 渲染成a链接, 用于路由跳转, 通过to配置路径
//    默认的Link, 不会有高亮的类名标识
// 2. NavLink组件, 渲染成a链接, 用于路由跳转, 通过to配置路径
//    (1) NavLink, 在路径匹配时, 会有高亮的类名 active
//    (2) 可以通过activeClassName, 配置高亮的类名
//    (3) 可以通过activeStyle, 直接配置改标签, 高亮的样式
//    (4) 进行的是模糊匹配  to="/home" 可以匹配  /home  /home/aa
//        精确匹配, 需要配置 exact 属性,  to="/home", 只能匹配 /home, 只会在 /home 时高亮

// 定义了三个函数组件
const Home = () => <div>我是Home组件</div>
const Login = () => <div>我是Login组件</div>
const User = () => <div>我是User组件</div>

class App extends React.PureComponent {
  render() {
    return (
      <div>
        <h1>我是App组件</h1>
        <ul>
          <li>
            <NavLink
              exact
              to="/"
              activeStyle={{ color: 'red', fontSize: '30px' }}
            >
              首页
            </NavLink>
          </li>
          <li>
            <NavLink to="/login" activeClassName="selected">
              登录
            </NavLink>
          </li>
          <li>
            <NavLink to="/user" activeClassName="selected">
              用户
            </NavLink>
          </li>
        </ul>

        {/* 只要path路径, 和地址栏的路径匹配, 就会展示配置的组件 */}
        <Route path="/home" component={Home}></Route>
        <Route path="/login" component={Login}></Route>
        <Route path="/user" component={User}></Route>
      </div>
    )
  }
}
ReactDOM.render(
  <Router>
    <App></App>
  </Router>,
  document.getElementById('root')
)
/**index.css*/
.active {
  color: red;
  font-size: 30px;
}
.selected {
  color: blue;
  font-size: 30px;
}

Route和Switch组件

import React from 'react'
import ReactDOM from 'react-dom'
import { HashRouter as Router, NavLink, Route, Switch } from 'react-router-dom'
import './index.css'

// Route组件
// 作用: 可以配置路由规则, 也是路由的出口, 只要路径匹配了, 那么配置的组件, 就会在这里展示
// <Route path="/login" component={Login}></Route>
// 1. 每个Route之间, 互相是独立的 (包括配置多个相同路径, 显示不同组件, 也是可以的)
// 2. Route配置的路径, 也是进行的模糊匹配, 可以通过 exact 进行精确匹配
// 3. 如果不配置路径, 那么配置的组件, 默认都会展示
//    会配合Switch组件, 可以完成404页面的配置

// Switch组件: 可以将多个Route组件包裹, 可以让第一个匹配的Route组件展示, 后续的不管

// 定义了函数组件
const Home = () => <div>我是Home组件</div>
const Login = () => <div>我是Login组件</div>
const User = () => <div>我是User组件</div>
const Error = () => <div>我是404页面, 您要访问的页面不存在!!!</div>

class App extends React.PureComponent {
  render() {
    return (
      <div>
        <h1>我是App组件</h1>
        <ul>
          <li>
            <NavLink
              exact
              to="/"
              activeStyle={{ color: 'red', fontSize: '30px' }}
            >
              首页
            </NavLink>
          </li>
          <li>
            <NavLink to="/login" activeClassName="selected">
              登录
            </NavLink>
          </li>
          <li>
            <NavLink to="/user" activeClassName="selected">
              用户
            </NavLink>
          </li>
        </ul>

        {/* 只要path路径, 和地址栏的路径匹配, 就会展示配置的组件 */}
        <Switch>
          <Route path="/" component={Home} exact></Route>
          <Route path="/login" component={Login}></Route>
          <Route path="/user" component={User}></Route>
          <Route component={Error}></Route>
        </Switch>
      </div>
    )
  }
}
ReactDOM.render(
  <Router>
    <App></App>
  </Router>,
  document.getElementById('root')
)

嵌套路由

import React from 'react'
import ReactDOM from 'react-dom'
import {
  HashRouter as Router,
  NavLink,
  Route,
  Switch,
  Redirect,
} from 'react-router-dom'
import './index.css'

// Redirect组件: 可以重定向, from从哪  to跳到哪

// react中, 配置嵌套路由, 非常的简单, 你只需要在需要写嵌套子路由的地方, 直接写Route组件即可
// 前提条件, 你配置的嵌套子路由, 路径一定要包含父路由的路径

// 定义了函数组件
const Home = () => (
  <div>
    <h3>我是Home组件</h3>
  </div>
)
const Login = () => (
  <div>
    <h3>我是Login组件</h3>
  </div>
)
// ------------------------------------------------------------------------
// 需求: 用户User组件内部, 还有个人信息, 我的收藏
const User = () => (
  <div>
    <h3>我是User组件</h3>
    <Route path="/user" exact component={UserDefault}></Route>
    <Route path="/user/info" component={Info}></Route>
    <Route path="/user/star" component={Star}></Route>
  </div>
)
const UserDefault = () => <div>我是默认的User内容</div>
const Info = () => <div>我是Info组件</div>
const Star = () => <div>我是Star组件</div>

// -------------------------------------------------------------------------
const Error = () => <div>我是404页面, 您要访问的页面不存在!!!</div>

class App extends React.PureComponent {
  render() {
    return (
      <div>
        <h1>我是App组件</h1>
        <ul>
          <li>
            <NavLink
              exact
              to="/"
              activeStyle={{ color: 'red', fontSize: '30px' }}
            >
              首页
            </NavLink>
          </li>
          <li>
            <NavLink to="/login" activeClassName="selected">
              登录
            </NavLink>
          </li>
          <li>
            <NavLink to="/user" activeClassName="selected">
              用户
            </NavLink>
          </li>
        </ul>

        {/* 只要path路径, 和地址栏的路径匹配, 就会展示配置的组件 */}
        <Switch>
          <Route path="/" component={Home} exact></Route>
          <Redirect from="/home" to="/"></Redirect>
          <Route path="/login" component={Login}></Route>
          <Route path="/user" component={User}></Route>
          <Route component={Error}></Route>
        </Switch>
      </div>
    )
  }
}
ReactDOM.render(
  <Router>
    <App></App>
  </Router>,
  document.getElementById('root')
)

路由传参

import React from 'react'
import ReactDOM from 'react-dom'
import { HashRouter as Router, Route, Link } from 'react-router-dom'
import './index.css'

// 如果想拿到动态路由的参数信息, 需要通过props获取,
// Route会将路由相关信息, 相关方法, 都会通过 props 传给你的组件
// const Product = (props) => <div>我是product组件</div>

class Product extends React.Component {
  render() {
    // this.props 参数
    // (1) history  里面存放的是跳转路由的方法
    // (2) location  里面存放的是当前路由地址
    // (3) match 里面存放的是动态路由参数
    console.log(this.props)
    console.log(this.props.match.params.id)
    return (
      <div>
        <h3>我是product组件 - {this.props.match.params.id}</h3>
        <button onClick={this.handleClick.bind(this)}>回首页</button>
      </div>
    )
  }
  handleClick() {
    // console.log(this.props.history)
    // this.props.history.go(-1)
    this.props.history.push('/home')
  }
}

const Home = () => <div>我是首页</div>

class App extends React.Component {
  render() {
    return (
      <div>
        <h1>我是App组件</h1>
        <div>
          <Link to="/home">首页</Link>
          <Link to="/product/1">商品1</Link>
          <Link to="/product/2">商品2</Link>
          <Link to="/product/3">商品3</Link>
          <Link to="/product/4">商品4</Link>
        </div>
        <Route path="/product/:id" component={Product}></Route>
        <Route path="/home" component={Home}></Route>
      </div>
    )
  }
}
ReactDOM.render(
  <Router>
    <App></App>
  </Router>,
  document.getElementById('root')
)

到此这篇关于五分钟教你了解一下react路由知识的文章就介绍到这了,更多相关react路由内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解各版本React路由的跳转的方法

    前言 React-Router已经发布了多个版本,利用路由导航的使用方法都不大一样,在这里总结一下. React-Router 2.0.0 版本 2.0.0版本需要使用browserHistory进行跳转,具体参考一下代码: import { browserHistory } from 'react-router' browserHistory.push('/path') React-Router 2.4.0版本以上 React-Router 2.4.0版本以上,可以通过mixin的方法,使组件

  • Nginx配置React项目Url后直接输入路由路径时报404问题的解决

    前言 如今react应用普遍,最近在配置react项目中遇到了一个问题,通过查找相关的资料终于找到了解决的方法,所以想着总结一下分享出来给有需要的朋友们,下面话不多说了,来一起看看详细的介绍吧. 发现问题 大家都知道,当我们写完项目后,要对项目进行部署,我的配置很简单 location /demo { root E:/; index index.html index.htm; } 这样配置的有一个问题,只能 http://localhost/demo/来访问. 如果想访问里面的其它界面如 htt

  • React 路由懒加载的几种实现方案

    这篇文字简单的介绍了React在路由懒加载方面的几种实现方案. 传统的两种方式 import() 符合ECMAScript提议的import()语法,该提案与普通 import 语句或 require 函数的类似,但返回一个 Promise 对象.这意味着模块时异步加载的 webpack v2+ 使用 使用方式 function component() { return import( /* webpackChunkName: "lodash" */ 'lodash').then(_

  • React从react-router路由上做登陆验证控制的方法

    本文介绍了React从react-router路由上做登陆验证控制的方法,分享给大家,具体如下: 验证代码 import React from 'react' import {connect} from 'react-redux'; function requireAuthentication(Component) { // 组件有已登陆的模块 直接返回 (防止从新渲染) if (Component.AuthenticatedComponent) { return Component.Authe

  • react路由配置方式详解

    本文介绍了react路由配置,最近刚开始学,分享给大家,顺便给自己留个笔记. 包含了LInk跳转以及js触发跳转并传参. 这是项目的目录结构,主要的代码都在src目录下,src下面新建一个containers文件夹放我们的一些组件,router文件夹是配置路由用的. 按照顺序来写:detail文件夹下的代码 import React from 'react' class Detail extends React.Component { render() { return ( <p>Detail

  • react-router4 嵌套路由的使用方法

    react我自己还在摸索学习中,今天正好学习一下react-router4 嵌套路由的使用方法,顺便留着笔记 先直接贴代码 import React from 'react'; import ReactDOM from 'react-dom'; import { HashRouter as Router, Route, Switch} from 'react-router-dom'; import createBrowserHistory from 'history/createBrowserH

  • 五分钟教你了解一下react路由知识

    目录 什么是路由 纯组件的基本使用 纯组件使用的注意点 路由的基本初体验 HashRouter和BrowserRouter Link组件和NavLink组件 Route和Switch组件 路由传参 什么是路由 简单的说就是根据不同的地址,web服务器处理不同的业务以及逻辑. 以下代码全部运行在react脚手架中 纯组件的基本使用 // 组件更新机制: // 只要父组件重新渲染了, 所有的组件子树, 也会更新 // 性能优化 // 1. 减轻state // 2. 避免不必要的重新渲染 (性能优化

  • 五分钟教你使用vue-cli3创建项目(新手入门)

    目录 一.搭建vue环境 二.Vue脚手架工具 三.创建项目 四.选择manually select (enter键确认,并进入下一步) 五.选择完成之后回车 这里我们选择3.x的 六.完成之后回车 出现以下界面 七.回车 出现以下界面 八.回车出现以下界面 九.回车出现以下界面 十.回车出现以下界面 十一.回车出现以下界面 十二.根据提示,启动项目 一.搭建vue环境 安装Nodejs 官网下载Nodejs,如果希望稳定的开发环境则下LTS(Long Time Support)长期支持版,稳定

  • 五分钟教你手写 SpringBoot 本地事务管理实现

    白菜Java自习室 涵盖核心知识 1. SpringBoot 事务 一直在用 SpringBoot 中的 @Transactional 来做事务管理,但是很少没想过 SpringBoot 是如何实现事务管理的,今天从源码入手,看看 @Transactional 是如何实现事务的,最后我们结合源码的理解,自己动手写一个类似的注解来实现事务管理,帮助我们加深理解. 1.1. 事务的隔离级别 事务为什么需要隔离级别呢?这是因为在并发事务情况下,如果没有隔离级别会导致如下问题: 脏读 (Dirty Re

  • 五分钟教你Android-Kotlin项目编写

    背景 之前就看到过Kotlin这一门语言,也有不少大神和愿意走在知识最前沿的哥哥姐姐们说这一门语言有多么多么的好,但是本人并没有去了解他,直到前段时间Google大会直接说会支持Kotlin语言,所以我就抽出了一点时间准备学习一下,个人觉得到目前为止这个东西并不是什么刚需,有兴趣可以学习,不想学影响也不是很大,好了关于这门语言有多好,有多叼,我就不多少了,想要了解的出门百度,这里给上源码链接Kotlin-Android项目. 插件安装 环境搭建当然是第一步,也是最重要的一步,但是这个Kotlin

  • 五步教你用Nginx部署Vue项目及解决动态路由刷新404问题

    目录 步骤一:改端口 步骤二: 打包 步骤三:将dist文件夹上传到服务器上 步骤四:修改nginx.conf(重中之重) 步骤五:重启nginx 总结 期末月前本来部署过一次,昨天部署的时候发现又给忘了,而且出了很多问题,在这统一汇总一下. 步骤一:改端口 在vue.config.js下的devServer把host改成服务器的地址 步骤二: 打包 用npm run build打包,最后是这样的,并且目录下多了个dist文件夹 步骤三:将dist文件夹上传到服务器上 我用的xshell,没办法

  • React路由鉴权的实现方法

    前言 上一篇文章中有同学提到路由鉴权,由于时间关系没有写,本文将针对这一特性对 vue 和 react 做专门说明,希望同学看了以后能够受益匪浅,对你的项目能够有所帮助,本文借鉴了很多大佬的文章篇幅也是比较长的. 背景 单独项目中是希望根据登录人来看下这个人是不是有权限进入当前页面.虽然服务端做了进行接口的权限,但是每一个路由加载的时候都要去请求这个接口太浪费了.有时候是通过SESSIONID来校验登陆权限的. 在正式开始 react 路由鉴权之前我们先看一下vue的路由鉴权是如何工作的: 一.

  • 10分钟教你本地配置多个git ssh连接的方法

    前言 你最近换电脑了吗?还记得如何在本地配置多个 git ssh 连接吗?一般公司用的是自己内网部署的 gitlab 服务器进行代码管理,开发者使用的是公司的用户名和公司的邮箱,而在个人的开源项目中,我们的代码托管于 github,这个时候就需要两个或多个以上的 SSH-Key 去进行登录,方便代码的拉取与推送. 文章大纲 查看所有 ssh key 分别配置 gitlab 内网 和 github 外网 ssh 进行测试 第一步:查看所有 SSH-Key 打开 bash/zsh 终端:执行以下命令

  • 睡五分钟等于六钟头的方法(熬夜站长必看)

    睡觉的诀窍 根据医学和我的体验.观察,一个人真正睡着觉最多只有两个钟头,其余都是浪费时间,躺在枕头上做梦,没有哪个人不做梦.至于醒来觉得自己没有做梦,那是因为他忘记了. 通常一个人睡两个钟头就够了,为什么有人要睡七.八个钟头?那是你赖床躺在枕头上休息的习惯养成的,并非我们需要那么久的睡眠时间,尤其打坐做功夫的人晓得,正午只要闭眼真正睡着三分钟,等于睡两个钟头,不过要对好正午的时间.夜晚则要在正子时睡着,五分钟等于六个钟头. 就这个时间的学问又大了,同宇宙法则.地球法则.易经阴阳的道理有关系,而且

  • 四步五分钟Spring4快速集成Swagger

    如果你所在的公司的还没有使用swagger甚至没有听说过swagger,赶快学习一下我的这篇博客吧,五分钟速成,傻瓜式的集成,但就是这么简单的应用一定会让他们震惊到的. 首先对swagger做一个简介吧:swagger是后台开发的神器,也是前后端交流的渠道.你可以用swagger做什么?首先,你以后基本可以告别单元测试了:其次,你不用再写接口文档了,也不需要写完之后再去对文档进行维护了.swagger可以完全模拟http请求,入参出参和实际情况差别几乎为零.说了这些,直接来干货吧! 集成四部曲:

随机推荐