原文連接個人blog,歡迎STAR。vue
今天分享的一篇文章是關於vuex的源碼解析的,連接vuex源碼解析,在如今所作的項目裏的每一個組件,至少都有一個輔助函數,或者是....mapGetters
,或者是...mapActions
, 擴展運算符,以及解構也常常用到。這篇文章解決了困擾我許久的一個疑惑,爲何有時候輔助函數裏面傳的是一個字符串數組,而有的時候傳的是一個對象。大概之前看源碼的時候,沒怎麼仔細想過把。git
其實很簡單,vuex底層對傳入輔助函數的參數都進行了一個轉化處理,來看源碼(以mapState爲例):es6
export function mapState (states) { const res = {} normalizeMap(states).forEach(({ key, val }) => { res[key] = function mappedState () { return typeof val === 'function' ? val.call(this,this.$store.state,this.$store.getters) : this.$store.state[val] } }) return res }
mapState,對傳入的參數首先調用normalizeMap方法,來看normalizeMap的源碼:github
function normalizeMap (map) { return Array.isArray(map) ? map.map(key => ({ key, val: key })) : Object.keys(map).map(key => ({ key, val: map[key] })) }
對傳入的參數先判斷是否是數組,若是是數組調用數組的map方法,轉化爲{key, val: key} 對象的形式,若是不是數組, (那就是對象),便利對象的key 轉化爲{key, val: map[key]}對象的形式。
最後返回。vuex
今天還學到了一點,在項目裏一般須要取到表單的值, 我通常是這麼作的:數組
const { userName, password, checked } = this.form
發現原來能夠給變量一個初始值app
const { userName, password, checked = [] } = this.form
在學習es6 時,只知道可以給函數的參數給默認值,相似於下面:函數
function name (a, b = [], c = {}) { // 其餘代碼 }
完。學習