Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.8k views
in Technique[技术] by (71.8m points)

redux的reducer为什么要设计成不能直接修改原状态,而返回修新状态对象

网上的文章一般从两个角度回答这个问题:
第一,从源码角度,因为redux会对reducer返回的状态进行引用地址的比较,不同才更新,所以直接修改旧状态不会更新。
第二,从设计角度,如果要知道reducer返回的状态是否有变化,必须进行状态对象的深度比较,这样比较消耗性能,所以仅进行状态对象引用地址的比较,由开发者来决定是否更新,返回新状态才更新。

感觉网上的文章还是没有解释清楚redux为什么这么设计。如果reducer设计成可直接修改原状态的函数,那么也就没有必要进行新旧状态对象的比较了,因此根本不存在深度比较的问题。为什么redux不这么设计呢?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

因为reducer秉持的理念是纯函数吧,固定的输入会有固定的输出。如果直接修改原状态,那么就不会有输出了,违背了纯函数的原则。

另外,原对象作为reducer的入参,修改原对象就相当于修改了参数,这是一种副作用,同样违背了纯函数的原则。

至于为什么设计成纯函数,目的就是不改变原有状态,最终的目标是实现redux时间旅行的特性,让action变得可追踪。正如chrome插件redux-dev-tools中的交互,可以点击任意时刻的action看到那时的state是什么样的。
image.png

一个action对应一个新的状态,可以方便地将action和state对应起来。假设直接改变原有状态,将使状态变得难以追踪。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...