【前端100问】Q62:redux 为什么要把 reducer 设计成纯函数

写在前面

此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
为了备战 2021 春招
每天一题,督促自己
从多方面多角度总结答案,丰富知识
redux 为什么要把 reducer 设计成纯函数
简书整合地址:前端 100 问

正文回答

首先命题应当改一下,中文有歧义,可能改为 “redux 中的 reducer 为什么必须(最好)是纯函数“,我想表达的意思是,redux 没有强制你 reducer 是个纯函数,事实上,没有人能通过框架限制判断一个函数是否是纯函数,所以题目中的'设计成'这个短语貌似在说 redux 已经把 reducer 强制规定是纯函数了。这回让你怀疑你对 redux 的认知。

正文如下

然后说一下为什么 reducer 最好是纯函数,首先你得看看文档怎么说 reducer 的作用的,‘接收旧的 stateaction,返回新的 state’,您可得瞧好咯,他就是起一个对数据做简单处理后返回 state 的作用,为什么只起这个作用,这时用设计这个词回答这个问题才恰当,因为 reduxreducer 设计成只负责这个作用。

很白痴的问答对吧,所以题目的答案也就简单了,reducer 的职责不允许有副作用,副作用简单来说就是不确定性,如果 reducer 有副作用,那么返回的 state 就不确定

举个例子,你的 reducer 就做了一个 value = value + 1 这个逻辑,然后返回 state{value},ok,这个过程太 jr 纯了,然后你可能觉得要加个请求来取得 value 后再加 1,那么你的逻辑就是 value = getValue() + 1, getValue 是个请求函数,返回一个值,这种情况,退一万步讲,如果你的网络请求这次出错,那么 getValue 就返回的不是一个数值,value 就不确定了,所以 returnstate 你也不确定了,前端 UI 拿到的数据也不确定了,所以就是这个环节引入了副作用,他娘的 redux 设计好的规范就被你破坏了,redux 就没卵用了。到此为止这个问题回答完了,我没有说什么上面几个 jr 说的教科书的理论,甚至还加了些脏话。请原谅,这只是戏剧需要。

最后我回答下如何解决这个副作用,实际上也很白痴的问题,这里的请求可以放在 reducer 之前,你先请求,该做出错处理的就做出错处理,等拿到实际数据后在发送 action 来调用 reducer。这样通过前移副作用的方式,使 reducer 变得纯洁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章