withRouter

import {Route,Switch,withRouter} from "react-router-dom"

withRouter高阶组件增强组件——获取路由对象。
withRouter 让非路由直接匹配渲染的组件中能得在this.props中得到路由对象


@withRouter
class App extends Component {render() {console.log(this.props);******}
}
export default withRouter(App);

通过state隐式来传递数据到目标页面

声明式:

import {Route,Switch,withRouter} from "react-router-dom"
 <NavLink to={{pathname:'/home', state:{name:"detail过来的数据"}}}>点击切换到home</NavLink>

编程式

onClickHandler = ()=>{this.props.history.push({pathname:"/home",state:"detail",search:"name:userzhang"});}

嵌套路由

  • 在子路由定义的组件中,可以通过props中提供的路由对象来获取父路由定义的地址
  • 在定义嵌套路由时,父路由一定一定一定不能定义为严格模式
<div><h3>后台首页</h3><NavLink to={{pathname:"/admin/index"}}>[index]</NavLink>----<NavLink to={{pathname:"/admin/user"}}>[user]</NavLink><hr /><Switch><Route path="/admin/index" component={Index}></Route><Route path="/admin/user" component={User}></Route>\<Route component={User}></Route>{/* 子路由一个都没匹配上渲染此路由组件 */}</Switch>
</div>

在子路由定义的组件中,可以通过props中提供的路由对象来获取父路由定义的地址

 let parentRoutePath = this.props.match.path
<NavLink to={`${parentRoutePath}/index`}>后台首页</NavLink>
<Route path={`${parentRoutePath}/index`} component={Index} />

通过渲染类和通过函数渲染的区别

类:<Route path="/" component={RenderCmp} />t

1.对于规则匹配成的组件没有办法去写逻辑,会直接渲染
2.规则匹配成功后,会给组件中的props自动映射对应的路由对象
3.当前载体中的state更新,它不会重新创建

函数:<Route path="/" component={回调函数返回一个组件} />

1.可以在规则匹配成功后,进行业务逻辑的判断来决定最终是否渲染
2.规则匹配成功后,它需要你把回调函数中路由对象
3.手动的通过props传给要渲染的组件
3.当前的载体中的state如果,发生改变,则它对应匹配要渲染的组件会销毁并重新创建
建议: component属性的回调函数的方式,不要在工作中使用,可以用 render来代替

render渲染方式<Route path="/" render={route => {} />

手动的通过props传给要渲染的组件
它有component类的优点也有component回调的优点,但没有component回调中的缺点

<Route path="/admin" render={(route)=>{return <Admin {...route}/>}} />

children渲染方式

children属性中传入jsx元素,则它会根据path路径来匹配规则,如果匹配成功则渲染,不会自动注入路由对象到props中

<Route path="/home" children={<RenderCmp />} />
  • children属性为一个函数,则它的渲染不会根据路由规则来匹配渲染,它默认都会渲染出来
  • 在此函数的形参中有一个路由对象,此对象中有一个match属性,如果当前访问的地址和path路径一致,则返回为对象,否则为null
  • 函数方式: 如果你当前的页面中有一些显示的元素它在任何的地址中都要显示,且还要根据是否是激活路由,而高亮出来,就可以用它

<Routepath="/home"children={route => {// console.log('match', route.match)// return <RenderCmp {...route} />return route.match ? <RenderCmp {...route} /> : null}}
/>

登录验证

受控表单,点击后数据存储在本地缓存,跳转路由

state = {username:{value:"",onChange:e=>this.setState(state=>({username:{...state.username,value:e.target.value.trim()}}))}}onClickHandler = ()=>{localStorage.setItem("username",this.state.username.value);/* 点击后存储跳转到后台 */this.props.history.push("/admin")}

完成一次渲染时候的判断:

<Route path='/admin' render={(route)=>{if(localStorage.getItem("username")){return <Admin/>}else{return <Redirect to="/login"/>}}}
></Route>

自定义导航组件

取消顶级元素的包裹,降低dom操作的深度和标签繁杂嵌套

Fragment 它可以当作顶层元素来包裹子元素,但它不会编译成html元素
Fragment 有简写,简写时,可以不需要导入Fragment组件 <></>
import React, { Component, Fragment } from 'react'

<Fragment>
<h1>text_render</h1>
</Fragment>
===================
<>
<h1>text_render</h1>
</>


根据传给组件的props,生成对应的导航组件,组件身上传过去的值来访问请求组合成一个自定义的组件。

<div><h1>Mylink</h1><Mylink tag="h3" to="/render/home">home页面</Mylink><Mylink tag="h3" to="/render/about">about页面</Mylink><hr /><Switch><Route path="/render/home" component={Home}></Route><Route path="/render/about" component={About}></Route></Switch>
</div>

Mylink组件关键代码

onClickHandler = (to)=>(e)=>{this.props.history.push(to);
}
render() {let {tag:Tag,to,children} = this.propsreturn (<><Tag onClick={this.onClickHandler(to)}>{children}</Tag></>);
}

如果让他产生高亮的效果:
可以考虑使用children的渲染方式;

react ——withRouter——页面隐式传值—嵌套路由——渲染方式——自定义导航组件相关推荐

  1. Vue页面与页面之间的传值(router.push()编程式导航)

    页面与页面之间跳转传值,其实我们一般用两种,query传参或者用params 其实这两个方式都是页面导航的一种,编程式导航:通过调用JavaScript形式的API实现导航的方式,大家不了解的可以去官 ...

  2. vue中页面跳转传值_vue跳转方式(打开新页面)及传参操作示例

    本文实例讲述了vue跳转方式(打开新页面)及传参操作.分享给大家供大家参考,具体如下: 1. router-link跳转 // 直接写上跳转的地址 link跳转 // 添加参数 // 参数获取 id ...

  3. uni-app隐藏图标隐式唤醒第三方app scheme方式(二 隐式调用)

    1.打包设置 和之前显示调用不同的地方是执行类的intent-filter <intent-filter><action android:name="android.int ...

  4. vue 刷新嵌套路由_vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法...

    解决vue-router嵌套路由(子路由)在history模式下刷新无法渲染页面的问题,具体内容如下 一. 异常描述 本来使用的是vue-router的hash模式,但是hash模式下url需要带&q ...

  5. vue刷新页面如何保证路由不变_vue 刷新之后 嵌套路由不变 重新渲染页面的方法...

    vue 刷新之后 嵌套路由不变 重新渲染页面的方法 解决嵌套路由刷新时,路由没有变化,正常情况下页面是不会重新渲染的 1.在router-view中加上条件渲染 v-if 默认为true.让它显示出来 ...

  6. vue-router详尽:编程式导航、路由重定向、动态路由匹配、路由别名、嵌套路由、命名视图

    vue-router编程式导航 在vue项目中经常用到this.$router.push() 和 this.$router.replace() 方法进行路由跳转就是编程式导航... 通俗理解编程式导航 ...

  7. Flutter 动画全解析(动画四要素、动画组件、隐式动画组件原理等)

    本文通过拆解 Flutter 中动画的实现方式以及原理来介绍动画实现的整个过程. 1. 动画四要素 动画在各个平台的实现原理都基本相同,是在一段时间内一系列连续变化画面的帧构成的.在 Flutter ...

  8. jsp隐式对象_JSP隐式对象

    jsp隐式对象 JSP Implicit Objects are very useful for developers. This is the second post in the series o ...

  9. 面向程序员的数据挖掘指南-----第三章:隐式评价和基于物品的过滤算法

    本章会从用户的评价类型开始讨论,包括显式评价(赞一下.踩一脚.五星评价等等)和隐式评价(比如在亚马逊上购买了MP3,我们可以认为他喜欢这个产品). 内容: 显式评价 隐式评价 哪种评价方式更准确? 基 ...

最新文章

  1. 在AngularJS控制器之间共享数据
  2. VC(MFC、ATL)中 得到2个SYSTEMTIME时间差
  3. web.config中httpRunTime的属性(转)
  4. 企业应用人工智能面临的挑战
  5. 什么是 MIME Type
  6. 关于PHP数组方法array_walk的疑问
  7. HTTPS 路径配置
  8. python 属性描述符_Python属性描述符(二)
  9. 图像正确(相当于这个小项目就要结尾了)
  10. 宝塔mysql data修改_宝塔一键修改mysql数据库存放路径,更改默认数据目录…
  11. CSS3的边框(二)
  12. 【Elasticsearch】搭建Elasitc stack集群需要注意的日志问题
  13. jquery消息插件(jquery.messager.js)
  14. visual studio code快捷键整理成图片
  15. linux卡片电脑设计,ThinkPad重大更新!5款创意设计PC齐发2日
  16. python如何读取文件数据恢复_如何找回丢失的文件数据
  17. openfoam学习心得——openfoam编程进阶
  18. 存在为退还的延长失保金支付记录,需退还后才能就业登记
  19. 中国前十软件公司招聘官网聚合
  20. iOS-建设银行破解分享

热门文章

  1. MySQL可重复读应用场景_mysql-repeatable read 可重复读隔离级别-幻读实例场景
  2. 电子产品使用感受之----AirPods的一天使用体验分享
  3. 推荐一款多平台快速开发的前端UI框架 —— uView !
  4. C#QuotedStr方法实现,引号的处理
  5. C语言输出杨辉三角形
  6. I^2RNet: Intra- and Inter-Human Relation Network for Multi-Person Pose Estimation 笔记
  7. 小学计算机室管理总结,小学信息技术工作总结
  8. oracle数据库中的注释
  9. App的3种启动方式
  10. 近期找工作中,发一下我的个人简历