react Router 学习

本文详细介绍如何使用 React Router 实现多级路由、动态路由配置及编程式导航。涵盖路由组件引入、配置、动态参数传递及使用高阶组件实现跨组件跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 功能:

1.进入项目后的默认路径是home,默认展示首页模块

2.点击路由,切换子组件

3.点击文章路由,根据传值不同进入三级详情路由,同时二级路由不显示

4.点击返回首页,跳转到首页

 

安装router

npm install react-router-dom --save

配置路由:

1.根组件index.js里面 引入路由组件你可以选择BrowserRouter路由或是HashRouter路由

import {BrowserRouter as Router,Route} from 'react-router-dom'
// import {HashRouter as Router} from 'react-router-dom'

2.然后用Router组件将根组件包括起来,Route组件是用来跳转和接收路由信息的

import React from 'react';
import ReactDOM from 'react-dom';
import './index.less';
import App from './App';

//Provider是react-redux提供的一个组件
import { Provider } from 'react-redux'
import store from './store/store'


import {BrowserRouter as Router,Route} from 'react-router-dom'
// import {HashRouter as Router} from 'react-router-dom'



ReactDOM.render(
       <Provider store={store}>
            <Router>
                <Route component={App}></Route>   
            </Router>
       </Provider>
,document.getElementById('root'));




根组件App.js

1.将首页,文章,用户这三个一级路由组件引入

2.用Link组件的to属性指定按钮的跳转路径

3.使用Route组件渲染这三个引入的子组件,Route用于传递路由信息,渲染组件,设置跳转信息

4.使用Route渲染组件有两种方式

第一种:<Route component={Users}   path='/user'></Route>  使用component渲染,将路径指定为按钮要跳转的路径即可

第二种:使用render渲染,和上一种不能同时兼容,这种方法可携带参数,例如下面的x={1} ,routerProps是路由信息,可以一起传过去

5.exact 为严格匹配跳转路径

<Route path='/home' render={(routerProps)=>{

              return <Home {...routerProps} x={1}/>
}}></Route>

6.Redirect 组件是默认跳转的地方 第一个若用户访问/,默认跳转到/home,第二个,若用户访问其他的路径,默认跳转到/404

<Redirect to='/home'  from='/' exact></Redirect>

<Redirect to='/404'></Redirect>

7.Switch组件,包裹在要渲染的路由组件Route外面,可以对路径进行一个匹配和判断,组件内跳转路径多的时候一般都使用Switch

8.至此点击首页和用户已经可以正常跳转和展示子组件

import React, { Component } from 'react';
import {Route,NavLink as Link,Redirect,Switch} from 'react-router-dom'


import Home from './Home'
import Article from './Artical'
import Users from './User'
import ArticalDetail from './ArticalDetail'
import NotFound from './NotFound'

//exact 严格匹配
class App extends Component {
  render() {
    //console.log(this.props) //路由信息
    return (
      <div> 
          <ul>
                <li><Link to='/home'>首页</Link></li>
                <li><Link to='/art'>文章</Link></li>
                <li><Link to='/user'>用户</Link></li>
          </ul>

        <Switch>
            <Route path='/home' render={(routerProps)=>{
              //console.log(routerProps) //路由信息
              return <Home {...routerProps} x={1}/>
            }}></Route>
            <Route component={Article} path='/art' exact></Route>
            <Route component={ArticalDetail} path='/art/:id'></Route>
            <Route component={Users} path='/user'></Route>
            <Route component={NotFound} path='/404'></Route>
            {/* 默认跳到首页 */}
            <Redirect to='/home' from='/' exact></Redirect>
            <Redirect to='/404'></Redirect>
        </Switch>

     </div>
    );
  }
}


export default App

Artical.js 下面说下文章组件的路由配置,这里面有动态路由传参和二级路由 

1.同样,使用Link标签做路由跳转

2.将跳转的参数携带在路径上即可

3.传参方法两种,

第一种:<Link to='/art/1'>文章一</Link> 就是上面写的那种

第二种:使用对象的方式跳转,携带的参数可以写在state中

在被传参页面可通过this.props.location.state 接收

<Link to={
      {pathname:'/art/2',
         state:{
            from:"art隐式传参"
           }
         }
      }>
     文章二
</Link>
import React, { Component } from 'react';
import {NavLink as Link} from 'react-router-dom'

//query传参
//动态路由 /path/:id
//使用state 隐式传参

class Artical extends Component {
  render() {
    // 隐式传参的参数不会现实在地址栏里
    return (
      <div> 
          <Link to='/art/1'>文章一</Link>
          <br/>
          <Link to={
            {pathname:'/art/2',
            state:{
                from:"art隐式传参"
              }
            }
            }>文章二</Link>
      </div>
    );
  }
}


export default Artical

下面看一下文章详情的路由配置,文章详情是文章点进去的三级路由,如果点击文章列表跳转后,不想展示文章列表,只想展示文章详情,那么文章详情路由可以在一级页面去渲染配置,不用经过二级文章列表组件

在App.js下面

引入文章详情组件,配置动态路由

import ArticalDetail from './ArticalDetail'
<Route component={ArticalDetail} path='/art/:id'></Route>

ArticalDetail.js 文章详情组件

1.组件内可以通过this.props.match.params.id接收路由参数,判断渲染什么详情

import React, { Component } from 'react'


export default class ArticalDetail extends Component {
    render() {
        //console.log('ArticalDetail',this.props.location.state) //{from: "art隐式传参"}
        return (
            <div>
                文章详情 {this.props.match.params.id}
            </div>
        )
    }

}

至此完成了三级路由及动态路由的功能

以上的内容是使用标签导航,下面说一下编程式导航

假设文章详情组件有个按钮button需要点击跳转到首页,而这个button是封装好的组件,这个组件并不是使用Route渲染的,因此并不携带路由信息

首先创建button.js组件

1.要实现跳转首页,首先在button上绑定点击事件goHome

2.想要使用路由信息跳转,因为本组件不是用Route标签渲染的,所以要引入高阶组件withRouter

3.withRouter(Button)在导出时使用withRouter包裹组件即可,然后就可以使用编程式导航this.props.history.push跳转,

还可传参

import React, { Component } from 'react'

//单独抽离的公共组件 作用 返回首页
//只有通过Route标签渲染的组件 才有路由属性 button没有通过Route标签渲染 所以不能直接使用this.props.history.push
//可通过withRouter高阶组件来使用


import {withRouter} from 'react-router-dom'

class  Button extends Component {
    render() {
        return (
            <div>
                <button onClick={this.goHome.bind(this)}>返回首页</button>
            </div>
        )
    }

    //编程式导航 返回首页
    goHome(){
        // console.log('路由',this.props)
        // this.props.history.push('/home')
        this.props.history.push({
            pathname:'/home',
            state:{
                x:"我是文章详情button组件传的值"
            }
        })
    }
}

export default withRouter(Button)

然后将Button组件引入文章详情ArticalDetail.js 组件:

import React, { Component } from 'react'

import Button from './compoent/Button'

export default class ArticalDetail extends Component {
    render() {
        return (
            <div>
                文章详情 {this.props.match.params.id}
                <Button></Button>
            </div>
        )
    }

}

至此实现了上述功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值