react学习16-React路由react-router动态路由和编程式导航

React-router

动态路由

  • 路由的路径可以进行模糊匹配

    • 路由映射的path可以是模糊匹配
    class DynamicRouter extends React.Component {
        render () {
            return (
                <Router>
                    <h1>动态路由</h1>
                    <hr/>
    
                    {/*配置路由的链接*/}
                    <Link to='/info/123'>张三</Link>
                    <Link to='/info/456'>李四</Link>
                    <Link to='/info/456/book/1'>图书一</Link>
                    <Link to='/info/456/book/2'>图书二</Link>
    
                    {/*路由组件的显示位置*/}
                    <Route exact path='/info/:id' component={UserInfo}/>
                    <Route path='/info/:id/book/:bid' component={Book}/>
                </Router>
            )
        }
    }
    
    function UserInfo (props) {
        let userId = props.match.params.id
        const users = [{
            id: 123,
            uname: '张三',
            age: 18,
            gender: '男'
        }, {
            id: 456,
            uname: '李四',
            age: 15,
            gender: '女'
        }]
        let user = users.find(item => {
            return item.id === parseInt(userId)
        })
        return (
            <div>
            	 <div>姓名:{user.uname}</div>
    			<div>年龄:{user.age}</div>
    			<div>性别:{user.gender}</div>
    		</div>
    	)
    }
    
    function Book (props) {
      return <div>图书信息:{props.match.params.bid}</div>
    }
    

编程式导航

  • 路由组件-编程式导航基本使用

    • 调用push方法即可跳转
    • 跳转时可以传递参数
      handleLogin = () => {
        // 实现登录
        // 这里应该获取表单数据并且调用后台接口验证用户名和密码是否正确
        let flag = true
        if (flag) {
          // 登录成功,跳转到主页
          // console.log(this.props)
          this.props.history.push('/home', {info: 'hello'})
        }
      }
    
      function Home (props) {
        // 在组件中获取编程式导航的参数
        let info = props.location.state.info
        return <div>主页内容:{info}</div>
      }
    
  • 非路由组件-编程式导航

    • 导入withRouter
    import { withRouter } from "react-router-dom";
    
    • 导出时使用withRouter包裹组件
    // 此时,Login组件应该位于一个单独文件里 login.js
    export default withRouter(Login);
    // 另外一个文件需要导入Login组件
    import Login from './login.js'
    
    • 被包裹的组件中可以通过props获取history对象
    let { history } = this.props
    
    • 然后可以使用history对象调用push方法进行跳转
      history.push('/home', {uname: 'lisi'})
    
    • 登录组件
    class Login extends React.Component {
      constructor(props) {
        super(props);
      }
      handle = () => {
        const {history} = this.props;
        history.push('/home', {info: 'hello'});
      }
      render() {
        return (
          <div>
            <div>登录页面</div>
          <div>
              用户名:<input type="text"/>
              密码:<input type="text"/>
            </div>
            <div>
              <button onClick={this.handle}>登录</button>
            </div>
          </div>
        );
      }
    }
    

路由的权限验证

  • 关于Route标签的render属性
  • 基于render属性进行路由权限组件的封装
import React from 'react'
import { Route, Redirect } from 'react-router-dom'

export default (props) => {
  // 对象结构赋值可以起一个别名
  const { path, component: Component } = props
  return <Route path={path} render={() => {
    // return <div>你好,Kitty</div>
    // 在路由组件渲染内容之前,可以判断路由权限
    sessionStorage.setItem('mytoken', 'admin')
    let token = sessionStorage.getItem('mytoken')
    if (token) {
      // 已经登录,可以正常访问相应组件
      return <Component/>
    } else {
      // 没有登录,跳转到登录页
      return <Redirect to='/login'/>
    }
  }}/>
}
<AuthCheck path='/hello' component={Hello}/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值