博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识react高阶组件
阅读量:6171 次
发布时间:2019-06-21

本文共 3868 字,大约阅读时间需要 12 分钟。

前言

最近一直再做数据可视化,业务的理解,数据的理解确实如数据可视化要求的一样,有了更多的理解。但是技术上还停留在echart,Hchart, 画图上。正好一个机会,看了。对大数据有了更深的了解。也明确了大数据时代,前端所应该具备的职业素养

高阶组件

高阶组件HOC(Higher Order Component,高阶组件)就是一个 React 组件包裹着另外一个 React 组件

React 中两种 HOC 的实现方法

React 中两种 HOC 的实现方法:Props Proxy (PP) and Inheritance Inversion (II)

## Props Proxy (PP)

function ppHOC(WrappedComponent) { return class PP extends React.Component {   render() {     return 
} }}

## Inheritance Inversion (II)

function iiHOC(WrappedComponent) { return class Enhancer extends WrappedComponent {   render() {     return super.render()   } }}
返回的 HOC 类(Enhancer)继承了 WrappedComponent。之所以被称为 Inheritance Inversion 是因为 WrappedComponent 被 Enhancer 继承了,而不是 WrappedComponent 继承了 Enhancer。在这种方式中,它们的关系看上去被反转(inverse)了。

Inheritance Inversion 允许 HOC 通过 this 访问到 WrappedComponent,意味着它可以访问到 state、props、组件生命周期方法和 render 方法

一致化处理(Reconciliation process)

一致化处理(Reconciliation)包括的就是React元素的比较以及对应的React元素不同时对DOM的更新,即可理解为React 内部将虚拟 DOM 同步更新到真实 DOM 的过程,包括新旧虚拟 DOM 的比较及计算最小 DOM 操作。

这很重要,意味着 Inheritance Inversion 的高阶组件不一定会解析完整子树

Inheritance Inversion 作用

  • 渲染劫持(Render Highjacking)
  • 操作 state

渲染劫持(Render Highjacking)

  • 在由 render输出的任何 React 元素中读取、添加、编辑、删除 props
export function IIHOCDEBUGGER(WrappedComponent) {  return class II extends WrappedComponent {    render() {      return (        

HOC Debugger Component

Props

{JSON.stringify(this.props, null, 2)}

State

{JSON.stringify(this.state, null, 2)}
{super.render()}
) } }}
  • 读取和修改由 render 输出的 React 元素树
function iiHOC(WrappedComponent) {  return class Enhancer extends WrappedComponent {    render() {      const elementsTree = super.render()      let newProps = {};      if (elementsTree && elementsTree.type === 'input') {        newProps = {value: 'may the force be with you'}      }      const props = Object.assign({}, elementsTree.props, newProps)      const newElementsTree = React.cloneElement(elementsTree, props, elementsTree.props.children)      return newElementsTree    }  }}
  • 有条件地渲染元素树
function iiHOC(WrappedComponent) {  return class Enhancer extends WrappedComponent {    render() {      if (this.props.loggedIn) {        return super.render()      } else {        return null      }    }  }}
  • 把样式包裹进元素树(就像在 Props Proxy 中的那样)

高阶组件例子

// app.jsimport React, {Component} from 'react';import logo from './logo.svg';import './App.css';import Auth from './auth';// 发帖组件class Btn extends Component {    send() {        alert('发帖子');    }    render() {        return (                    )    }}// 喜欢组件class BtnLike extends Component {    send() {        alert('喜欢');    }    render() {        return (                    )    }}class App extends Component {    render() {        // 高阶组件Auth()        let AuthBtn = Auth(Btn),            AuthBtnLike = Auth(BtnLike);        return (            
logo

Welcome to React

To get started1, edit src/App.js and save to reload.

); }}export default App;
// 高阶组件 Auth.js/** * Created by Rayr Lee on 2017/11/19. */import React from 'react';var isLogin = false;// 控制能否登录 window.isLogin = isLogin;// Props Proxy (PP) 的最简实现:// function ppHOC(WrappedComponent) {  //     return class PP extends React.Component {    //       render() {      //         return 
// } // } // }export default function (ComposedComponent) { return class extends React.Component { tips() { alert('请登录'); } render() { return ( isLogin ?
: ) } }}

参考

  • [为什么React和Immutable是好朋友](

)

转载地址:http://mhtba.baihongyu.com/

你可能感兴趣的文章
ZAM 3D入门教程(4):Extrusion编辑器
查看>>
《深入实践Spring Boot》一第2章 在Spring Boot中使用数据库2.1 使用MySQL
查看>>
C++语言基础 例程 字符串类
查看>>
堆排序
查看>>
Java的热部署(后期完善)
查看>>
css总结
查看>>
Python学习笔记之六:在VS中调用Python
查看>>
node.js获取参数的常用方法
查看>>
jquery 的 change() 方法的使用
查看>>
本地计算机上的XXX服务启动后又停止了
查看>>
<s:iterator>标签迭代数据不显示
查看>>
判断 SQLServer 触发器类型,支持多行
查看>>
SQL表连接查询(inner join、full join、left join、right join)
查看>>
阿里云OTS(开放结构化数据服务)可视化管理工具的设计和功能介绍
查看>>
Github创建分支
查看>>
转换PHP脚本成为windows的执行程序
查看>>
Python组织文件 实践:将带有美国风格日期的文件改名为欧洲风格日期
查看>>
FATAL ERROR: Could not find ./bin/my_print_defaults 解决方法
查看>>
Spring - @ControllerAdvice + @ExceptionHandler全局处理Controller层异常(转)
查看>>
JAVA中的内部类(一)
查看>>