php Immutable,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本身内置的就好了。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

相关阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值