React高版路由写法

步骤

 create-react-app my-app  创建项目

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

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

2、引入主要组件对象

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

Link和NavLink作用是一样的(NavLink会默认带有一个active标签)
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属性—Switch对象处理警告-(包含Route以及Redirect)

<Redirect to="/about"/>	

5、路由参数传递

> /a/1 ---this.props.match.params.id
> /a?id=1---this.props.location.query.id /a -- 
> this.props.location.state

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

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

因为BrowserRouter 相当于 故可直接通过history进行push跳转

7、NavLink 导航标签,拥有activeClassName属性,声明激活样式
8、Prompt 离开组件 <Prompt message="string" when={true/false}/> 路由切换提示文字,when控制文字是否显示

App.js

import React, { Component } from 'react';
import {BrowserRouter as Router,Route,Link,NavLink, Redirect} from "react-router-dom";  //高版的里面必须使用react-router-dom,和低版的不一样
//NavLink比Link多了一个激活类名active
import Home from "./components/Home"
import About from "./components/About"
import Other from "./components/Other"
import Detail from "./components/Detail"
import "./App.css"
import Switch from 'react-router-dom/Switch';

class App extends Component {
  render() {
    return (
      <div className="App">
          <h1>高版本路由</h1>
        <Router>
            <div>
              <NavLink  to="/home">首页</NavLink>
              <NavLink  to="/about">关于</NavLink>
              <NavLink  to="/other">其他</NavLink>
            <Switch>{/*使用重定向必须要用Switch包裹着,不让会出现一个警告信息*/}
              <Route path="/home" component={Home}></Route>   {/*显示视图的组件*/}
              <Route path="/about" component={About}></Route>
              <Route path="/other" component={Other}></Route>
              {/*<Route path="/Detail/:id" component={Detail}></Route> */}   {/*跟谁在一个视图容器内就并列,没有嵌套这一个说法*/}
              <Redirect to="/home"/>   {/*路由的重定向*/}
              </Switch>
            </div>
        </Router>
      </div>
    );
  }
}

export default App;
//Route 必须放在Router内,一旦Router存在,所有跟路由相关的组件对象必须放在Router中
//Router中有且只有一个根标签  容器:router中route所在的位置就是该路由容器

Home.js

import React from "react";
import {BrowserRouter as Router,Route,NavLink,Prompt} from "react-router-dom";
import $ from "jquery";
import Detail from "./Detail"
class Home extends React.Component{
    constructor(props){
        super(props)
        this.state={
            list:[],
            isshow:false
        }
    }
    tap(){
        if(this.refs.ipt.value){
            this.setState({isshow:true})
        }else{
            this.setState({isshow:false})
        }
    }
    render(){
        return(
            <div>
                <h1>home</h1>
                <input type="text" ref="ipt" onKeyUp={this.tap.bind(this)}/>
                    <Router>
                        <div>
                        {
                            this.state.list.map(function (item,i) {
                                return(
                                    <div key={i}>
                                        {/*<p><NavLink to={"/detail/"+item.pid}>{item.pname}</NavLink></p>------params传参*/}
                                        {/*<p><NavLink to={{pathname:"/detail",query:{id:item.pid}}}>{item.pname}</NavLink></p>*/}
                                        <p><NavLink to={{pathname:"/detail",state:{id:item.pid}}}>{item.pname}</NavLink></p>
                                    </div>
                                )
                            })
                        }
                        {/*<Route path="/detail/:id" component={Detail}></Route>-----嵌套路由params传参*/}
                        
                        <Route path="/detail" component={Detail}></Route>
                        

                     </div>
                </Router>
                <Prompt message="内容没有保存,确定要离开吗?" when={this.state.isshow}/>
            </div>
        )
    }

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

export default Home

About.js

 import React from "react";
import $ from "jquery";

class About extends React.Component{
    constructor(props){
        super(props)
        this.state={
            list:[]
        }
    }
    tap(){
        this.props.history.push("/other")   //点击跳转到other。高版自动带有history属性
    }
    render(){
        return(
            <div>
                <h1>About</h1>
                <button onClick={this.tap.bind(this)}>跳转到other</button>
            </div>
        )
    }
}

export default About

Other.js

import React from "react";
import $ from "jquery";

class Other extends React.Component{
    constructor(props){
        super(props)
        this.state={
            list:[]
        }
    }
    render(){
        return(
            <div>
                <h1>Other</h1>
                
            </div>
        )
    }
}

export default Other

Detail.js

import React from "react";
import $ from "jquery";

class Detail extends React.Component{
    constructor(props){
        super(props)
        this.state={
            detail:""
        }
    }
    render(){
        return(
            <div>
                <h1>Detail</h1>
                <h2>{this.state.detail}</h2>
            </div>
        )
    }
    componentWillMount(){
       var _this=this;
    //    $.ajax({
    //        type:"get",
    //        url:"http://jx.xuzhixiang.top/ap/api/detail.php",
    //        async:false,
    //        dataType:"json",
    //        data:{id:_this.props.match.params.id},
    //        success:function(data){
    //            _this.setState({detail:data.data.pdesc})
    //        }
    //    })

        $.ajax({
            type:"get",
            url:"http://jx.xuzhixiang.top/ap/api/detail.php",
            async:false,
            dataType:"json",
            data:{id:_this.props.location.state.id},
            success:function(data){
                _this.setState({detail:data.data.pdesc})
            }
        })
    }

    componentWillReceiveProps(a){   //数据更改的时候页面随之更新
        var _this=this;
        // $.ajax({ -----------params传参
        //     type:"get",
        //     url:"http://jx.xuzhixiang.top/ap/api/detail.php",
        //     async:false,
        //     dataType:"json",
        //     data:{id:a.match.params.id},
        //     success:function(data){
        //         _this.setState({detail:data.data.pdesc})
        //     }
        // })
 
    //state和query传参的时候只要吧名字改一下就行
        $.ajax({           
            type:"get",
            url:"http://jx.xuzhixiang.top/ap/api/detail.php",
            async:false,
            dataType:"json",
            data:{id:a.location.state.id},
            success:function(data){
                _this.setState({detail:data.data.pdesc})
            }
        })
    }
}

export default Detail;

猜你喜欢

转载自blog.csdn.net/qq_42697338/article/details/86522805