setState的函數參數叫啥名好
在setState:這個API設計到底怎麼樣 中介紹過,setState可以接受一個函數作為參數,這個函數接受state和props作為參數,返回的state會用來更新當前組件的狀態,問題是,這樣一個函數叫啥好呢?
最近React核心開發團隊的Adrew Clark在Twitter上發起了這樣一個投票(需要翻牆),給出的選擇是:
- updater
- update function
- reducer
- callback
如果一個函數叫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的好。
推薦閱讀: