0604嵌套路由与路由传参-react路由-react

这篇具有很好参考价值的文章主要介绍了0604嵌套路由与路由传参-react路由-react。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 嵌套路由

1.1 使用

示例效果如下图1.1-1所示:

0604嵌套路由与路由传参-react路由-react

该示例代码其他部分和上一篇相同,这里主要讲解下嵌套路由的使用。

分析:home组件中嵌套了News和Message两个路由组件。

  • 创建News组件

    • 在原项目结构Home文件夹下创建News/index.jsx

    • 源代码1.1-1如下所示

      import React, { Component } from 'react'
      
      export default class News extends Component {
        render() {
          return (
            <ul>
            <li>news001</li>
            <li>news002</li>
            <li>news003</li>
          </ul>
          )
        }
      }
      
  • 创建Message组件

    • Home文件夹下创建Message/index.jsx

    • 源代码1.1-2如下图所示

      import React, { Component } from 'react'
      
      export default class Message extends Component {
        render() {
          return (
            <div>
              <ul>
                <li>
                  <a href="/message1">message001</a>&nbsp;&nbsp;
                </li>
                <li>
                  <a href="/message2">message002</a>&nbsp;&nbsp;
                </li>
                <li>
                  <a href="/message/3">message003</a>&nbsp;&nbsp;
                </li>
              </ul>
            </div>
          )
        }
      }
      
  • Home/jsx添加导航链接和注册路由

    • 源代码1.1-3如下所示:

      import React, { Component } from 'react'
      import { Route, Switch, Redirect } from 'react-router-dom';
      import MyNavLink from '../../components/MyNavLink'
      import Message from './Message';
      import News from './News'
      
      export default class Home extends Component {
        render() {
          return (
            <div>
              <h3>我是Home的内容</h3>
              <div>
                <ul className="nav nav-tabs">
                  <li>
                    <MyNavLink to="/home/news">News</MyNavLink>
                  </li>
                  <li>
                    <MyNavLink to="/home/message">Message</MyNavLink>
                  </li>
                </ul>
              </div>
              {/* 注册路由 */}
              <Switch>
                <Route path="/home/news" component={News} />
                <Route path="/home/message" component={Message} />
                <Redirect to="/home/news" />
              </Switch>
            </div>
          )
        }
      }
      

启动项目,完成嵌套路由的使用。

  • 分析路由匹配原理
    • 首先react完成App.jsx中路由注册
    • 当点击News时,对应路径"/home/news"开始按照路由注册顺序开始匹配。
      • 优先模糊匹配"/home",展示Home组件。
      • 继续匹配Home组件中路径"/home/news",展示News组件。

1.2 总结

  • 注册路由时要写上父路由的path值;
  • 路由匹配是按照注册路由的顺序进行的。

2 路由传参

2.1 示例准备

示例效果,点击消息,展示对应的消息内容,如下图2.1-1所示:

0604嵌套路由与路由传参-react路由-react

示例其他代码同上,这里只写对应的消息部分。

  • 简单分析

    • 当前为二级路由下导航链接,点击链接,展示消息详情,即为三级路由。
    • 消息详情结构一致,封装为路由组件Detail。
    • Message组件下消息结构一样,内容不同,在state中写数据,遍历动态生成。
  • Detail组件代码2.1-1如下所示:

    import React, { Component } from 'react'
    
    export default class Detail extends Component {
      render() {
        return (
          <ul>
            <li>ID:xxx</li>
            <li>TITLE:xxx</li>
            <li>CONTENT:xxx</li>
          </ul>
        )
      }
    }
    
  • Messge组件代码2.1-2如下所示:

    import React, { Component } from 'react'
    import { Link, Route } from 'react-router-dom'
    import Detail from './Detail'
    
    export default class Message extends Component {
      state = {
        messArr : [
          { id: '01', title: '消息1' },
          { id: '02', title: '消息2' },
          { id: '03', title: '消息3' },
        ]
      }
      render() {
        const { messArr } = this.state
        return (
          <div>
            <ul>
              {
                messArr.map((msg) => {
                  return (
                    <li key={msg.id}>
                      <Link to="/home/message/detail">{msg.title}</Link>&nbsp;&nbsp;
                    </li>
                  )
                })
              }
            </ul>
            <hr />
            <Route path="/home/message/detail" component={Detail}></Route>
          </div>
        )
      }
    }
    

如果想要实现点击不同消息链接,展示不同的消息内容,需要通过路由传递参数。下面我们详细讲解三种路由传参方式,并做总结和比较。

2.1 传递params参数

  • 第一步:路由链接向路由组件传递params参数

    {/* 格式:/}
    <Link to="/path1/path2/.../pathn/参数1/参数2/.../参数n"></Link>
    {/* 示例:/}
    {/* 向路由组件传递params参数 */}
    <Link to={`/home/message/detail/${msg.id}/${msg.title}`}>{msg.title}</Link>&nbsp;&nbsp;
    
  • 第二步:路由组件声明接收params参数

    {/* 格式 */}
    <Route path="/path1/path2/.../pathn/:参数1/:参数2/.../:参数n" component={组件}></Route>
    {/* 示例 */}
    {/* 声明接收params参数 */}
    <Route path="/home/message/detail/:id/:title" component={Detail}></Route>
    
  • 第三步:组件获取参数

    // 组件内 this.props.match.params 即为react封装好的params对象
    const {id, titel} = this.props.match.params
    

Detail组件index.jsx组件获取和展示参数如下所示源代码2.1-1如下所示:

import React, { Component } from 'react'
const data = [
  {id: 1, content: '学习 Java'},
  {id: 2, content: '学习 Python'},
  {id: 3, content: '学习 React'},
]

export default class Detail extends Component {
  render() {
    // console.log(this.props);
    let {id, title} = this.props.match.params
    id = id - 0
    const detail = data.find((detail) => {
       return detail.id === id
    })  
    return (
      <ul>
        <li>ID: {id}</li>
        <li>TITLE: {title}</li>
        <li>CONTENT: {detail.content}</li>
      </ul>
    )
  }
}

2.2 传递search参数

  • 第一步:路由链接向路由组件传递search参数

    {/* 格式:/}
    <Link to="/path1/path2/.../pathn/?参数1=值1&参数2=值2&...&参数n=值n"></Link>
    {/* 示例:/}
    {/* 向路由组件传递params参数 */}
    <Link to={`/home/message/detail/?id=${msg.id}&title=${msg.title}`}>{msg.title}</Link>&nbsp;&nbsp;
    
  • 第二步:接受search参数无需声明

    {/*  */}
    <Route path="/path1/path2/.../pathn" component={组件}></Route>
    {/* 示例 */}
    {/* 声明接收params参数 */}
    <Route path="/home/message/detail" component={Detail}></Route>
    
  • 第三步:组件获取参数

    // 组件内 this.props.location.search 为接受的search字符串,形式:?参数1=值1&参数2=值2&...
    // 需要自己处理或者第三方库
    const {search} = this.props.location
    

Detail组件index.jsx组件获取和展示参数如下所示,其他同上源代码2.1-2如下所示:

let {id, title} = qs.parse(this.props.location.search, {ignoreQueryPrefix: true})

2.3 传递state参数

注:此state为组件state参数不是组件的state属性。

  • 第一步:路由链接向路由组件传递state参数

    {/* 格式:/}
    <Link to={{pathname: "/path1/path2/.../pathn, state: {参数1: 值1, 参数2: 值2, ...}}}></Link>
    {/* 示例:/}
    {/* 向路由组件传递state参数 */}
    <Link to={{pathname: '/home/message/detail', state: msg}}>{msg.title}</Link>
    
  • 第二步:接受search参数无需声明

    {/* 格式 */}
    <Route path="/path1/path2/.../pathn" component={组件}></Route>
    {/* 示例 */}
    {/* 无需声明接收state参数 */}
    <Route path="/home/message/detail" component={Detail}></Route>
    
  • 第三步:组件获取参数

    // 组件内 this.props.location.state 即为接受的state参数对象
    const {id, title} = this.props.location.state
    

Detail组件index.jsx组件获取和展示参数如下所示,其他同上源代码2.1-2如下所示:

// 接收state参数
let {id, title} = this.props.location.state

2.4 路由参数总结

  • 使用形式
  1. params参数传递
    • 路由链接传递参数:<Link to="/demo/test/4/aaa">测试</Link>
    • 路由组件声明加收参数:<Route path="/demo/test/:id/:title" component={Test} />
    • 组件接受参数:let {id, title} = this.props.match.params
  2. search参数传递
    • 路由链接传递参数:<Link to="/demo/test/?id=1&title=xxx">测试</Link>
    • 注册路由组件(无需声明):<Route path="/demo/test" component={Test} />
    • 组件接受参数:let {search} = this.props.locaiton,然后解析
  3. state参数
    • 路由链接传递参数:<Link to={{pathname: '/demo/test', state: {id: 1, title: 'xxx'}}}>测试</Link>
    • 注册路由组件(无需声明):<Route path="/demo/test" component={Test} />
    • 组件接受参数:let {id, title} = this.props.location.state
    • 注:刷新也可以保住参数*,因为路由器是BrowserRouter,react维护history;但是如果清空缓存,参数丢失。
  • 比较
    • params传参:路径携带参数;
    • search传参:路径携带参数,接受参数后需要另外解析;
    • state传参:适用于参数具有一定保密性需求,不希望对外暴露场景

结语

❓QQ:806797785

⭐️源代码仓库地址:https://github.com/gaogzhen/react-staging.git

参考:

[1]React视频教程[CP/OL].2020-12-15.p85-89.

[2]React官网[CP/OL].文章来源地址https://www.toymoban.com/news/detail-463960.html

到了这里,关于0604嵌套路由与路由传参-react路由-react的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Umi3 创建,配置环境,路由传参(代码示例)

    目录 创建项目 配置环境 创建脚手架 项目结构及其目录、 路由 配置路由 嵌套路由 编程式导航和声明式导航 声明式导航 编程式导航 约定式路由 路由传参 query传参(问号) 接收参数 params传参(动态传参) 接收参数 配置环境 首先得有 node,并确保 node 版本是 10.13 或以上。

    2024年01月19日
    浏览(53)
  • React V6路由跳转,跳转传参(params,search,state)

    注意:以下代码为个人笔记,不全,需自行调整,方可使用 公共跳转方法

    2024年02月11日
    浏览(45)
  • 【React Router 6 快速上手一】重定向Navigate / useRoutes路由表 / 嵌套路由Outlet

    前言 博主主页👉🏻蜡笔雏田学代码 专栏链接👉🏻React专栏 之前学习了react-router-dom5版本的相关内容 参考文章👉🏻React路由(详解版)和 路由的模糊匹配,重定向以及嵌套路由 今天来学习react-router-dom6版本的相关知识! 感兴趣的小伙伴一起来看看吧~🤞 React Router 以三个不

    2024年02月02日
    浏览(49)
  • react 11之 router6路由 (两种路由模式、两种路由跳转、两种传参与接收参数、嵌套路由,layout组件、路由懒加载)

    npm i react-router-dom 两种模式 Router:所有路由组件的根组件,包裹路由的最外层容器 Link:跳转路由组件 Routes :用于定义和渲染路由规则( 用于替换 Switch 组件) Route:路由规则匹配组件,显示当前规则对应的组件 exact = 精确匹配,只有当 path 和 pathname 完全匹配时才会展示该路由

    2024年02月12日
    浏览(46)
  • vue3使用vue-router嵌套路由(多级路由)

    Vue3 嵌套路由的使用和 Vue2 相差不大,主要的区别是 Vue3 的路由实例化使用了 createApp() 方法,所以实例化路由时需要传入根组件。另外,Vue3 的路由对象除了包含 Vue2 中的导航守卫、导航钩子和解析守卫等功能外,还新增了 meta prop 和 route prop。 在使用嵌套路由时,建议将路由

    2024年02月03日
    浏览(51)
  • Vue中使用Element UI的Table组件实现嵌套表格(最简单示例)

    以下是一个简单的示例代码,演示如何在Vue中使用Element UI的Table组件实现嵌套表格: 上面的代码通过type=\\\"expand\\\"设置了一个展开按钮,点击该按钮会显示与当前行关联的子表格内容。 在上面的示例中,我们定义了一个包含姓名和年龄的主表格,以及一个展开列用于显示与每行

    2024年02月02日
    浏览(76)
  • h5|web页面嵌套iframe传参给cocosCreator

    目录 一、快速浏览 二、详细实现与项目代码 三、安全性评估——iframe 实现效果: 一、快速浏览 在h5页面中,使用JavaScript获取需要传递的参数,如下: 使用iframe嵌入cocosCreator游戏页面,同时将参数作为url的query string传递,如下: 在cocosCreator游戏页面中,使用JavaScript获取ur

    2024年02月02日
    浏览(40)
  • clickhouse的嵌套数据结构Tuple、Array与Nested类型介绍和使用示例

    Tuple 是 ClickHouse 数据库中的一种数据类型,它允许在一个字段中存储由不同数据类型组成的元组(tuple)。 元组可以包含任意数量的值,并且每个值可以是不同的数据类型,如 int 、 float 、 string 、 date 等。 例如,以下是一个 clickhouse Tuple 类型的例子: (1, \\\'John\\\', 12.5, Date(\\\'2021-0

    2024年02月14日
    浏览(48)
  • vue3中使用router路由实现跳转传参

    大家好,今天和大家分享一下vue3中如何进行跳转并进行传参。 vue3取消了vue2部分api,所以路由跳转和传值的方式会有所不同。 我们今天主要讲router.push(location, onComplete?, onAbort?) vue3中新增API:useRouter和useRoute 1.首先在需要跳转的页面引入API—useRouter 2.在跳转页面定义router变量

    2023年04月09日
    浏览(42)
  • 微信小程序使用路由传参和传对象的方法

    近期在做微信小程序开发,在页面跳转时,需要携带参数到下一个页面,尤其是将对象传入页面。为了方便重温,特此记录。 传递字符串参数比较简单。路由跳转有两种方式,一种是通过navigator组件的url完成,另一种是使用wx.navigateTo()跳转。wxml代码如下: 需要通过按钮的方

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包