redux与immutable实例

#1

reducer返回一个新状态的目的是为了在shouldComponentUpdate中进行判断吗?

那么使用immutable数据结构的目的就是为了节省这段代码?

另外再厚颜求一个immutable的实例

#2

immutable好处很多 但是基本上都和函数式的很多内容有关
如果暂时没需求 最直接的好处就是不用object.assign给空对象,而是直接用api返回新值。
说到这你就应该明白了,这样赋值好像很奇怪……
这就对了,redux在state上的模型就是函数式的,reducer直接修改state是副作用,而返回新值是纯函数。
用immutable的话,这个模型就正常了。拿官网的代码来说:
var map1 = Immutable.Map({a:1, b:2, c:3});
var map2 = map1.set(‘b’, 50);
map1.get(‘b’); // 2
map2.get(‘b’); // 50

reducer的initialState直接建立一个immutable map然后就可以用set赋值了。并不需要什么空对象。

#3

如果immutable 只是节省了object.assign这句代码 那应该是毫无意义的

因为assign也能解决问题是吧? (只是看起来奇怪)

您说immutable的好处有很多, 能简单说一两个让在下兴奋一下

#4

想想中学数学……每个函数都N个解对应一个参数。数学意义上的函数就是纯函数,从头进去,从尾巴出来。如果在函数内部直接修改了store,那么光看函数的api就不一定可靠了。
假如所有的数据结构都不可修改,而是返回一个新值,这样程序的可靠性就大大增加了。
为什么纠结这种数据可控?副作用就好像使用js直接调用全局数据,而不走参数,是一个坏习惯。出了bug追踪出问题的地方成本就高很多。

redux追求这种可控性的意图则更直接: reducer就是这样一个函数: (previouState, action) => nextState
这样一来state通过reducer总是在自我返回,而不是直接修改自己。就好像衔尾蛇一样。

因为严格限定函数纯度,所以每个action做了什么和会做什么总是固定的,你甚至可以把action存到一个栈里,然后逆推出以前的所有state,这也是作者演示的react dev tools的工作原理。

再提及react,一般来说操作dom只能通过副作用,然而react的组件都是纯函数,它们总是被动地直接展现store中得内容,也就是说,一旦好的组件,不受外部环境干扰,永远是可靠的,出了bug只能在外面的逻辑层。这样写好纯的virtual dom组件,交给react处理副作用,很好地分离了关注点。(爽)。

此外由于不可变数据结构总是修改引用,指向同一个数据结构树,而不是直接修改数据,可以保留任意一个历史状态,这样就可以做到react diff从而局部刷新dom,也就是react为什么这么快的原因。同理,git也是这样实现的,有兴趣可以去google一下相关文章。

3 Likes
#5

好的 ,谢谢 额, 嗯 … Google

#6

推荐下这个项目:

1 Like