React 当中的路由

使用React构建的单页面应用,要想实现页面间的跳转,首先想到的就是使用路由。在React中,常用的有两个包可以实现这个需求,那就是react-router和react-router-dom。本文主要针对react-router-dom进行说明。

安装react-router-dom

  • npm install react-router-dom --save
  • yarn add react-router-dom // 本人喜欢的安装包方式 不了解的可以去看一下yarn官网

基本操作

首先我们新建两个组件(以下操作都是在react框架当中的操作 并不是原生react)

one 组件

import React, { Component } from 'react'

export default class One extends Component {
render() { return (
<div>
one
</div>
)
}
}

two 组件

import React, { Component } from 'react'

export default class Two extends Component {
render() {
return (
<div>
two
</div>
)
}
}

当我们在React当中使用路由的时候,必须在index.js这个入口文件引入路由

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker'; import { BrowserRouter as Router } from 'react-router-dom' //引入路由
ReactDOM.render(
<Router>
<App />
</Router>
, document.getElementById('root')); // If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

浏览器有两种模式 历史记录模式(BrowserRouter) 哈希模式(HashRouter)

在这里我们使用的是历史记录模式

import { BrowserRouter as Router } from 'react-router-dom' //引入路由

因为 BrowserRouter太长了!! 所以我们用as给他起了一个别名Router。

通过Router包裹App组件我们就可以使用路由了,它同时也解决了路由传参的问题。这一步是必不可少的

在App.js当中

import React from 'react';
import './App.css';
import One from './component/one'
import Two from './component/two'
import { Route, Link, NavLink, Redirect, withRouter, Switch } from 'react-router-dom'
class App extends React.Component {
render() {
return (
<div className="App" > <Link to="/one">one组件</Link>
<Link to="/two">two组件</Link> <Route path='/one' component={One}></Route>
<Route path='/two' component={Two}></Route> </div>
);
}
} export default App;

第一步:我们需要引入One组件和Two组件

第二步:我们需要引入两个标签 Route 和 Link

第三步:路由跳转是根据路径来跳转的 这个步骤是由Route标签来实现的 path属性是目标地址 component是当路径是/one 的时候我们调用的组件名字

然后我们就可以实现路由切换

在路由切换的过程中也可以使用NavLink

import React from 'react';
import './App.css';
import One from './component/one'
import Two from './component/two'
import { Route, Link, NavLink, Redirect, withRouter, Switch } from 'react-router-dom'
class App extends React.Component {
change = () => {
this.props.history.push('two')
}
render() {
return (
<div className="App" > <NavLink to="/one">one组件</NavLink>
<NavLink to="/two">two组件</NavLink>
<Route path='/one' component={One}></Route>
<Route path='/two' component={Two}></Route> </div>
);
}
} export default App;

NavLink和Link无本质的区别 但是NavLink 比 Link 多了一个样式

我们可以通过 active类名来设置当前路由的样式

路由当中的重定向(重定向的意义一般是用来设置默认选中的组件)

设置重定向之前的效果

我们刚进入界面的时候 因为没有适用的路径,所以不会有任何组件的渲染

当我们设置了重定向的时候 我们默认访问的路径会变成/one

在路由当中 还有一个属性 精确匹配exact

import React from 'react';
import './App.css';
import One from './component/one'
import Two from './component/two'
import { Route, Link, NavLink, Redirect, withRouter, Switch } from 'react-router-dom'
class App extends React.Component {
change = () => {
this.props.history.push('two')
}
render() {
return (
<div className="App" > <NavLink to="/one/wen">one组件</NavLink>
<NavLink to="/two">two组件</NavLink> <Route path='/one/:name' component={One}></Route>
<Route path='/two' component={Two}></Route>
<Redirect from='/' to="/one" exact></Redirect>
</div>
);
}
} export default App;

我们还可以通过编程式导航实现路由切换

在我们的例子当中所使用的App组件并不是一个路由组件 他没有路由组件的三个重要属性 history location match

这个是App组件当中打印的this.props 并没有这三个属性

显而易见 App组件并不是一个路由组件 这个时候我们就需要用到 react-router-dom当中的withRouter,他可以将App组件变成一个路由组件这样有了history属性我们就可以实现编程式导航了

路由当中Switch 当有很多个匹配项的时候 他只会匹配第一个找到的

import React from 'react';
import './App.css';
import One from './component/one'
import Two from './component/two'
import { Route, Link, NavLink, Redirect, withRouter, Switch } from 'react-router-dom'
class App extends React.Component {
change = () => {
this.props.history.push('two')
}
render() {
return (
<div className="App" > <NavLink to="/one">one组件</NavLink>
<NavLink to="/two">two组件</NavLink>
{/* <button onClick={this.change} > 编程式导航到two组件</button> */}
<Switch>
<Route path='/one' component={One}></Route>
<Route path='/two' component={Two}></Route>
<Redirect from='/' to="/one" exact></Redirect>
</Switch>
</div>
);
}
} export default withRouter(App);

路由传参

通过params传值

优势 : 刷新地址栏,参数依然存在

缺点:只能传字符串,并且,如果传的值太多的话,url会变得长而丑陋。

import React from 'react';
import './App.css';
import One from './component/one'
import Two from './component/two'
import { Route, Link, NavLink, Redirect, withRouter, Switch } from 'react-router-dom'
class App extends React.Component {
change = () => {
this.props.history.push('two')
}
render() {
return (
<div className="App" > <NavLink to="/one/wen">one组件</NavLink>
<NavLink to="/two">two组件</NavLink>
{/* <button onClick={this.change} > 编程式导航到two组件</button> */}
<Switch>
<Route path='/one/:name' component={One}></Route>
<Route path='/two' component={Two}></Route>
<Redirect from='/' to="/one" exact></Redirect>
</Switch>
</div>
);
}
} export default withRouter(App);
 <Route path='/one/:name' component={One}></Route>  //这句话规定了参数的名字是name
<NavLink to="/one/wen">one组件</NavLink> // 这句话给传递的参数赋值 // 在one组件当中 我们可以用通过 this.props.match.params.name 获取参数

通过 to属性传值

优势:传参优雅,传递参数可传对象;

缺点:刷新地址栏,参数丢失

<Route path='/query' component={Query}/>
<Link to={{ path : ' /query' , query : { name : 'sunny' }}}>
this.props.history.push({pathname:"/query",query: { name : 'sunny' }});
读取参数用: this.props.location.query.name

React当中的路由使用的更多相关文章

  1. react router @4 和 vue路由 详解(五)react怎么通过路由传参

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 7.react怎么通过路由传参? a.通配符传参(刷新页面数据不丢失) //在定义路由的 ...

  2. react router @4 和 vue路由 详解(三)react如何在路由里面定义一个子路由

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 5.react如何在路由里面定义一个子路由?   a.引入在需要子路由的页面引入Rout ...

  3. react 当中重新渲染dom的方法

    有个upload 重复上传同名文件的需求,在网上找了很多解决方案都不好使,在react当中解决该问题其实很简单,其实无法上传同名文件 的原因是因为无法触发onChange事件,只需要刷新改dom就可以 ...

  4. 从 React Router 谈谈路由的那些事

    React Router 是专为 React 设计的路由解决方案,在使用 React 来开发 SPA (单页应用)项目时,都会需要路由功能,而 React Router 应该是目前使用率最高的. Re ...

  5. SAAS云平台搭建札记: (四) AntD For React使用react-router-dom路由接收不同参数页面不刷新的问题

    在.net开发员眼里,如果使用MVC,根据路由匹配原则,可以通过各种方式接收参数,比如 /Post/List/1, /Post/List/2,或者 /Post/List?id=1,/Post/List ...

  6. [react]react创建app,路由,mobx 全教程

    ​ 1.创建app, npx create-react-app my-app Cmd Copy 2.进入项目目录 cd my-app Cmd Copy 3.启用配置文件(默认是不开启配置文件的) ya ...

  7. React中的路由系统

    React中的路由系统 提起路由,首先想到的就是 ASPNET MVC 里面的路由系统--通过事先定义一组路由规则,程序运行时就能自动根据我们输入的URL来返回相对应的页面.前端中的路由与之类似,前端 ...

  8. react中的路由配置踩坑记

    react 路由配置中,如果根路由(/)匹配一个组件,另一个路由(/list)在进行匹配的时候也会匹配到根路由(/),即在 /list 页面展示的时候 / 页面总是展示在上方. 此时如果想进行严格匹配 ...

  9. react全家桶-路由

    /src目录下新增一个pages目录,用于存放渲染页面的组件 在/src/pages中新增一个Add.js文件 /src 下的index.js 路由:import React from 'react' ...

随机推荐

  1. Thread基础-创建线程的方式

    Java线程创建的几种简单方式 1. extends Thread类 public class ThreadDemo extends Thread{ @Override public void run ...

  2. spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息

    spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息 本文主要内容: 1:管理页面主机名及访问ip信息提示修改 2:获取当前注册中心的服务列表及每个服务对于的服务提供者列表 ...

  3. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  4. 震惊!ConcurrentHashMap里面也有死循环,作者留下的“彩蛋”了解一下?

    JDK BUG 这篇文章,聊一下我最近才知道的一个关于 JDK 8 的 BUG 吧. 首先说一下我是怎么发现这个 BUG 的呢? 大家都知道我对 Dubbo 有一定的关注,前段时间 Dubbo 2.7 ...

  5. ESP8266服务器模式 发送数据和接收数据 模板1

    功能如下: 1.将客户端发来的数据转发到串口:2.串口数据转发给所有客户端3.可连接4个客户端4.可设置静态IP地址5.指示灯闪烁表示无客户端连接,灯亮代表有客户端连接 /** 功能: 1.将客户端发 ...

  6. Spring Cloud Alibaba系列(四)使用gateway作为服务网关

    什么是网关 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计.开发.测试.部署和管理.这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计, ...

  7. SpringBoot 构建 Docker 镜像的 3 种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...

  8. 手把手教你学Numpy,搞定数据处理——收官篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分. 数组的持久化 在我们做机器学习模型的研究或者是学习的时候,在完成 ...

  9. idea的maven项目无法引入junit类

    本机:java版本:1.8 pom中是junit版本:4.12 出现问题:在使用@Test 无法引入 : org.junit.Test; 解决方法:junit在pom.xml改为 4.12-beta- ...

  10. 入门大数据---Hbase搭建

    环境介绍 tuge1 tuge2 tuge3 tuge4 NameNode NameNode DataNode DataNode ZooKeeper ZooKeeper ZooKeeper ZooKe ...