react中router路由重定向与高阶组件的手动跳转

前言

上篇文章给大家介绍了react项目中路由的基础用法,今天给大家介绍关于router在实战项目中更多的知识

路由重定向

看下面的案例:
1.使用Redirect重定向首先要进行导入
2.可以看到这里我们点击登录会跳转到login页面,但是我们在里面添加Redirect标签,给to后面添加路径,也就是重定向到该路径。所以我们点击登录只会跳转/user

import React, { Component } from 'react'
import { BrowserRouter, Link, Route, Redirect } from 'react-router-dom'

export class Login extends Component {
  render() {
    return (
      <div>
          <h1>登录</h1>
          <Redirect to='/user'/>
      </div>
    )
  }
}

export class User extends Component {
  render() {
    return (
      <div>User 用户中心</div>
    )
  }
}

export class App extends Component {
  render() {
    return (
      <div>
          <BrowserRouter>
            <Link to='/login'>登录</Link>
            {/* <Link to='/user'>user</Link> */}

            <Route path='/login' component={Login}/>
            <Route path='/user' component={User}/>
          </BrowserRouter>
      </div>
    )
  }
}

export default App

看效果,访问login自动跳转到user页面

在这里插入图片描述

手动跳转

除了我们上面学的使用link进行跳转,我们还可以通过手动触发的形式进行路由跳转,下面我们一起来看看如何实现:
实现手动跳转有一个前提:,就是必须获取到history对象,这里的history不是window的history

来看代码:
1.首页,关于,用户中心三个页面都使用link进行跳转,这是我们原来的方法
2.在about页面,我们给跳转按钮绑定onClick事件,在jump中定义props,发现里面的内容就是路由的信息,所以可以直接props.history.push(’/user’)让其跳转到user

import React, { Component } from 'react'
import {BrowserRouter, Link, Route, Switch} from 'react-router-dom'

function Home(props) {
    console.log(props)
    return <h1>Home</h1>
}

function User(props) {
    console.log(props)
    return <h1>User</h1>
}

const About = (props) => {
    const jump = () => {
        console.log(props)
        props.history.push('/user')
    }
    return (
        <div>
            <h2>About</h2>
            <button onClick={e=>{jump()}}>跳转</button>
            <Home/>
        </div>
    )
}


export class App extends Component {
    render() {
        return (
            <div>
                <BrowserRouter>
                    <ul>
                        <li><Link to='/home'>首页</Link></li>
                        <li><Link to='/about'>关于</Link></li>
                        <li><Link to='/user'>用户中心</Link></li>
                    </ul>

                    <Switch>
                        <Route path='/home' exact component={Home} />
                        <Route path='/about' component={About} />
                        <Route path='/user' component={User} />
                    </Switch>
                </BrowserRouter>
            </div>
        )
    }
}

export default App

看一下效果:

在这里插入图片描述
对于上面的代码,我们在home组件中打印的props为空,但是about中打印的却有值。因为home是普通渲染的组件,是不可以直接获取到history、location、match对象的。那么如果普通渲染的组件也希望获取到对应的对象和属性要怎么做?

  1. 在组件中增加属性,通过高阶组件去添加属性
  2. react-dom-router也是通过高阶组件的形式为我们的组件添加一些相关的属性的
  3. 使用withRouter高阶组件进行包裹

高阶组件的手动跳转

这里我们需要用到withRouter,直接在前面引入即可

import { BrowserRouter, Link, Route, Switch, withRouter } from 'react-router-dom'

然后进行使用:
1.定义 WithHomeRouter = withRouter(Home),传入home
2.在原来渲染home组件的地方就可以直接使用< WithHomeRouter/>组件

const WithHomeRouter = withRouter(Home)

function User(props) {
    return <h1>User</h1>
}

const About = (props) => {
    const jump = () => {
        console.log(props) // 路由信息对象,里面有history、location、match
        // 通过路由跳转(不论是地址栏输入地址还是link跳转还是手动)展示的组件才会有对应的路由信息
        props.history.push('/user')
    }
    return (
        <div>
            <h2>About</h2>
            <button onClick={e=>{jump()}}>跳转</button>
            {/* 如果是普通组件渲染则没有路由信息,如果需要普通组件拥有路由信息,则可以使用withRouter这个高阶组件来实现 */}
            <WithHomeRouter/>
        </div>
    )
}

原来我们点击关于是没有打印的props的信息的,使用withRouter高阶组件进行包裹之后,就可以打印出来路由的信息:

在这里插入图片描述

好了,本篇文章到这里结束了,如果对你有帮助,可以点赞关注支持一下~~
后续我还会带来更多前端知识内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beiyux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值