react-router实现重定向多种方式(补充中)

正如我们所知,react-router是用来管理路由的,,在路由管理中,一个非常重要的功能就是重定向,下面列举一些react-router实现重定向的方法

1. 使用Route组件中继承自Router组件的props.history

在Router组件的子组件,其props会包含history,location,match属性,三个属性中有和路由相关的信息,这里我们使用history
props打印出来的内容如下
在这里插入图片描述

import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router,Route} from 'react-router-dom'

class AppRouter extends React.Component{
    render(){
        return(
            <Router>
                <Route exact path='/' component={LoginOut}/>
                <Route path='/loginIn' component={LoginIn}/>
            </Router>
        )
    }
}

class LoginIn extends React.Component{
    constructor(props){
        super(props);
        console.log('props: ', props);
        this.loginOut=this.loginOut.bind(this);
    }
    loginOut(){
        this.props.history.push('/')
    }
    render(){
        return <div>
                    <p>welcome</p>
                    <button onClick={this.loginOut}>login out</button>
                </div>
    }
}

class LoginOut extends React.Component{
    constructor(props){
        super(props);
        console.log('props: ', props);
        this.loginIn=this.loginIn.bind(this);
    }
    loginIn(){
        this.props.history.push('/loginIn')
    }
    render(){
        return <div>
                    <p>you need to login</p>
                    <button onClick={this.loginIn}>login in</button>
                </div>
    }
}

ReactDOM.render(<AppRouter />, document.getElementById('root'))

2. 使用react-router-dom里面的useHistory()

useHistory()用在函数组件中,当我在class组件中使用该API时,会发生报错

在这里插入图片描述

import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router,Route,useHistory} from 'react-router-dom'

class AppRouter extends React.Component{
    render(){
        return(
            <Router>
                <Route exact path='/' component={LoginOut}/>
                <Route path='/loginIn' component={LoginIn}/>
            </Router>
        )
    }
}

function LoginIn(props){
    let history=useHistory();
    function loginOut(){
        history.push('/')
    }
    return (
        <div>
            <p>welcome</p>
            <button onClick={loginOut}>login out</button>
        </div>
    )
}

function LoginOut(props){
    let history=useHistory();
    function loginIn(){
        history.push('/loginIn')
    }
    return (
        <div>
            <p>you need to login</p>
            <button onClick={loginIn}>login in</button>
        </div>
    )
}

ReactDOM.render(<AppRouter />, document.getElementById('root'))

3. 使用react-router-dom里面的Redirect组件

Redirect组件在react-devtools中观察不到,当该组件出现的时候,就会跳转到其to属性对应的路由,所以可以在render中使用条件语句或三元运算符来将该组件添加到当前的组件中来达到重定向的目的

import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router,Route,Link,Switch,Redirect} from 'react-router-dom'

class App extends React.Component{
  render(){
    return (
      <Router>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/about">About</Link>
        </li>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/about" component={About}/>
          <Route path="/more" component={More}/>
        </Switch>
      </Router>
    )
  }
}

class Home extends React.Component{
  constructor(props){
    super(props);
    this.state={
      isMore:false
    }
    this.moreContent=this.moreContent.bind(this);
  }
  moreContent(){
    this.setState({
      isMore:true
    })
  }
  render(){
    return (
      <>
        <p>Home</p>
        <button onClick={this.moreContent}>more content</button>
        {/* 当点击按钮的时候,将isMore改为true,使Redirect添加到当前组件中,完成跳转 */}
        {this.state.isMore?(<Redirect to="/more"/>):undefined}
      </>
    )
  }
}

class About extends React.Component{
  render(){
    return (
      <p>About</p>
    )
  }
}

class More extends React.Component{
  render(){
    return (
      <p>More</p>
    )
  }
}


ReactDOM.render(<App />,document.getElementById('root'))
### 使用 `react-router-dom` 实现路由重定向React 应用中,使用 `react-router-dom` 进行路由重定向是一种常见的需求。这可以通过多种方式实现,具体取决于所使用的版本。 #### 版本差异 对于不同版本的 `react-router-dom`,实现路由重定向的方法有所不同: - **v5 及之前版本**:可以使用 `<Redirect>` 组件[^3]。 - **v6 及之后版本**:推荐使用 `<Navigate>` 组件[^1]。 #### v6 中的路由重定向示例 以下是基于 `react-router-dom` v6 的路由重定向示例代码: ```jsx import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; function App() { return ( <Router> <Routes> {/* 定义常规路由 */} <Route path="/home" element={<Home />} /> <Route path="/about" element={<About />} /> {/* 当访问 /old-path 时自动重定向到 /new-path */} <Route path="/old-path" element={<Navigate to="/new-path" replace />} /> {/* 默认情况下未匹配任何路径则重定向至首页 */} <Route path="*" element={<Navigate to="/home" replace />} /> </Routes> </Router> ); } ``` 在这个例子中,当用户尝试访问 `/old-path` 或者其他不存在的路径时,会被自动重定向到新的目标路径或默认首页。 #### 关键属性解释 - `replace`: 设置此参数为 true 表示替换当前历史记录条目而不是创建新条目,这样浏览器回退按钮不会返回到被重定向之前的页面。 #### v5 中的路由重定向示例 如果是使用较早版本(如 v5),则应采用如下方法: ```jsx import { Redirect, Switch, Route } from "react-router-dom"; function App() { return ( <> <Switch> {/* 常规路由定义 */} <Route exact path="/" component={HomePage} /> {/* 使用 Redirect 实现重定向逻辑 */} <Redirect from="/old-url" to="/new-url" /> {/* 捕获所有未知URL并重定向到主页 */} <Redirect to="/" /> </Switch> </> ) } ``` 这里展示了如何利用 `<Redirect>` 组件完成相同的功能,在旧版中这是标准做法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值