react-router-dom v4版路由及传参

来源:程序思维浏览:3302次
现在最新版本的react路由是react-router-dom,那么他如何使用呢?下面由我来给大家分享一下:

react-router-dom v4版路由及传参

1、安装依赖  不需要指定版本,默认最新

npm i react-router react-router-dom --save-dev

2、引入主要组件对象

import {BrowserRouter as Router,Route,Link,Redirect,Switch} from 'react-router-dom'

3、书写结构在组件内部,不需要写在render中,Router组件有且只有一个根节点,除了路由组件,可以写入其他标签
默认 Route所在的位置为路由组件显示的容器(tips:Link写在Router内部形成路由结构)

<Router>
        <div>
            <Link to="/home">首页</Link>
            <Link to="/about">关于</Link>
            <Route path="/home" component={Home}></Route>
            <Route path="/about" component={About}></Route>
        </div>
    </Router>

4、路由重定向 通过 Redirect组件对象,设置to属性
<Redirect to="/about"/>   

5、路由参数传递 

/a/1 ---this.props.match.params.id

/a?id=1---this.props.location.query.id

6、事件中进行路由切换跳转

this.props.history.push('/home')   

因为BrowserRouter  相当于 <Router history={history}>故可直接通过history进行push跳转
       
高版嵌套路由写法:
<Router>
<div>
   {
  this.state.arr.map(function(item,i){
   return(
    <div key={i}>
      <Link to={{pathname:'/detail',query:{id:item.pid}}}>{item.pname}</Link>
    </div>
   )
  })
  }
     
  <hr/>
<Route path="/detail" component={Detail}></Route>
</div>
</Router>

然后在所导入的组件引入import Detail from "./detail"

7、钩子函数:

componentWillReceiveProps(a)可时时更新传入的新数据,相当于vue的watch( )监听

componentDidMount( ) 接收id并请求数据,但页面数据只能刷新一次

import React from 'react';
import $ from 'jquery'

class Detail extends React.Component{
constructor(props){
  super(props)
  this.state={
   detail:''
  }
}
render(){
  return(
   <div>
    <h2>详情</h2>
    <p>{this.state.detail}</p>
   </div>
  )
}
//可时时更新传入的新数据,相当于vue的watch()监听
componentWillReceiveProps(a){
  var _this=this;
  $.ajax({
   type:"get",
   url:"http://jx.xuzhixiang.top/ap/api/detail.php",
   data:{id:a.location.query.id},
   dataType:'json',
   async:true,
   success:function(data){
    _this.setState({detail:data.data.pdesc})
   }
  });
}
//接收id并请求数据,但页面数据只能刷新一次
componentDidMount(){
  var _this=this;
  $.ajax({
   type:"get",
   url:"http://jx.xuzhixiang.top/ap/api/detail.php",
   data:{id:_this.props.location.query.id},
   dataType:'json',
   async:true,
   success:function(data){
    _this.setState({detail:data.data.pdesc})
   }
  });
 
}


}
export default Detail;


完整代码
app.js   高版本路由配置
import React, { Component } from 'react';
import {BrowserRouter as Router,Route,Link,Redirect,Switch} from 'react-router-dom'
import Home from './components/home'
import About from './components/about'
import Other from './components/other'

class App extends Component {
  render() {
    return (
      <div className="App">
        <h1>高版路由</h1>
       
    <Router>  
       
    <div>   {/* 有一个根节点 */}
     
           <Link to="/home">首页</Link>
           <Link to="/about">关于</Link>
           <Link to="/other">其他</Link>
          
          <Switch>     {/* 解决控制台一片红色问题 */}

     <Route path="/home" component={Home}></Route>
     <Route path="/about" component={About}></Route>
     <Route path="/other" component={Other}></Route>
          <Redirect to="/home"/>   {/* 路由重定向 */}
          
          </Switch>
         </div>
        </Router>
       
      </div>
    );
  }
}

export default App;
home.js
import React from 'react';
import {BrowserRouter as Router,Route,Link,Redirect,Switch} from 'react-router-dom'
import $ from 'jquery'
import Detail from './detail'
class Home extends React.Component{
constructor(props){
  super(props)
  this.state={
   arr:[]
  }
}

tap(){
  this.props.history.push('/other')
}

render(){
  return(
   <div>
    <h1> shouye </h1>
    <button onClick={this.tap.bind(this)}>跳转other</button>
    <Router>
     <div>
      {
       this.state.arr.map(function(item,i){
        return(
         <div key={i}>
          <Link to={{pathname:'/detail',query:{id:item.pid}}}>{item.pname}</Link>
         </div>
        )
       })
      }
     
      <hr/>
             <Route path="/detail" component={Detail}></Route>
     </div>
    </Router>
   </div>
  )
}

componentWillMount(){
  var _this=this;
  $.ajax({
   type:"get",
   url:"http://jx.xuzhixiang.top/ap/api/productlist.php",
   dataType:'json',
   async:true,
   success:function(data){
    _this.setState({arr:data.data})
   }
  });
}


}

export default Home;
精品好课
React实战视频教程仿京东移动端电商
React是前端最火的框架之一,就业薪资很高,本课程教您如何快速学会React并应用到实战,对正在工作当中或打算学习React高薪就业的你来说,那么这门课程便是你手中的葵花宝典。
HTML5视频播放器video开发教程
适用人群1、有html基础2、有css基础3、有javascript基础课程概述手把手教你如何开发属于自己的HTML5视频播放器,利用mp4转成m3u8格式的视频,并在移动端和PC端进行播放支持m3u8直播格式,兼容...
最新完整React+VUE视频教程从入门到精,企业级实战项目
React和VUE是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React和VUE并应用到实战,教你如何解决内存泄漏,常用库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习Re...
HTML5基础入门视频教程易学必会
HTML5基础入门视频教程,教学思路清晰,简单易学必会。适合人群:创业者,只要会打字,对互联网编程感兴趣都可以学。课程概述:该课程主要讲解HTML(学习HTML5的必备基础语言)、CSS3、Javascript(学习...
Vue2+Vue3+ES6+TS+Uni-app开发微信小程序从入门到实战视频教程
2021年最新Vue2+Vue3+ES6+TypeScript和uni-app开发微信小程序从入门到实战视频教程,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己...
最新完整React视频教程从入门到精通纯干货纯实战
React是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习React高薪就...
VUE2+VUE3视频教程从入门到精通(全网最全的Vue课程)
VUE是目前最火的前端框架之一,就业薪资很高,本课程教您如何快速学会VUE+ES6并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习VUE高薪就...
jQuery视频教程从入门到精通
jquery视频教程从入门到精通,课程主要包含:jquery选择器、jquery事件、jquery文档操作、动画、Ajax、jquery插件的制作、jquery下拉无限加载插件的制作等等......
收藏
扫一扫关注我们