предисловие
Когда компоненту необходимо получить несколько состояний, объявление вычисляемых свойств становится повторяющимся и избыточным. Мы можем использовать вспомогательную функцию mapState, чтобы генерировать вычисляемые свойства быстрее и точнее.
Поэтому мы должны четко понимать, что роль mapState заключается в том, чтобы помочь нам преобразовать значения в объекте или массиве в вычисляемое свойство. Точно так же другие вспомогательные функции аналогичны, пока вы знаете реализацию mapState, остальные в основном понятны.
Примечание. На этот раз я читаю vuex версии 2.0.0, пожалуйста, отметьте исходный код.здесь.
Подготовить
Перед интерпретацией нам необходимо ознакомиться с использованием некоторых методов:
интерпретировать
Во-первых, воспользуемся mapState:
import { mapState } from 'vuex'
export default {
computed: mapState([
// 映射 this.count 为 store.state.count
'count'
])
}
mapState возвращает объект, и мы знаем, что приведенный выше код будет выглядеть следующим образом:
import { mapState } from 'vuex'
export default {
computed: {
count () {
return this.$store.state.count
}
}
}
Итак, давайте посмотрим, что делает mapState.
Еще из API vuex откройте файл src/index.js, вы можете увидеть mapState, выставленный vuex в нижнем коде:
export default {
Store,
install,
mapState,
mapMutations,
mapGetters,
mapActions
}
После позиционирования вы можете найти передний импорт:
import { mapState, mapMutations, mapGetters, mapActions } from './helpers'
Открытьsrc/helpers.js
файл, содержащий реализацию mapState.
normalizeMap
Если вы хотите узнать, как реализуется метод mapStat, вы должны знать его внутреннюю часть.normalizeMap
реализации этого метода. Найдите и найдитеnormalizeMap
метод:
function normalizeMap (map) {
return Array.isArray(map)
? map.map(key => ({ key, val: key }))
: Object.keys(map).map(key => ({ key, val: map[key] }))
}
Этот метод в основномОтформатируйте параметр состояния, переданный mapState. Мы будем знать, что параметр состояния будет иметь две формы: одна передается как массив, а другая передается как объект.
Например следующий код:
// 以数组的方式传入
mapState([
'count',
'add'
])
// 以对象的方法传入
mapState({
count: state => state.count,
countAlias: 'count'
})
проходить черезnormalizeMap
После обработки метод станет таким:
// 以数组的方式传入
[
{
key: 'count',
val: 'count'
},
{
key: 'add',
val: 'add'
}
]
// 以对象的方法传入
[
{
key: count,
val: state => state.count
},
{
key: countAlias,
val: 'count'
}
]
mapState
понялnormalizeMap
Реализация, а затем оглянуться назадmapState
Реализация метода:
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
}
Пройдитесь по массиву, возвращаемому сразу после форматирования normalizeMap, и склеивания объекта, который соответствует вычисляемому (требуется возвращаемое значение).
Есть два суждения для val в объекте, возвращаемом normalizeMap в виде массива. Если это не функция, найти ее напрямуюthis.$store.state[val]
Состояние возврата. Если это функция, вам нужно использовать вызов, чтобы указать this функции val на экземпляр vue, затем передать состояние и геттеры и, наконец, выполнить функцию val.
функция val
Если val — это функция, это может быть немного сложно понять, например, входящие параметры могут выглядеть так:
computed: mapState({
countPlusLocalState (state) {
return state.count + this.localCount
}
})
проходить черезnormalizeMap
Объект, возвращаемый после метода:
[
{
key: 'countPlusLocalState',
val: function (state) {
return state.count + this.localCount
}
}
]
После прохождения через mapState окончательное возвращаемое значение res равно. Здесь функция val будет выполнена один раз, и будет возвращено возвращаемое значение функции.
{
countPlusLocalState: function mappedState () {
return this.$store.state.count + this.localCount
}
}
На этом интерпретация mapState закончилась. Кроме того, часто используется mapStateоператор спреда в es6, это не реализация vuex, а новая фича es6:
computed: {
localComputed () { /* ... */ },
// 使用对象展开运算符将此对象混入到外部对象中
...mapState({
// ...
})
}
Следует отметить исключение: если вы хотите использовать оператор распространения es6, вам также необходимо ввести пакет babel:babel-plugin-transform-object-rest-spread.
Суммировать
В mapState не так много кода, и основная функция заключается в преобразовании входящего массива или объекта в код, который можно распознать по вычисленным вычислительным свойствам. Что сложнее понять, так это то, что объект с возвращаемым значением функции немного сбивает с толку, поэтому прочитайте его несколько раз, чтобы понять.
Реализация кода в mapState очень лаконичная и изящная.В основном он использует некоторые встроенные функции js для обработки.Я бы на моем месте наверное постоянно писал циклы for.Ха-ха,я получил от этого много знаний. На этом интерпретация vuex подошла к концу.