React路由进阶

一、react嵌套路由

views文件夹下新建film文件夹,里面新建两个组件:
在这里插入图片描述
Film.js增加嵌套路由:

<Switch>
        <Route path="/film/nowplay" component={NowPlay}></Route>
        <Route path="/film/comingsoon" component={Comingsoon}></Route>
        <Redirect from="/film" to="/film/nowplay"></Redirect>
      </Switch>

在这里插入图片描述
效果:
在这里插入图片描述
在这里插入图片描述


二、声明式导航

FilmRouter文件夹下新建components文件夹,新建Tabbar.js组件,在components一些公共的组件放在这里面。而views文件夹放一些页面组件。
Tabbar.js组件,写入如下代码:

import React, { Component } from 'react'
import {NavLink} from 'react-router-dom'

export default class Tabbar extends Component {
  render() {
    return (
      <div>
          <ul>
              <li>
                  <NavLink to="/film">电影</NavLink>
              </li>
              <li>
                  <NavLink to="/cinema">影院</NavLink>
              </li>
              <li>
                  <NavLink to="/profile">我的</NavLink>
              </li>
          </ul>
      </div>
    )
  }
}

并且将Tabbar写入到路由里:
在这里插入图片描述
并且在ReactRouter.js中写好插槽:
在这里插入图片描述
效果:
在这里插入图片描述
可以看到点击那个,那个就会有activeclass,可以根据这个来进行高亮显示,并且我们通过浏览会退和前进,高亮也会随着改变。当然你也可以自定义这个class的name,只需要在每个NavLink增加一个属性actuveClassName就可以自定义高亮的类名。


三、编程式导航

film文件夹下的nowPlay.js 函数组件中写入:

import axios from 'axios'
import React, { useEffect, useState } from 'react'
import { useHistory } from 'react-router-dom'
// import { useHistory } from 'react-router-dom' // 这种是router给hooks封装好的编程式跳转路由方法

export default function NowPlay(props) {
  
  let [movieList, setMovieList] = useState([])  
  
  useEffect(() => {
    axios({
        url: 'https://m.maizuo.com/gateway?cityId=110100&pageNum=1&pageSize=10&type=1&k=3752570',
        method: 'get',
        headers: {
            'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.2.0","e":"1646314068530784943341569","bc":"110100"}',
            'X-Host': 'mall.film-ticket.film.list'
        }
    }).then((res) => {
        console.log(res)
        setMovieList(res.data.data.films)
    }, (err) => {
        console.log(err)
    })
  }, [])
//   const history = useHistory(); // 这种是router给hooks封装好的编程式跳转路由方法

  const detailHandle = (id) => {
    console.log(props)
    props.history.push(`/detail/${id}`)

    // history.push(`/detail/${id}`) // 这种是router给hooks封装好的编程式跳转路由方法
  }

  return (
    <div>
        {movieList.map((item) => 
            <li key={item.filmId} onClick={() => {
                detailHandle(item.filmId)
            }}>{item.name}</li>
        )}
    </div>
  )
}

可以看到效果:
在这里插入图片描述
只不过我们动态的详情组件还没写。


四、动态路由

react路由传参一:
定义好路由:<Route path="/detail/:filmId" component={Detaill}></Route>,在具体组件上进行传参:props.history.push(/detail/${id}),在Detail.js组件中获取接收到的参数:
props.match.params.filmId

react路由传参二:
1、定义好路由:<Route path="/detail" component={Detaill}></Route>
2、this.props.history.push({pathname: ‘/xxx’, query: {day: ‘12’}) (获取值:this.props.location.query.day)

react路由传参三:
3、this.props.history.push({pathname: ‘/xxx’, state: {day: ‘88’}) (获取值:this.props.location.state.day)

在这里插入图片描述
在这里插入图片描述

三种传参数区别:只有第一种刷新会保留传参的id,其他两种会丢失。

追加一个详情路由及组件detail.js

import React from 'react'

export default function Detaill(props) {
  
//   console.log(props.match.params.filmId) // 第一种方式路由获取参数 
//   console.log(props.location.query.filmId) // 第二种方式路由获取参数  
  console.log(props.location.state.filmId) // 第三种方式路由获取参数  


  return (
    <div>Detaill</div>
  )
}

以上是三种路由传参的接收方法。

在学习React的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你华还是你华

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

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

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

打赏作者

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

抵扣说明:

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

余额充值