博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从 源码 谈谈 redux compose
阅读量:6116 次
发布时间:2019-06-21

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

compose,英文意思 组成,构成。

  它的作用也是通过一系列的骚操作,实现任意的、多种的、不同的功能模块的组合,用来加强组件。


 

看看源码

  

 

function compose(...funcs) {  if (funcs.length === 0) {    return arg => arg  }  if (funcs.length === 1) {    return funcs[0]  }  return funcs.reduce((a, b) => (...args) => a(b(...args)))}

 

  是不是感觉很简单,关键就这一句嘛,结果也就是一层套一层的函数调用

funcs.reduce((a, b) => (...args) => a(b(...args))) 如果
  const funcs = [a, b, c, d]; 那么
  compose(...funcs)(...args) = a(b(c(d(...args))));

  其实就是func中的方法,倒着一个一个调用,前一个调用返回的结果作为后一个的参数,第一个方法的参数是...args;

 

  来来来,看看个例子:

  git代码:(如果对您有帮助,请您帮我点颗star)

import React, { Component } from 'react';import { compose, bindActionCreators } from 'redux';import {connect} from 'react-redux'import { AddStaff, ChangeStaffData, DeleteStaff, ShowStaffMsg } from '../HOC';import AddPanel from './AddPanel';// import { list } from 'postcss';import { addAction, deleteAction, changeAction, showAction } from '../../redux/company';import './index.scss';const Enhancer = compose(AddStaff, ChangeStaffData, DeleteStaff, ShowStaffMsg);class Manage extends Component {     /*    *some code    */ export default connect(state => ({    staffData: state.company.staffData,    name: state.company.name  }), dispatch => ({    dispatch,    actions: bindActionCreators({        addAction,        deleteAction,        changeAction,        showAction    }, dispatch)  }))(Enhancer(Manage));

  上边蓝色的部分可以看作是,compose(AddStaff, ChangeStaffData, DeleteStaff, ShowStaffMsg) (Manage)

  

  compose 组合了四个模块,模块相似,代码结构如下,高阶组件的反向继承:

const AddStaff = WrapperComponent => {    return class Enhancer extends WrapperComponent {                addStaff = () => {           const { name, staffId, department, work } = this.state;           const { actions: { addAction } } = this.props;           addAction({ name, staffId, department, work })           this.handleCancel();        };        render () {            return super.render();        };    };};export default AddStaff;

 高阶组件可以看作是,一个方法,返回的包装后的组件,它也只是为传入组件的props添加一个方法,然后返回。

WrapperComponent => {
  addStaff = () => {       // do something   };
  return 
};

  同样,

  compose(AddStaff, ChangeStaffData, DeleteStaff, ShowStaffMsg) (Manage) 的结果就可以是:

     compose( AddStaff (  ChangeStaddData (  DeleteStaff ( ShowStaddMsg ( Manage ) ) ) )

  ShowStaddMsg ( Manage ) 返回一个拥有ShowStaddMsg的Manage组件;

  DeleteStaff ( ShowStaddMsg ( Manage ) )返回一个拥有DeleteStaff 、ShowStaddMsg的Manage组件;

  ChangeStaddData ( DeleteStaff ( ShowStaddMsg ( Manage ) ) ) 返回一个拥有ChangeStaddData 、DeleteStaff 、ShowStaddMsg的Manage组件;

  最终返回一个拥有添加、修改、删除、展示四大功能的加强组件;

 

用途:

  这样的操作很容易实现功能的组合拼装、代码复用;可以根据需要组合不同的功能;看过中间件源码的大牛,应该都看到compose在处理中间的中的强大作用。

 

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

你可能感兴趣的文章
pid控制的文章
查看>>
MySQL中EXPLAIN命令详解
查看>>
redis 单点部署
查看>>
Java中需要编码的场景
查看>>
PHP生成word的三种方式
查看>>
设计模式(九)——桥接模式
查看>>
xen 创建本地存储
查看>>
TCP三次握手/四次挥手 | NAT介绍 |OSI与TCP/IP模型
查看>>
jQuery UI dialog 的使用
查看>>
ABP实战--集成Ladp/AD认证
查看>>
存储过程
查看>>
phpcms v9栏目列表调用每一篇文章内容方法
查看>>
python 自定义信号处理器
查看>>
我只是轻奢 40万内入门豪车最高让利7万!-搜狐汽车
查看>>
曲演杂坛--隐式转换
查看>>
远程桌面连接技巧--与主机拷贝文本及拷贝文件(转)
查看>>
MVC中下拉框显示枚举项
查看>>
Linux基础精华
查看>>
SqlServer2008第一次安装后连接问题
查看>>
cocos2d-x Schedule详解
查看>>