React Router的简单介绍

这篇文章主要简单的介绍一下react的路由部分,我个人觉得学好一个框架,可以熟悉的掌握一个框架的router部分是非常重要的,因为路由关系到整个项目的结构,可以让我们构建复杂的应用程序。今天主要通过以下小案例讲一下react router的基本用法,以及稍微复杂点的路由嵌套。

react router的安装和环境搭建

 react router是基于react之上的一个强大的路由库,在使用它之前我们先进行简单的安装。
 ① 安装脚手架(如已安装,请忽略此步): npm install -g create-react-app
 ② 通过脚手架创建新的项目: create-react-app react-router-demo
 ③ 使用npm安装react router: npm install --save react-router-dom
 安装完成啦~ npm start启动项目

路由跳转的Demo

场景:我们要实现从一个父组件AppRouter分别跳转到子组件Home和子组件List中

 ① 先创建子组件Home
  import React, { Component } from 'react';
  class Home extends Component {
        constructor(props) {
            super(props);
            this.state = {  }
        }
        render() { 
        return ( <h2>这是home组件</h2> );
        }
    }
  export default Home;
  
  ② 再创建子组件List
  import React, { Component } from 'react';
  class List extends Component {
    constructor(props) {
        super(props);
        this.state = {  }
    }
    render() { 
        return (  <h2>这是List组件</h2> );
    }
  }
export default List;

③ 最后创建父组件AppRouter
import React from "react";
// 重新定义BrowserRouter为Router,  Link相当于是a标签 
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
// 引入要跳转的两个组件
import Home from './Pages/Home'
import List from './Pages/List'

function AppRouter() {
  return (
    <Router>
        <ul>
         {/* 点击这两个链接,进行相应的跳转 */}
            <li><Link to="/">首页</Link> </li>
            <li><Link to="/list/">列表</Link> </li>
        </ul>
         {/* exact是精确匹配  component是对应的显示的视图组件 */}
        <Route path="/" exact component={Home} /> 
        <Route path="/list/" component={List} />
    </Router>
  );
}

export default AppRouter;

reactRouter的动态传值

应用场景: 当点击任何一个链接,需要可以准确的打开详细的文章内容,这就需要靠传递文章ID来进行实现。不同的链接传递的ID都是不同的,所以就需要路由有动态传值的能力。

动态路由的步骤

  1. 设置规则(eg: path="/list/:id")
  2. 传递值 (eg: to="/list/123")
  3. 接收值 (eg: this.props.match 小伙伴可以自己打印一下这个值,看看它到底包含了那些信息)
  4. 显示内容
// 父组件进行设置规则,并进行动态值的传递
import React from "react";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import List from './page/list';

function AppRouter(){
  return(
    <Router>
      <ul>
        {/*② 传值123 */}
        <li><Link to="/list/123">列表页</Link></li>
        {/* ① :id是设置规则 */}
        <Route path="/list/:id" component={List}/>
      </ul>
    </Router>
  )
}
export default AppRouter;

// 跳转到的详细页面,进行值的接收和展示
import React, { Component } from 'react';
class List extends Component {
    constructor(props) {
        super(props);
        this.state = {  }
    }
    render() { 
    return (  <h2>显示接收的路由参数->{this.state.id}</h2> );
    }
    componentDidMount(){
      // ③ 路由接收值 通过props来接收,传递的值在this.props.match中
      // patch: 自己定义的路由规则,可以获取id的参数。
      // url: 真实的访问路径,这上面可以清楚的看到传递过来的参数是什么。
      // params:传递过来的参数,key和value值。
      let tempId = this.props.match.params.id; // id的是自己定义的变量名
      this.setState({id: tempId});
    }
}

export default List;

reactRouter的路由重定向

重定向和跳转的区别:
跳转是可以用浏览器的回退按钮返回上一级的,而重定向是不可以的。

重定向的两种方式:

标签式重定向: 就是利用<Redirect>标签来进行重定向,业务逻辑不复杂时建议使用这种。
编程式重定向: 这种是利用编程的方式,一般用于业务逻辑当中,比如登录成功跳转到会员中心页面等等。

① 标签式重定向:
import React, { Component } from 'react';
import { Link, Redirect } from "react-router-dom"; // 引入Redirect标签
class Index extends Component {
    constructor(props) {
        super(props);
    }
    render() { 
        return (
          <div>
            {/* 点击首页的时候会重定向到home页面 */}
           <Redirect to='/home/'/> 
            <h2>标签式重定向</h2>
          </div>
        );
    }
}

② 编程式重定向:
class Index extends Component {
    constructor(props) {
        super(props);
        //  编程时的重定向 官方文档就是这样写的 业务逻辑复杂的时候这样写
        this.props.history.push('/home/')
    }
    render() { 
        return (
          <div>
            <h2>编程式重定向</h2>
          </div>
        );
    }
}

reactRouter的路由嵌套

在实际项目开发中,路由嵌套是很常用的~ 由于嵌套可能涉及到很多个组件,在写案例之前先简单的介绍一下各个组件之间的嵌套关系。

image
 ① 首先在项目的pages文件下,创建两个简单的一级路由对应的视图Home和List组件。
 // Home组件
 import React, { Component } from 'react';
 class Home extends Component {
    constructor(props) {
        super(props);
        this.state = {  }
    }
    render() { 
    return ( <h2>home component </h2> );
    }
 }
export default Home;

// List 组件
import React, { Component } from 'react';
class List extends Component {
    constructor(props) {
        super(props);
        this.state = {  }
    }
    render() { 
    return ( <h2>List component </h2> );
    }
}
export default List;

② 在根项目下创建一个总的路由管理的页面,用来进行一级路由的跳转,这里组件名为AppRouter
import React from "react";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import List from './page/list';
import Home from './page/home'
function AppRouter(){
  return(
    <Router>
      <ul>
        <li><Link to="/">首页</Link></li>
        <li><Link to="/list/123">列表页</Link></li>
        
        <Route path="/" exact component={Home}/>
        <Route path="/list/:id" component={List}/>
      </ul>
    </Router>
  )
}
export default AppRouter;

③ 在根目录下创建一个components文件夹,用来盛放在二级路由要显示的视图。这里仅以Home组件下的二级路由做示例。
  和一级路由类似,需要创建一个用来管理二级路由跳转的路由配置组件,比如这里叫做 Video组件
import React from 'react';
import { Route, Link } from 'react-router-dom';

// 这就是二级路由跳转下对应的视图组件
import ReactPage from './video/reactPage';
import Angular from './video/angular';
import Vue from './video/view';

function Video(){
  return (
   //二级路由 不需要用router进行包裹,这是很重要的一点
    <div>
      <div className="videoTitle">
        <ul>
          <li><Link to="/video/reactpage">React教程</Link></li>
          <li><Link to="/video/angularpage">Angular教程</Link></li>
          <li><Link to="/video/vuepage">Vue教程</Link></li>
        </ul>
      </div>
      <div className="videoContent">
        <div>视频教程</div>
        <Route path="/video/reactpage" component={ReactPage}/>
        <Route path="/video/flutterpage" component={Angular}/>
        <Route path="/video/vuepage" component={Vue}/>
      </div>
    </div>
  )
}
export default Video;

根据上面组件的二级跳转,我们还需要有ReactPage,Angular,Vue视图组件,
我们可以把三个组件放到一个文件夹下进行统一管理。
由于这三个组件都是无状态组件,所以我这里就给出其中一个组件的例子就可以了~ 其他两个可以按部就班哦~

eg: 给出ReactPage组件
import React from 'react';

function Reactpage() {
  return (<h2>react page页面</h2>)
}
export default Reactpage;

总结

今天的react router就简单的介绍到这里,路由嵌套由于涉及的组件较多,还是希望这个稍微繁琐的介绍,可以帮助大家更好的了解路由的使用~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容