React路由

React-Router的基本配置


1、找到官方文档 https://reacttraining.com/react-router/web/example/basic
2、安装  cnpm install react-router-dom --save
3、找到项目的根组件引入react-router-dom
   import { BrowserRouter as Router, Route, Link } from "react-router-dom";
4、复制官网文档根组件里面的内容进行修改  (加载的组件要提前引入)而且Router里面一般是有个唯一父级div的
     <Router>
            <Link to="/">首页</Link>
            <Link to="/news">新闻</Link>
            <Link to="/product">商品</Link>
           <Route exact path="/" component={Home} />
           <Route path="/news" component={News} />    
           <Route path="/product" component={Product} />   
     </Router>
5. exact表示严格匹配,否则路由/的对应的组件在匹配其他路由的时候也会显示出来

基本案例

import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import './assets/css/index.css'
import Home from './components/Home';
import News from './components/News';
import Product from './components/Product';
class App extends Component {

  render() {
    return (
        <Router>
          <div>           

              <header className="title">
                <Link to="/">首页</Link>
                <Link to="/news">新闻</Link>
                <Link to="/product">商品</Link>
              </header>
               <br />
              <Route exact path="/" component={Home} />
              <Route path="/news" component={News} />    
              <Route path="/product" component={Product} />                 
          </div>
      </Router>
    );
  }
}

export default App;

路由传参

动态路由


  1. 首先在app.jsx中添加路由(分别是新闻列表页面和新闻详情页面)
<Route  path="/news" component={News}></Route>

<Route  path="/content/:aid" component={Content}></Route>

2.下面是对应的代码


News.jsx:
import React, { Component } from 'react';
import { Link } from "react-router-dom";

class News extends Component {
    constructor(props){
        super(props)
        this.state={
            infos:[
                {
                    aid:1,
                    info:"河南"
                },
                {
                    aid:2,
                    info:"江苏"
                }
            ]
        }
    }
    render() {
        return (
            <div>
                {
                    this.state.infos.map((value,index)=>{
                        return <p key={index}><Link to={`/content/${value.aid}`}>{value.info}</Link></p>
                    })
                }
            </div>
        );
    }
}
export default News;        
Content.jsx:

import React, { Component } from 'react';

class Content extends Component {
    constructor(props){
        super(props)
    }
    componentDidMount(){
        //获取动态路由传参需要在生命周期内,但是不一定是当前生命周期
        //获取传参,aid对应的是app.jsx中的path="/content/:aid"
        console.log(this.props.match.params.aid);
    }
    render() {
        return (
            <div>
                
            </div>
        );
    }
}

export default Content;

get传值


  1. 首先在app.jsx中添加路由(分别是新闻列表页面和新闻详情页面)
//注意此处和上面动态路由有区别,动态路由是:aid,而get传值不需要
<Route  path="/pcontent" component={Pcontent}></Route>
<Route  path="/pnews" component={Pnews}></Route>

2.下面是对应的代码


Pnews.jsx
import React, { Component } from 'react';
import { Link } from "react-router-dom";
class Pnews extends Component {
    constructor(props){
        super(props)
        this.state={
            infos:[
                {
                    aid:1,
                    info:"北京"
                },
                {
                    aid:2,
                    info:"上海"
                }
            ]
        }
    }
    render() {
        return (
            <div>
              {
                  this.state.infos.map((value,index)=>{
                      return <p key={index}><Link to={`/pcontent?aid=${value.aid}`}>{value.info}</Link></p>
                  })
              }
            </div>
        );
    }
}

export default Pnews;   
Pcontent.jsx
import React, { Component } from 'react';

class Pcontent extends Component {
    constructor(props){
        super(props)
    }
    componentDidMount(){
        //获取get传值   ?aid=1
        //解析可以使用npm上面的url模块
        console.log(this.props.location.search);
        
    }
    render() {
        return (
            <div>
            </div>
        );
    }
}

export default Pcontent;

解析html

<div dangerouslySetInnerHTML={{__html:<p>解析html字符串</p>}}></div>

js动态路由跳转

import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link,Redirect } from "react-router-dom";
class Home extends Component {
    constructor(){
        super()
        this.state={
            flag:false
        }
    }
    //修改对应标记位的状态,render函数会重新执行
    fromjs2new=()=>{
        this.setState({
            flag:true
        })
    }
    render() {
        //判断标记位之后,因为点击事件下面方法会进入,然后重定向实现js动态路由跳转
        if(this.state.flag){
            return <Redirect to={{pathname:'/news'}}/>
        }
        return (
            <div>
                <p>这是Home组件</p>  
                <input type="button" value="跳转到新闻界面" onClick={this.fromjs2new}/>    
            </div>
        );
    }
}

export default Home;       

路由嵌套

1. 首先在app.jsx中设置如下

<Route exact path="/shop" component={Shop} />
<Route  path="/home" component={Home}/>

/*注意:如果是加了exact,因为设置了严格匹配貌似,所以不能加路由嵌套,
如果出现默认页面/需要切换的场景,最好换为组件切换或者不设置exact
如果不是/路由,加不加exact无影响,所以可以去掉*/

2.Home.jsx
import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import Info1 from './Home/Info1.jsx';
import Info2 from './Home/Info2.jsx';
import ShopAdd from './Shop/ShopAdd.jsx';
import ShopList from './Shop/ShopList.jsx';
class Home extends Component {
    constructor(props) {
        super(props)
    }
    render() {
        return (
            <div>
                {/* <Link to="/shop/">商户列表</Link>
                <Link to="/shop/add">增加商户</Link>
                <Route exact path="/shop/" component={ShopList} />
                <Route path="/shop/add" component={ShopAdd} /> */}

                <Link to='/home/'>信息一</Link>
                <Link to='/home/info'>信息二</Link>
                <Route exact path="/home/" component={Info1} />
                <Route path="/home/info" component={Info2} />
            </div>
        );
    }
}
export default Home;

路由模块化

APP.jsx:
import React, { Component } from 'react';
import './assets/css/App.css';
import Home from './components/Home.jsx';
import New from './components/New.jsx';
import { BrowserRouter as Router, Route,Link } from "react-router-dom";
import Info1 from './components/New/Info1.jsx';
import Info2 from './components/New/Info2.jsx';
//甚至把它单独提出一个js的文件
//export default routes
let routes=[
  {
    path:'/',
    component:Home,
    exact:true
  },
  {
    path:'/new',
    component:New,
    routechilden:[
      {
        path:'/new/',
        component:Info1
      },
      {
        path:'/new/info',
        component:Info2
      }
    ]
  }
]

class App extends Component {
  render() {
    return (
      <Router>
        <div>
          <Link to='/new'>新闻页面</Link>
          {/* 不需要配置嵌套路由的写法
          {
            routes.map((route,index)=>{
              if(route.exact){
                return <Route exact key={index} path={route.path} component={route.component}/>
              }else{
                return <Route key={index} path={route.path} component={route.component}/>
              }
            })
          } */}
          
          {/* 需要配置嵌套路由的写法
           以下写法是基本上的固定写法,因为组件传参的方式在路由
           中无效,所以下面适用于子路由存在的情况下
          但是下面childroutes这个是可以自定义,但是不能是
          childerns(可能内部已经使用)
          */}
          {
            routes.map((route,index)=>{
              if(route.exact){
                return <Route exact key={index} path={route.path} render={
                  props=>(
                    <route.component  {...props} childroutes={route.routechilden}/>
                  )
                }/>
              }else{
                return <Route  key={index} path={route.path} render={
                  props=>(
                    <route.component  {...props} childroutes={route.routechilden}/>
                  )
                }/>
              }
            })
          }
        </div>
      </Router>
    );
  }
}

export default App;

New.jsx:
import React, { Component } from 'react';

import { BrowserRouter as Router, Route,Link } from "react-router-dom";
class New extends Component {
    constructor(props){
        super(props)
    }
    componentDidMount(){
        //获取路由参数
        console.log(this.props.childroutes);
        //注意:也可以在state里面设置一个变量
        //routes当做空数组,然后在此处重新赋值,同样效果
    }
    render() {
        return (
            <div>
                新闻  <br/>
                 <Link to='/new/'>信息一</Link>
                <Link to='/new/info'>信息二</Link>
                {
                    this.props.childroutes.map((route,index)=>{
                        if(route.exact){
                          return <Route exact key={index} path={route.path} component={route.component}/>
                        }else{
                          return <Route key={index} path={route.path} component={route.component}/>
                        }
                      })
                }
            </div>
        );
    }
}

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

推荐阅读更多精彩内容