setState的函數參數叫啥名好

關於React的setState的故事真是講不完,之前說過setState:這個API設計到底怎麼樣,也說過 setState為什麼不會同步更新組件狀態 ,還說過 setState何時同步更新狀態 ,今天可以扯一扯setState的參數名。

在setState:這個API設計到底怎麼樣 中介紹過,setState可以接受一個函數作為參數,這個函數接受state和props作為參數,返回的state會用來更新當前組件的狀態,問題是,這樣一個函數叫啥好呢?

最近React核心開發團隊的Adrew Clark在Twitter上發起了這樣一個投票(需要翻牆),給出的選擇是:

  1. updater

  2. update function
  3. reducer
  4. callback

我看到這個投票,想都沒多想,就選了reducer,但是點選之後就後悔了,可是Twitter又不提供修改投票的功能,那也沒辦法了。

如果一個函數叫reducer,或者reducing function,那應該接受兩個參數,一個是「規約」過程中的「當前結果」,另一個是下一個被規約的對象,比如,Redux中的reducer長成這樣。

function (state, action) { // 根據參數state和action計算出一個新的對象來return};

對於setState的第一個參數,函數長成這樣。

function (state, props) { // 根據參數state和props計算出一個新的對象來return}

看起來除了參數命名有點詫異,其他的完全一樣哈,我們再仔細看看。

一個函數叫reducer或者reducing function,應該就可以作為reduce函數(注意這裡少一個r,是reduce不是reducer)的參數,用來處理一個集合,這個過程就是「規約」(reduce),對於這個集合中的每一個元素,都會調用reducer,傳遞進去至少兩個參數,一個代表當前結果,另一個是正要被處理的元素,而reducer的責任就是根據這兩個參數計算出新的當前結果返回。

所以一個reducer函數差不多應該是這樣。

function(accumulatedResult, currentValue) { //根據參數accumulatedResult和currentValue計算出新的結果返回}

如果把所有的action都看做對Redux的一系列動作集合,如同歷史長河中被丟進去的一顆顆小石子,那Redux把那種函數叫reducer沒有問題,這個「規約」過程就是把所有action規約起來,產生對狀態的改變,所以reducer的第一個參數state代表的就是當前狀態,acton就是一系列動作集合中的某一個。

但是,對於React組件的setState,說它是reducer有點勉強啊,就算我們把對setState的所有調用看做一個集合,那作為reducer函數,要有一個參數代表這個集合中的一個元素吧,可是現在這個參數是props,props能代表一次對setState的調用嗎?也……勉勉強強吧,非常勉強。

如果要我再投票一次,我肯定不會選擇把setState的這個參數叫reducer。

當然,我更不會把它叫callback,因為setState的第二個參數才是callback,當狀態真正被修改完之後這個參數函數會被調用,第二個叫callback天經地義,第一個參數就不該叫callback了。

setState( (state, props) => ({count: state.count + 1}), () => { //這裡真的是callback });

所以,我想setState第一個參數還是叫updater或者update function的好。

推薦閱讀:

TAG:React | 函数式编程 | 编程 |