当前位置: 首页 > news >正文

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

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>

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

类:<Route path="/" component={RenderCmp} />t
1.对于规则匹配成的组件没有办法去写逻辑,会直接渲染
2.规则匹配成功后,会给组件中的props自动映射对应的路由对象
3.当前载体中的state更新,它不会重新创建
函数:<Route path="/" component={回调函数返回一个组件} />
1.可以在规则匹配成功后,进行业务逻辑的判断来决定最终是否渲染
2.规则匹配成功后,它需要你把回调函数中路由对象,手动的通过props传给要渲染的组件
3.当前的载体中的state如果,发生改变,则它对应匹配要渲染的组件会销毁并重新创建
建议: component属性的回调函数的方式,不要在工作中使用,可以用 render来代替
render渲染方式<Route path="/" render={route => {} />
它有component类的优点也有component回调的优点,但没有component回调中的缺点
4、children渲染方式

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

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

<Route
  path="/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.props
   return (
      <>
      <Tag onClick={this.onClickHandler(to)}>{children}</Tag>
      </>

   );
}

相关文章:

  • MATLAB基础应用精讲-【论文写作篇】数学建模论文写作要点
  • R语言使用expand.grid函数生成多个变量的笛卡尔积组合、多个变量的所有水平(level)的组合
  • [架构之路-3]:架构师 - 软件架构师也是魔法师,架构师应具备的四大方面的技能
  • Java Boolean类中valueOf(String s)方法具有什么功能呢?
  • 一幅长文细学MongoDB(一)——MongoDB相关概念
  • 接口开发 — — RPC远程过程调用实现
  • JAMA子刊:孕妈妈每天喝半杯咖啡,可能让胎儿发育迟缓
  • Acrylamide-PEG-acid,ACA-PEG-COOH,丙稀酰胺-聚乙二醇-羧基可用于修饰多肽
  • 搭建个人的GPS定位系统
  • TorchProtein教程--蛋白质数据结构(2)
  • 动力学(dynamics)与动理学(kinetics)概念辨析
  • Vue | Object.defineProperty()、数据代理、计算属性、监视属性
  • 常见的排序总结
  • kvm存储池
  • T1055 判断闰年 (信息学一本通C++)
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【391天】每日项目总结系列128(2018.03.03)
  • Android框架之Volley
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 基础知识 - 入门篇(一)
  • JS基础之数据类型、对象、原型、原型链、继承
  • MySQL主从复制读写分离及奇怪的问题
  • PHP面试之三:MySQL数据库
  • React的组件模式
  • 电商搜索引擎的架构设计和性能优化
  • 构建二叉树进行数值数组的去重及优化
  • 记录一下第一次使用npm
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 算法---两个栈实现一个队列
  • 微信支付JSAPI,实测!终极方案
  • 项目管理碎碎念系列之一:干系人管理
  • PostgreSQL之连接数修改
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 正则表达式-基础知识Review
  • ​第20课 在Android Native开发中加入新的C++类
  • #162 (Div. 2)
  • (5)STL算法之复制
  • (ibm)Java 语言的 XPath API
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (九)信息融合方式简介
  • (六)激光线扫描-三维重建
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (算法二)滑动窗口
  • (转)h264中avc和flv数据的解析
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .jks文件(JAVA KeyStore)
  • .Net IOC框架入门之一 Unity
  • .net6使用Sejil可视化日志