为了账号安全,请及时绑定邮箱和手机立即绑定

从 源码 谈谈 redux compose

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

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


 

看看源码

  https://github.com/reactjs/redux/blob/v3.7.2/src/compose.js

 

复制代码

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代码:https://github.com/wayaha/react-demos-compose

复制代码

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 =(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 <WrapperComponent {...this.props, addStaff: addStaff}/>
};

  同样,

  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在处理中间的中的强大作用。

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消