文章目录

  • React学习:路由定义及传参、数据复用-学习笔记
    • 在React中使用react-router-dom路由
    • 简单例子
    • 路由定义及传参

React学习:路由定义及传参、数据复用-学习笔记

在React中使用react-router-dom路由

使用React构建的单页面应用,要想实现页面间的跳转,首先想到的就是使用路由。在React中,常用的有两个包可以实现这个需求,react-routerreact-router-dom

安装
首先进入项目目录,使用npm安装react-router-dom:

cnpm install react-router-dom --save

涉及知识点:
一般一个路由的至少会有三大组件,分别是BrowserRouterRouteLink;
BrowserRouter:可以将其理解为一个容器,用来放Route、Link。
Route:可以理解为当前要展示的视图,会根据路由中不同的路径呈现不同展示。Route会有三大props,分别是location、history、match;其中match有包含params、isExact、path、url这些属性。
Link:申明了路由的路由,要跳转的地方,简单的可以理解为“要到哪去”。

常用API
路由容器组件
BrowserRouter: 浏览器自带的API,restful风格(需要后台做相应的调整);
HashRouter: 使用hash方式进行路由;
MemoryRouter: 在内存中管理history,地址栏不会变化。在reactNative中使用。

Route标签
该标签有三种渲染方式componentrenderchildren(绝大多数情况使用component组件就好了);
三种渲染方式都会得到三个属性match、history、location
渲染组件时,route props跟着一起渲染;
children方式渲染会不管地址栏是否匹配都渲染一些内容,在这里加动画一时很常见的做法。

Link标签
to: 后面可以接字符串,也可以跟对象(对象可以是动态地添加搜索的信息);
replace: 当设置为true时,点击链接后将使用新地址替换掉访问历史记录里面的原地址。

NavLink标签
<NavLink><Link>的一个特定版本, 会在匹配上当前URL的时候会给已经渲染的元素添加样式参数;
activeClassName,当地址匹配时添加相应class;
activeStyle,当地址匹配时添加相应style;
exact,当地址完全匹配时,才生效;
isActive,添加额外逻辑判断是否生效。

Prompt标签
when: when的属性值为true时启用防止转换;
message: 后面可以跟简单的提示语,也可以跟函数,函数是有默认参数的。

Redirect标签
<Redirect/>可以写在<Route/>render属性里面,也可以跟<Route/>平级;
to: 依旧是可以跟字符串或对象;
push: 添加该属性时,地址不会被覆盖,而是添加一条新纪录;
from: 重定向,与<Route/>平级时。

match
params: 通过解析URL中动态的部分获得的键值对;
isExact: 当为true时,整个URL都需要匹配;
path: 在需要嵌套<Route/>的时候用到;
url: 在需要嵌套<Link/>的时候会用到;

获取方式:

this.props.match

导入方式:

  import {BrowserRouter as Router, Route,   // 这是基本的路由块Link,    // 这是a标签Switch   // 这是监听空路由的Redirect // 这是重定向Prompt   // 防止转换  } from 'react-router-dom'

react-router和react-router-dom的区别是什么呢?
为什么有时候我们看到如下的写法:
写法1:

import {Swtich, Route, Router, HashHistory, Link} from 'react-router-dom';

写法2:

import {Switch, Route, Router} from 'react-router';
import {HashHistory, Link} from 'react-router-dom';

react-router: 实现了路由的核心功能
react-router-dom: 基于react-router,加入了在浏览器运行环境下的一些功能,例如:Link组件,会渲染一个a标签,Link组件源码a标签行; BrowserRouter和HashRouter组件

其他函数
replace
有些场景下,重复使用push或a标签跳转会产生死循环,为了避免这种情况出现,react-router-dom提供了replace。在可能会出现死循环的地方使用replace来跳转:

this.props.history.replace('/detail');

goBack
场景中需要返回上级页面的时候使用:

this.props.history.goBack();

简单例子

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import Routes from './project/routes'
import * as serviceWorker from './serviceWorker';  //资源缓存//React.StrictMode严格模式
ReactDOM.render(<React.StrictMode><Routes  /></React.StrictMode>,document.getElementById('root')
);
serviceWorker.unregister();
import React,{Component} from 'react';
import {BrowserRouter as Router, Route} from 'react-router-dom'//导入组件
import Home from './home/index'
import Login from './login/index'class Routes extends Component {render(){return (<Router><div><Route path='/login' component={Login} ></Route><Route path='/index' component={Home} ></Route></div></Router>)}}export default Routes;

路由定义及传参

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import 'antd/dist/antd.css'
import Routes from './project/routes/routes'
import * as serviceWorker from './serviceWorker';  //资源缓存//React.StrictMode严格模式
ReactDOM.render(<React.StrictMode><Routes  /></React.StrictMode>,document.getElementById('root')
);
serviceWorker.unregister();

路由传参:

import React,{Component} from 'react';
import {BrowserRouter as Router, Route, Link} from 'react-router-dom'//导入组件
import Banner from '../other/banner'// 音乐组件
class Music extends Component {render(){return <h1>Music {this.props.location.query}</h1>}
}
//类别组件
class Category extends Component {render(){return <h1>Category {this.props.match.params.id}</h1>}
}class Routes extends Component {constructor(){super();this.state = {n:999}}render(){return (<Router>{/* 跳转 */}<ul><li><Link to='/index/1/10'>首页</Link></li><li><Link to={'/tool/'+this.state.n}>工具模块</Link></li><li><Link to={{pathname:'/music',query:'123456'}}>音乐模块</Link></li></ul>{/* 渲染出口 */}<div><Route path='/tool/:id' component={Category} ></Route><Route path='/index/:id/:size' component={Banner} ></Route><Route path='/music' component={Music} ></Route></div></Router>)}}export default Routes;

若将routes写到另一个文件中,动态加载:

import React,{Component} from 'react';//导入组件
import Banner from '../other/banner'// 音乐组件
class Music extends Component {render(){return <h1>Music</h1>}
}
//类别组件
class Category extends Component {render(){return <h1>Category </h1>}
}let routes = [{path:'/index',component:Banner},{path:'/tool',component:Category},{path:'/music',component:Music}
]
export default  routes;
import React,{Component} from 'react';
import {BrowserRouter as Router, Route, Link} from 'react-router-dom'
import routes from './index'class Routes extends Component {constructor(){super();this.state = {n:999}}render(){return (<Router>{/* 跳转 */}<ul><li><Link to='/index'>首页</Link></li><li><Link to='/tool'>工具模块</Link></li><li><Link to='/music'>音乐模块</Link></li></ul>{/* 渲染出口 */}<div>{routes.map((item,i)=>{return <Route key={i} path={item.path} component={item.component} ></Route>})}</div></Router>)}}export default Routes;

React学习:路由定义及传参、数据复用-学习笔记相关推荐

  1. 【python教程入门学习】Python函数定义及传参方式详解(4种)

    这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...

  2. flutter 返回指定界面_Flutter页面路由导航及传参

    转载请注明出处: https://learnandfish.com/ 概述 每个应用都有很多个页面,在flutter中同样也有很多页面,被称之为路由(Router),页面之间的跳转通过导航器(Navi ...

  3. 一篇文章说完Flutter页面路由导航及传参

    目录 前言 动态路由 静态路由 静态路由传参 Fluro 实现路由导航与传参 前言 在 Flutter 中,App 多个页面之间的跳转是由 Navigator(导航器)来管理的,如常见的 Naviga ...

  4. vue中路由传参方式之二(this.$router.push进行编程式路由跳转传参)

    this.$router.push进行编程式路由跳转传参 router中路由配置 组件home点击传参 组件homeDetails接受参数 router中路由配置 params第一种传参路由配置 {p ...

  5. IOS的OC项目下回调函数的定义以及传参

    IOS的OC项目下回调函数的定义以及传参 1.首先定义一个类方法,通过类名打点调,没有返回值的, +(void) 2. 起个函数名字 +(void)headLineWithSuccess , head ...

  6. Vue 路由组件通讯传参的 8 种方式

    当 props 是一个对象时,它将原样设置为组件 props.当 props 是静态的时候很有用. 我们在开发单页面应用时,有时需要进入某个路由后基于参数从服务器获取数据,那么我们首先要获取路由传递过 ...

  7. 路由声明式传参和编程式传参

    声明式传参(使用带href /或本质上是a标签的时候) 直接带路径里带携带参数 下例 在地址栏是可以看到参数的(querys传参) 在vue.tools插件里可以观察到 取出路径参数的方式 param ...

  8. 【愚公系列】2022年10月 微信小程序-优购电商项目-⾃定义组件传参

    文章目录 前言 一.id和data-xxx传参 二.导航传值 三.父子组件传值 前言 组件传参是小程序中非常重要的一个功能,因为小程序大多都是组件形式存在的. 一.id和data-xxx传参 view ...

  9. 尚硅谷VUE项目-前端项目问题总结07--产品详情页【vuex-排他操作foreach-放大镜-轮播图-兄弟组件通信$bus-购物车-路由跳转传参-路由传参+会话存储】-游客身份-节流

    尚硅谷VUE项目-前端项目问题总结07---产品详情页 1.静态组件(详情页还未注册为路由组件) 2.发请求 3.vuex-获取产品详情信息 3.1放大镜 3.2 属性值[排他操作] 3.3轮播图[j ...

最新文章

  1. TF (transform) in ROS
  2. ckc交易什么意思_限价委托是什么意思?有限制的委托交易
  3. 为什么用redis?
  4. 七个C#编程的小技巧
  5. 居中弹出一个层,打开一个文件。
  6. 毕业后才认清的15个道理
  7. ABP+AdminLTE+Bootstrap Table权限管理系统第八节--ABP错误机制及AbpSession相关
  8. 基于流程管理,提高工作质量和效率
  9. 通过VMName获取VM IP
  10. 菜鸟学Linux 第095篇笔记 MySQL 5.6主从复制
  11. [Python學習筆記] 使用xlwings 插入註解 (forked 版本)
  12. java中常用的缓存流程、缓存分类、缓存问题
  13. 交叉小波分析matlab,[转载]Matlab 小波分析及物理含义
  14. 13. Zigbee应用程序框架开发指南 - 多网络支持
  15. 第五十七章 Caché 函数大全 $REPLACE 函数
  16. 基于stm32单片机智能温控风扇控制系统Proteus仿真
  17. 关于硕士毕业论文的思路整理
  18. 哪些场景N1 mode是disable状态
  19. 烤仔星选·NFT实验室 | 展望2021:是否是NFT爆发元年?
  20. Android 自定义加载Dialog 运行效果流畅

热门文章

  1. TCP三次握手,握的是啥?
  2. (17万浏览量) .NET Core的介绍
  3. 大根堆的删除c语言,小根堆大根堆的动态创建与堆顶元素删除
  4. flask执行python脚本_如何在Flask中运行python脚本
  5. 华为BGP动态路由协议理论
  6. rsync error: some files/attrs were not transferred
  7. python中lambda函数对时间排序_python – 使用lambda函数排序()
  8. response.setHeader各种用法 .
  9. html让布局垂直居中,css垂直居中布局总结
  10. xp中mysql优化_XP加速技巧大盘点 看看那个最实用