寫在前面
此係列來源於開源項目:前端 100 問:能搞懂 80%的請把簡歷給我
爲了備戰 2021 春招
每天一題,督促自己
從多方面多角度總結答案,豐富知識
redux 爲什麼要把 reducer 設計成純函數
簡書整合地址:前端 100 問
正文回答
首先命題應當改一下,中文有歧義,可能改爲 “redux 中的 reducer 爲什麼必須(最好)是純函數“,我想表達的意思是,redux
沒有強制你 reducer
是個純函數,事實上,沒有人能通過框架限制判斷一個函數是否是純函數,所以題目中的'設計成'這個短語貌似在說 redux
已經把 reducer
強制規定是純函數了。這回讓你懷疑你對 redux
的認知。
正文如下
然後說一下爲什麼 reducer
最好是純函數,首先你得看看文檔怎麼說 reducer
的作用的,‘接收舊的 state
和 action
,返回新的 state
’,您可得瞧好咯,他就是起一個對數據做簡單處理後返回 state
的作用,爲什麼只起這個作用,這時用設計這個詞回答這個問題才恰當,因爲 redux
把 reducer
設計成只負責這個作用。
很白癡的問答對吧,所以題目的答案也就簡單了,reducer
的職責不允許有副作用,副作用簡單來說就是不確定性,如果 reducer
有副作用,那麼返回的 state
就不確定
舉個例子,你的 reducer
就做了一個 value = value + 1
這個邏輯,然後返回 state
爲{value}
,ok,這個過程太 jr 純了,然後你可能覺得要加個請求來取得 value 後再加 1,那麼你的邏輯就是 value = getValue() + 1
, getValue
是個請求函數,返回一個值,這種情況,退一萬步講,如果你的網絡請求這次出錯,那麼 getValue
就返回的不是一個數值,value 就不確定了,所以 return
的 state
你也不確定了,前端 UI 拿到的數據也不確定了,所以就是這個環節引入了副作用,他孃的 redux
設計好的規範就被你破壞了,redux
就沒卵用了。到此爲止這個問題回答完了,我沒有說什麼上面幾個 jr 說的教科書的理論,甚至還加了些髒話。請原諒,這只是戲劇需要。
最後我回答下如何解決這個副作用,實際上也很白癡的問題,這裏的請求可以放在 reducer
之前,你先請求,該做出錯處理的就做出錯處理,等拿到實際數據後在發送 action
來調用 reducer
。這樣通過前移副作用的方式,使 reducer
變得純潔。