深入理解redux之compose的具体应用


Posted in Javascript onJanuary 12, 2020

应用

最近给自己的react项目添加redux的时候,用到了redux中的compose函数,使用compose来增强store,下面是我在项目中的一个应用:

import {createStore,applyMiddleware,compose} from 'redux';
import createSagaMiddleware from 'redux-saga';
const sagaMiddleware = createSagaMiddleware();
const middlewares = [];

let storeEnhancers = compose(
  applyMiddleware(...middlewares,sagaMiddleware),
  (window && window .devToolsExtension) ? window .devToolsExtension() : (f) => f,
);

const store = createStore(rootReducer, initialState={} ,storeEnhancers);

上面这段代码可以让store与 applyMiddleware 和 devToolsExtension 一起使用。

reduce方法

在理解compose函数之前先来认识下什么是reduce方法?
官方文档上是这么定义reduce方法的:

reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其简化为单个值。

看下函数签名:

arr.reduce(callback[, initialValue])

callback

执行数组中每个值的函数,包含四个参数:

accumulator(累加器)
累加器累加回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue。

currentValue(当前值)
数组中正在处理的元素。

currentIndex可选(当前索引)
数组中正在处理的当前元素的索引。 如果提供了initialValue,则索引号为0,否则为索引为1。

array可选(数组)
调用reduce()的数组

initialValue可选(初始值)
用作第一个调用 callback的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初 始值的空数组上调用 reduce 将报错。

下面看一个简单的例子:

数组求和

var sum = [0, 1, 2, 3].reduce(function (a, b) {
 return a + b;
}, 0);
// sum 值为 6

这个例子比较简单,下面再看个稍微复杂点的例子,计算数组中每个元素出现的次数:

var series = ['a1', 'a3', 'a1', 'a5', 'a7', 'a1', 'a3', 'a4', 'a2', 'a1'];

var result= series.reduce(function (accumulator, current) {
  if (current in accumulator) {
    accumulator[current]++;
  }
  else {
    accumulator[current] = 1;
  }
  return accumulator;
}, {});

console.log(JSON.stringify(result));
// {"a1":4,"a3":2,"a5":1,"a7":1,"a4":1,"a2":1}

这个例子很巧妙的利用了数组的reduce方法,在很多算法面试题中也经常用到。这里需要注意的是需要指定initialValue参数。

通过reduce函数还可以实现数组去重:

var a = [1, 1, 2, 3, 4, 4, 5, 6, 6, 6, 7];
Array.prototype.duplicate = function() {
  return this.reduce(function(cal, cur) {
    if(cal.indexOf(cur) === -1) {
      cal.push(cur);
    }
    return cal;
  }, [])
}

var newArr = a.duplicate();

compose函数

理解完了数组的reduce方法之后,就很容易理解compose函数了,因为实际上compose就是借助于reduce来实现的。看下官方源码:

export default 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)))
}

compose的返回值还是一个函数,调用这个函数所传递的参数将会作为compose最后一个参数的参数,从而像'洋葱圈'似的,由内向外,逐步调用。

看下面的例子:

import { compose } 'redux';

// function f
const f = (arg) => `函数f(${arg})` 

// function g
const g = (arg) => `函数g(${arg})`

// function h 最后一个函数可以接受多个参数
const h = (...arg) => `函数h(${arg.join('_')})`

console.log(compose(f,g,h)('a', 'b', 'c')) //函数f(函数g(函数h(a_b_c)))

所以最后返回的就是这样的一个函数 compose(fn1, fn2, fn3) (...args) = > fn1(fn2(fn3(...args))) 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
对联广告js flash激活
Oct 19 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
Mar 12 Javascript
javascript权威指南 学习笔记之javascript数据类型
Sep 24 Javascript
jquery实现图片灯箱明暗的遮罩效果
Nov 15 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
javascript中in运算符用法分析
Apr 28 Javascript
AngularJS的表单使用详解
Jun 17 Javascript
js实现点击获取验证码倒计时效果
Jan 28 Javascript
JavaScript中创建对象的模式汇总
Apr 19 Javascript
JS实现保留n位小数的四舍五入问题示例
Aug 03 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
jquery实现聊天机器人
Feb 08 jQuery
2019年度web前端面试题总结(主要为Vue面试题)
Jan 12 #Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
Jan 12 #Javascript
ES2020 新特性(种草)
Jan 12 #Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
Jan 12 #Javascript
es6 for循环中let和var区别详解
Jan 12 #Javascript
js 计数排序的实现示例(升级版)
Jan 12 #Javascript
JS实现动态无缝轮播
Jan 11 #Javascript
You might like
一个简易需要注册的留言版程序
2006/10/09 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
(function($){...})(jQuery)的意思
2010/07/22 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
python缩进区别分析
2014/02/15 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
如何在sublime编辑器中安装python
2020/05/20 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
Python requests上传文件实现步骤
2020/09/15 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
专家推荐信模板
2014/05/09 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
企业消防安全责任书
2014/07/23 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
初婚初育证明范本
2014/11/24 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
Python编写冷笑话生成器
2022/04/20 Python