【前端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 變得純潔。

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