您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Immutable.js详解

2025/11/23 21:00:11发布17次查看
这次给大家带来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详解的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product