Immutable.js详解

这次给大家带来immutable.js详解,使用immutable.js的注意事项有哪些,下面就是实战案例,一起来看一下。

Immutable.js在react + router + redux项目中的应用

先介绍一下Immutable:

Immutable.js的出现源于Functional Programming的思想,即所有数据应该是复制过来,而不是直接修改。相关介绍看它官网:
https://facebook.github.io/immutable-js/

所以如果你有一些编程经验,可以理解为Immutable就是另外一个数据结构的库。就好像从ArrayList换成LinkedList一样。在Immutable.js下,就是从JavaScript语法自有的Array(就是[])和Object({ }),换到Immutable.List和Immutable.Map了。

但是ArrayList和LinkedList毕竟都继承于List,接口上比较一致,换起来问题不大,但是想用Immutable换JavaScript原生,就要略复杂些。

var map1 = Immutable.Map({a:1, b:2, c:3});var map2 = map1.set('b', 50);map1.get('b'); // 2/* ----------------悠长悠长的分割线---------------- */var list1 = Immutable.List.of(1, 2);var list2 = list1.push(3, 4, 5);var list3 = list2.unshift(0);var list4 = list1.concat(list2, list3);

登录后复制

复杂归复杂,不过是多注意一点吧。

然后要说到redux和router

Redux有一个combineReducers方法,可以做到Reducer的拆分。比如:

combineReducers({  user: userReducer,  dashboard: dashboardReducer,})

登录后复制

那么问题来了:
当你获取state的时候,你是用state.get(‘user’)还是用state.user?

显然要用state.user。因为combineReducers不认识Immutable啊。
(不要告诉我混用,一层结构可以这样,多层呢?多人合作呢?一处蒙逼,处处报错啊)

所以如果你想在一个react + router + redux的项目下用Immutable,要么就局部使用(局部的话,基本会很nightmare吧),要么就换全套的。
然后就是看这里(这哥们把combineReducers给重新写了):
https://github.com/gajus/redux-immutable

用他们家的combineReducers,你就可以放心地用state.get(‘user’)。

在解决combineReducers的同时,他们家还顺带解决了react-router-redux的问题(试想router作为state下的routing模块却不懂用Immutable该多呵呵):

https://github.com/gajus/redux-immutable#using-with-react-router-redux

说了这么多,怎么用呢

首先你的项目是react + router + redux的标配。
然后你要引入Immutable。

那么你该这样:

引入redux-immutable

按照redux-immutable的README.md把history什么的配置好(Ctrl+C, Ctrl+V)

所有reducer合并的时候换用redux-immutable的combineReducers

所有数据出入state用Immutable.js的Immutable.List和Immutable.Map(这个才是正题)

还有什么要注意的吗?

组件的问题:

从redux过来的思想是把组件分成Smart和Dumb。Smart组件负责把数据接进来,Dumb组件负责使用数据,并只关注props。所以Immutable要覆盖Smart和Dumb吗?

我个人观点是这样的:
Dumb组件基本都是要抽象出来给多个项目共用的。这部分组件不支持Immutable应该更好些,否则就被绑死在Immutable上了。

那这么说,Dumb里的数据是JavaScript原生的,岂不是享受不到Immutable带来的好处?
数据已经复制给了组件,为了兼容性牺牲一点这个也没啥吧?

这个想法背后的结论就是:
redux概念里的Container在做state与props之间,props与dispatch之间的对接的时候,也同时做了Immutable与原生的相互转换。(Adapter Pattern吧)

测试的时候:

你会想console.log一下当前的数据吧,把Immutable.List打出来看着很累的,建议用console.log(imtb.toJS())

可是debug的时候呢?

题外话

如果这些特性是JavaScript本身内置的就好了。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

相关阅读:

怎样在Android开发中与js进行交互

JS模块化-RequireJS

一个用Vue.js 2.0+做出的石墨文档样式的富文本编辑器

node.js的path模块详解

以上就是Immutable.js详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2784735.html

(0)
上一篇 2025年3月8日 17:14:50
下一篇 2025年3月8日 17:15:00

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Vue.JS的自定义指令应该如何使用

    这次给大家带来vue.js的自定义指令应该如何使用,使用vue.js的自定义指令的注意事项有哪些,下面就是实战案例,一起来看一下。 Vue.js 允许你注册自定义指令,实质上是让你教 Vue 一些新技巧:怎样将数据的变化映射到 DOM 的行…

    编程技术 2025年3月8日
    000
  • AngularJS之HelloWorld实例

    本文主要和大家分享angularjs之helloworld实例,希望能帮助到大家。 1、.angular-cli.json {  “$schema”: “./node_modules/@angular/cli/lib/config/sche…

    编程技术 2025年3月8日
    200
  • 前端关于Node.js的面试题

    这次给大家带来前端关于node.js的面试题,面试前端关于node.js岗位有哪些需要注意的,下面就是实战题目,一起来看一下。 【相关推荐:前端面试题(2020)】 如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对N…

    编程技术 2025年3月8日
    200
  • js的Prototype属性用法详解

    每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。 prototype的定义你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它…

    2025年3月8日
    200
  • 前端js打印(导出)excel表格的方法实例

    本文主要和大家分享前端js打印(导出)excel表格的方法实例,希望能帮助到大家。 产品原型: 图片.png 功能需求:点击导出考勤表格按钮,会自动下载成Excel格式 立即学习“前端免费学习笔记(深入)”; 图片.png 图片.png j…

    2025年3月8日
    200
  • AngularJS使用webApi导出数据

    本文主要和大家分享angularjs使用webapi导出数据代码实例,希望本文的代码能帮助到大家。  /////导出功能    self.importExcel = function () {        var dataUrl = “h…

    编程技术 2025年3月8日
    200
  • vue.js、element-ui、vuex环境搭建实例分享

    本文主要和大家分享vue.js、element-ui、vuex环境搭建实例,本文主要以图文实例和代码分享,希望能帮助到大家。 一、初始化项目 vue init webpack  登录后复制 二、初始化依赖包 npm install 登录后复…

    2025年3月8日 编程技术
    200
  • 六种JS数组去重的方法分享

    方法一: 双层循环,外层循环元素,内层循环时比较值 如果有相同的值则跳过,不相同则push进数组 本文主要和大家分享六种JS数组去重的方法,希望能帮助到大家。 Array.prototype.distinct =function(){ va…

    编程技术 2025年3月8日
    200
  • JS高级程序之DOM拓展

    11.1选择符api: SelectorsAPI的核心两个方法,:querySelector()和querySlelctorAll(),在兼容的浏览器中,可以通过Domcument及Element类型的实例可以调用他们。 11.1.1 qu…

    编程技术 2025年3月8日
    200
  • js多种字符串转换数字的方式详解

    在js读取文本框或者其他表单数据的时候获得的值是字符串类型的,当我们需要用其他数据类型时就必须要使用数据类型转换了,今天我们就来讲一下js对字符串转换为数字的多种方法! 在js读取文本框或者其他表单数据的时候获得的值是字符串类型的,比如两个…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论