zoukankan      html  css  js  c++  java
  • ReactRouter

    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
  • 相关阅读:
    Linux(debian)安装Redis教程
    Linux下Nginx学习笔记
    Linux常用命令
    MySQL代码片段
    MySql学习笔记
    漂亮的Web颜色
    Electron开发问题总结
    Git 教程
    Python基础
    【原创】servlet+spring+mybatis配置总结
  • 原文地址:https://www.cnblogs.com/cupid10/p/15617623.html
Copyright © 2011-2022 走看看