React-Router

React-Router

最新的路由的版本是5.2的版本。里面的话提供了一些包

所在在做web端开发的时候只需要安装react-router-dom就可以了,因为内部已经包含了最核心的内容了。

react-router | react-router-native | react-router-config

路由的简单使用

​ 安装路由: yarn add react-router-dom

​ 需要在最外层的节点上面:(hash vs history)

index.js

import {HashRouter as Router} from "react-router-dom"
ReactDOM.render(
  <Router>
    <App />
  </Router>,
  document.getElementById('root')
);

​ 使用Route实现路由

App.js

import React,{Component} from 'react';
import {Route,Redirect,Switch} from "react-router-dom"
import Home from "./views/Home"
import Article from "./views/Article"
import NotFound from "./views/NotFound"
//Route指代路由对象,path匹配路径,component代表路由组件  exact就是将地址栏与path必须完全一致
//Redirect重定向 to跳到指明的路径
//Switch 内部的路由只要匹配一个就结束了,下面的就不匹配了
class App extends Component{
  render(){
    return (
      <Switch>
        <Route path="/home" component={Home}/>
        <Route path="/article" component={Article}/>
        <Route path="/404" component={NotFound}/>
        <Redirect to="/home" from="/" exact/>   
        <Redirect to="/404"/>
      </Switch>
    )
  }
}
export default App;

声明式导航 (vue中router-link实现的)

可以通过NavLink实现a标签的切换效果,渲染成a标签,并且带有active的class样式

App.js

import {Route,Redirect,Switch,NavLink as Link} from "react-router-dom"

<Link to="/home" activeStyle={{color:'red'}}>首页</Link>
<Link to="/article" activeStyle={{color:'red'}}>文章</Link>

二级路由与动态跳转

二级路由:

Article文件:

import React, { Component } from 'react'
import {Route,NavLink as Link} from "react-router-dom"
import ArticleDetail from './ArticleDetail';
export default class Article extends Component {
    render() {
        return (
            <div>
                <Link to="/article/1">文章一</Link>
                <Link to="/article/2">文章二</Link>
                <Route path="/article/:id" component={ArticleDetail}/>
            </div>
        )
    }
}

ArticleDetail中获取动态参数?

因为ArticleDetail被Route进行包裹,就是路由组件了。它的属性上面就会有路由相关的api

ArticleDetail.js

import React, { Component } from 'react'
export default class ArticleDetail extends Component {
    render() {
        //history/location/match的路由api了。
        return (
            <div>
                文章详情 -- {this.props.match.params.id}
            </div>
        )
    }
}

路由常用的api方法

Route中的render函数

​ 一旦通过Route组件的component属性指明的组件,那么这个路由组件上面就会有路由相关的api

​ (location / history / match)

​ 如果必须要传入额外属性的话,单纯使用component是解决不了的。

<Route path="/home" render={(routeProps)=>{
	return this.state.isLogin ? <Home {...routeProps} a={1}/> : "未登录"
}}/>

link的参数传递

​ 1.可以通过动态路由的方式进行参数传递

​ path="/article/:id"

​ Detail组件内部可以通过 this.props.match.params.id可以获取到动态参数

​ 2.可以通过query进行传参

​ path="/article?title=文章一"

​ Detail组件内部可以通过 this.props.location.search可以获取到 “?title=文章一”

​ 3.可以通过state进行隐式传参

​ to={{pathname:'/article/2',state:{title:'文章2'}}}

​ Detail组件内部可以通过 this.props.location.state.title可以获取到

withRouter

我们可以通过引入高阶组件withRouter,将普通组件进行包裹,那么BackHome就变成了伪路由组件,它本身不能实现跳转,但是仍然可以通过属性去访问到路由相关的api了。

import React, { Component } from 'react'
import {withRouter} from "react-router-dom"z
// 如果封装BackHome组件调用的话,他上面是没有this.props.history属性的
// 但是通过HOC withRouter包裹之后,这个BackHome就变成了一个伪路由组件,
// 本身是不会跳转进来,只不过属性上面却有了路由相关的api。
@withRouter
class BackHome extends Component {
    back = ()=>{
        //通过编程式导航方式返回首页
        this.props.history.push("/home")
    }

    render() {
        return (
            <div>
                <button onClick={this.back}>返回home</button>
            </div>
        )
    }
}
export default BackHome
posted @ 2020-12-22 10:16  Cupid05  阅读(26)  评论(0编辑  收藏  举报