React路由参数传递与嵌套路由的实现详细讲解

目录
  • 1. 页面路由参数传递
    • 1.1 动态路由参数
    • 1.2 search字符串
    • 1.3 页面参数隐式传递
  • 2. 嵌套路由

1. 页面路由参数传递

1.1 动态路由参数

描述:

以“/detail/:id”形式传递的数据,在落地组件中通过this.props.match.params得到。

使用:

App.jsx:

import React, { Component } from 'react'
import { Route, Link, NavLink, Switch, Redirect } from 'react-router-dom'
// 匹配成功后渲染的组件
import Home from './views/Home'
import About from './views/About'
import Detail from './views/Detail'
import Notfound from './views/Notfound'
class App extends Component {
  render() {
    return (
      <div>
        <h3>App组件</h3>
        <div>
          <NavLink exact to="/">Home</NavLink>---
          <NavLink to="/about">About</NavLink>
        </div>
        <hr />
        <Route path="/home" component={Home} />
        <Route path="/about" component={About} />
        {/* /detail/1   /detail/2 ... 匹配成功;参数可以传递多个 */}
        <Route path="/detail/:id/:name?" component={Detail} />

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

        <Route component={Notfound} />
        </Switch>
      </div>
    )
  }
}
export default App

about页面:

import React, { Component } from 'react'
import { Link } from 'react-router-dom'
class About extends Component {
  render() {
    return (
      <div>
        <h3>关于我们</h3>
        <hr />
        <ul>
          {Array(10)
            .fill('')
            .map((_, index) => (
              <li key={index}>
                <Link to={`/detail/${index}?`}>新闻 -- {index}</Link>
              </li>
            ))}
        </ul>
      </div>
    )
  }
}
export default About

详情页面:

import React, { Component } from 'react'
class Detail extends Component {
  render() {
    // 获取动态路由参数   对象
    let id = this.props.match.params.id || 0
    return (
      <div>
        <h3>详情页面 --- {id}</h3>
      </div>
    )
  }
}
export default Detail

1.2 search字符串

描述:

通过地址栏中的 ?key=value&key=value传递。

使用:

关于页面:

import React, { Component } from 'react'
import { Link } from 'react-router-dom'
class About extends Component {
  render() {
    return (
      <div>
        <h3>关于我们</h3>
        <hr />
        <ul>
          {Array(10)
            .fill('')
            .map((_, index) => (
              <li key={index}>
                <Link to={`/detail/${index}?age=${2 + index}`}>新闻 -- {index}</Link>
              </li>
            ))}
        </ul>
      </div>
    )
  }
}
export default About

详情页面:

import React, { Component } from 'react'
import qs from 'querystring'
// 封装一个方法,获取数据
// String.prototype.toSearch = function () {
//   let searchData = {}
//   const search = new URLSearchParams(this)
//   search.forEach((value, key) => {
//     searchData[key] = value
//   })
//   return searchData
// }
class Detail extends Component {
  render() {
    // 获取动态路由参数   对象
    let id = this.props.match.params.id || 0
    // search字符串  字符串
    console.log(this.props.location.search)
    // 将字符串转为对象
    console.log(qs.parse(this.props.location.search.slice(1)))
    // 如果用search字符串,推荐用它
    const search = new URLSearchParams(this.props.location.search)
    // 获取就字段数据
    console.log(search.get('age'))
    let searchData = {}
    search.forEach((value, key) => {
      searchData[key] = value
    })
    console.log(searchData)
    // 使用迭代对象获取
    // for (let [key, value] of search.entries()) {
    //   searchData[key] = value
    // }
    // console.log(searchData)
    // 使用封装的方法获取
    // console.log(this.props.location.search.toSearch())
    return (
      <div>
        <h3>详情页面 --- {id}</h3>
      </div>
    )
  }
}
export default Detail

1.3 页面参数隐式传递

描述:

隐式传参(state),通过地址栏是观察不到的;通过路由对象中的state属性进行数据传递,在落地组件中通过this.props.location.state得到。

使用:

home页面:

import React, { Component } from 'react'
import { Link } from 'react-router-dom'
class Home extends Component {
  jumpDetail = () => {
    this.props.history.push({
      pathname: '/detail',
      search: 'name=zhangsan',
      state: { id: 200 }
    })
  }
  render() {
    return (
      <div>
        <div>
          {/* 通过state隐式来传递数据到目标页面 */}
          <Link to={{ pathname: '/detail', state: { id: 100 }, search: 'name=lisi' }}>去详情</Link>
        </div>
        <hr />
        {/* 编程式导航 */}
        <button onClick={this.jumpDetail}>去详情页</button>
      </div>
    )
  }
}
export default Home

详情页面:

import React, { Component } from 'react'
class Detail extends Component {
  render() {
    // 获取页面隐式传过来的state数据  对象
    console.log(this.props.location.state)
    console.log(this.props.location.search.toSearch())
    return (
      <div>
        <h3>详情页面</h3>
      </div>
    )
  }
}
export default Detail

tosearch方法(已导入入口文件中,所以可以直接使用):

String.prototype.toSearch = function () {
  let searchData = {}
  if (this.toString() != '') {
    const search = new URLSearchParams(this.toString())
    search.forEach((value, key) => {
      searchData[key] = value
    })
  }
  return searchData
}

2. 嵌套路由

后台首页:

import React, { Component } from 'react'
import { NavLink, Redirect, Route, Switch } from 'react-router-dom'
import { AdminContainer } from './style'
import Index from '../Index'
import User from '../User'
class Admin extends Component {
  render() {
    // 在子路由定义的组件中,可以通过props中提供的路由对象来获取父路由定义的地址
    // let parentRoutePath = this.props.match.path
    return (
      <AdminContainer>
        <h3>后台首页</h3>
        <div>
          <ul>
            <li>
              <NavLink to="/admin/index">后台首页</NavLink>
            </li>
            <li>
              <NavLink to="/admin/user">用户列表</NavLink>
            </li>
          </ul>
          <div>
            <Switch>
              <Route path='/admin/index' component={Index} />
              <Route path='/admin/user' component={User} />
              <Redirect from='/admin' to='/admin/index' />
            </Switch>
          </div>
        </div>
      </AdminContainer>
      // <AdminContainer>
      //   <h3>后台首页</h3>
      //   <div>
      //     <ul>
      //       <li>
      //         <NavLink to={`${parentRoutePath}/index`}>后台首页</NavLink>
      //       </li>
      //       <li>
      //         <NavLink to={`${parentRoutePath}/user`}>用户列表</NavLink>
      //       </li>
      //     </ul>
      //     <div>
      //       <Switch>
      //         <Route path={`${parentRoutePath}/index`} component={Index} />
      //         <Route path={`${parentRoutePath}/user`} component={User} />
      //         <Redirect exact from={parentRoutePath} to={`${parentRoutePath}/index`} />
      //       </Switch>
      //     </div>
      //   </div>
      // </AdminContainer>
    )
  }
}
export default Admin

到此这篇关于React路由参数传递与嵌套路由的实现详细讲解的文章就介绍到这了,更多相关React路由参数传递内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • React前端路由应用介绍

    浏览器端的前端路由模式:hash模式,history模式 安装路由模块 路由模块不是react自带模块,需要安装第3方模块 // react-router-dom 它现在最新的版本6npm i -S react-router-dom@5 react-router-dom路由库,它路由相关的配置当作组件调用设置 一些相关组件 路由模式组件 包裹整个应用,一个React应用只需要使用一次 HashRouter: 使用URL的哈希值实现 (localhost:3000/#/first) Browser

  • React中react-redux和路由详解

    目录 观察者模式解决组件间通信问题 react-redux connect方法 Provider组件 路由 使用路由 默认路由 路由重定向 获取路由参数 路由导航 观察者模式解决组件间通信问题 使用观察者解决组件间通信,分成两步 在一个组件中,订阅消息 在另一个组件中,发布消息 发布消息之后,订阅的消息回调函数会执行,在函数中,我们修改状态,这样就可以实现组件间通信了.这就是reflux框架的实现. react-redux redux早期被设计成可以在各个框架中使用,因此在不同的框架中使用的时候

  • React路由封装的实现浅析

    目录 了解SAP和路由的概念 再说说路由 路由封装流程 了解SAP和路由的概念 SAP(single page web application)的意思是单页Web应用,正如前言所说,一般来说功能较为复杂都会涉及到页面跳转的功能,而传统的前端页面跳转往往是利用<a/>标签进行跳转,这种方式虽然可以实现功能,但是每次跳转到新的页面都会重新对页面的元素进行加载,这样其实对于用户来说是不太友好的.而单页Web应用则较好的解决了这个问题,因为SAP整个应用都是在一个页面上进行的,每次的页面跳转只涉及到页

  • React路由组件三种传参方式分析讲解

    目录 路由组件和组件的区别 Swith内置组件使用 react 路由传参 编程式导航 Redirect重定向 路由组件和组件的区别 路由组件时被Router组件使用的组件,this.props里面有三个参数,分别是history.match.location 可以接收到路由跳转传参,也可以进行编程式导航跳转 普通组件只有父传子的props值 Swith内置组件使用 作用:当匹配一个路由组件时,其他组件不会被使用,可以加入404页面,给用户进行友好提示,提升用户体验 react 路由传参 方式一:

  • react实现移动端二级路由嵌套详解

    页面效果展示 功能需求 根据下面不同的标题切换不同的页面,请求接口数据,渲染页面数据,点击左侧数据,进入详情页面,在右侧图片中点击返回返回左面页面 实现代码 我们用到了react中的router,首先我们要下载react的路由,命令是 react-router-dom@5 --save 路由5版本跟6版本使用语法上略有区别,现在使用较多的是5版本 我们首先在index.js文件中引入react路由,然后进行路由跳转 import { default as React } from 'react'

  • React路由中的redux和redux知识点拓展

    目录 路由中使用redux 路由reducer Redux拓展 state拓展 action拓展 静态action 动态action 异步action 异步action中间件 路由中使用redux 在路由中使用redux只需要两步: 第一步 在路由策略组件中(如HashRouter),渲染Route组件,并在该Route路由规则组件中,引入connect方法处理后的应用程序组件 第二步 在Provider组件中,渲染路由策略组件(如HashRouter). 注意:路由规则渲染组件的时候,路由规则

  • React路由参数传递与嵌套路由的实现详细讲解

    目录 1. 页面路由参数传递 1.1 动态路由参数 1.2 search字符串 1.3 页面参数隐式传递 2. 嵌套路由 1. 页面路由参数传递 1.1 动态路由参数 描述: 以“/detail/:id”形式传递的数据,在落地组件中通过this.props.match.params得到. 使用: App.jsx: import React, { Component } from 'react' import { Route, Link, NavLink, Switch, Redirect } f

  • react嵌套路由实现TabBar的实现

    有两种页面,一种是有TabBar的页面,如下图; 一种是无TabBar的页面 有TabBar的页面使用嵌套路由来实现 嵌套路由:路由内部包含路由 使用步骤 1 在pages文件夹创建News/index.js组件(子路由要展示的内容) import React from "react" export default class News extends React.Component{ render(){ return <div style={{background:'yello

  • 全面解析vue router 基本使用(动态路由,嵌套路由)

    路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.Home按钮  => home 内容, about按钮 => about 内容,也可以说是一种映射. 所以在页面上有两个部分,一个是点击部分,一个是点击之后,显示内容的部分. 点击之后,怎么做到正确的对应,比如,我点击home 按钮,页面中怎么就正好能显示home的内容.这就要在js 文件中配置路由. 路由中有三个基本的概念 route,

  • Vue 嵌套路由使用总结(推荐)

    开发环境 Win 10 node-v10.15.3-x64.msi 下载地址: https://nodejs.org/en/ 需求场景 如下图,我们希望点击导航栏不同菜单时,导航栏下方加载不同的组件,进而展示不同的页面内容 解决方案 使用动态路由 新建home.vue作为子页面组件 <template> <div> <h3>home Page</h3> <p>home page content</p> </div> <

  • AngularJS ui-router (嵌套路由)实例

    我们都知道,如果使用原生路由的话,Angular的视图是通过ng-view这个指令进行加载的.比如这样:<div ng-view></div>.一般,我们都会把这个指令放在index.html这个文件里面,然后,通过控制器来加载相应的模板视图.比如这样: var bookStoreApp = angular.module('bookStoreApp', [ 'ngRoute', 'ngAnimate', 'bookStoreCtrls', ]); bookStoreApp.conf

  • react-router4 嵌套路由的使用方法

    react我自己还在摸索学习中,今天正好学习一下react-router4 嵌套路由的使用方法,顺便留着笔记 先直接贴代码 import React from 'react'; import ReactDOM from 'react-dom'; import { HashRouter as Router, Route, Switch} from 'react-router-dom'; import createBrowserHistory from 'history/createBrowserH

  • react-router-dom 嵌套路由的实现

    入口文件index.js: import React from "react" import ReactDOM from "react-dom" import App from "./App.jsx" import "babel-polyfill" const root = document.getElementById("app") if (root !== null) { ReactDOM.render

  • react-router-domV6版本的路由和嵌套路由写法详解

    目录 1-单级路由 2-嵌套路由(about路径进行嵌套) ReactRouterv6使用路由嵌套和重定向 1 - 单级路由 <NavLink to="/home">Home</NavLink> <NavLink to="/about">about</NavLink> <Routes>   <Route path='/home' element={<Home/>}/>   <R

  • react-router-domV6嵌套路由实现详解

    目录 V6新特性 <Route>的属性变更component/render->element <Link/>使用变动 <Redirect/> 替换为 <Navigate/> <Switch/> 重命名为 <Routes/> 用useNavigate代替useHistory 依赖包大小从20kb减少到8kb,整体体积减少 新钩子useRoutes代替react-router-config 新标签:<Outlet/> V

随机推荐