Vuex

41次阅读

共计 2364 个字符,预计需要花费 6 分钟才能阅读完成。

Vuex 是什么

Vuex 是一个针对 Vue.js 开发的状态管理模式。说简单点儿就是一个工具,可以管理(修改或设置)所有组件用到的数据,而不需要借助之前的 event bus 或者 props 在组件间传值。

Vuex 使用场景

大型单页应用程序,存在多组件共享数据的时候,需要用到
Vuex 核心内容

store

(一个容器对象,存储 Vuex 中的 state,mutations,actions,getters 等)

  • state (一个保存数据的对象,对象中的数据可以供所有组件使用)

    // 1. 定义
    const state = {
    count: 0
    }

    // 2. 获取 state 中的值
    this.$store.state.count

    // mapState 辅助函数获取多个 state 的值
    import {mapState} from ‘vuex’
    computed: mapState({

    // 箭头函数可使代码更简练
    count: state => state.count,
    // 传字符串参数 'count' 等同于 `state => state.count`
    countAlias: 'count',

    })
    computed: mapState([
    // 映射 this.count 为 store.state.count
    ‘count’
    ])

    // 3. 与组件的计算属性混合使用
    computed: {
    localComputed () { // },
    // 使用对象展开运算符将此对象混入到外部对象中
    …mapState({

    // ...

    })
    }

mutations

(一个对象,保存的是更改 state 的函数,也只有它能更改 state 中的值,触发方式 this.$store.commit(‘ 函数名 ’, 参数))

// 1. 定义
const mutations = {increment (state) {state.count++}
}

// 2. 触发
this.$store.commit('increment')

// 3. 传递参数,通常参数应该是一个对象
mutations: {increment (state, n) {state.count += n}
}
this.$store.commit('increment', 10)

// 4. 在组件的方法中使用
  methods: {
    ...mapMutations(['increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`

      // `mapMutations` 也支持载荷:'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
    ]),
    ...mapMutations({add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
    })
  }

actions

(一个对象,保存的是触发 mutations 的函数,让 mutations 去修改 state 中的值)

// 1. 定义
const actions = {increment: ({ commit}) => commit('increment')
}

// 2. 触发
this.$store.dispatch('increment')

// 3. 参数支持
this.$store.dispatch('incrementAsync', {amount: 10})

// 4. 组件的方法中使用
  methods: {
    ...mapActions(['increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`

      // `mapActions` 也支持载荷:'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`
    ]),
    ...mapActions({add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')`
    })
  }

getters

(一个对象,保存的是一些类似与计算属性的函数,可以通过他们得到任何依赖于 state 的新的数据)

// 1. 定义
const getters = {evenOrOdd: state => state.count % 2 === 0 ? 'even' : 'odd'}

// 2. 使用
this.$store.getters.evenOrOdd

// 3. 使用其他 getters 作为参数
getters: {
  // ...
  doneTodosCount: (state, getters) => {return getters.doneTodos.length}
}

// 4. 组件内使用
export default {
  // ...
  computed: {
  // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}

使用 vuex

npm install vuex -S

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
const state = {}
const mutations = {}
const actions = {}
const getters = {}
export default new Vuex.Store({
  state,
  getters,
  actions,
  mutations
})

// app.js
import store from './store'

new Vue({
  el: '#app',
  store,
  render: h => h(Counter)
})


正文完
 0

Vuex

41次阅读

共计 1461 个字符,预计需要花费 4 分钟才能阅读完成。

核心概念
State
单一状态树(用一个对象就包含了全部的应用层级状态),类似于 vue 中的 data
定义
let store = new Vuex.Store({
state: {
count: 0
}
})
获取
最简单的是在计算属性中返回某个状态,这样每当 store.state 发生变化时,能重新求取计算属性,并触发更新相关联的 DOM。
computed: {
count () {
return this.$store.state.count
}
}
mapState 辅助函数 + 对象展开运算符
利用 mapState 辅助函数生成多个计算属性,利用对象展开运算符将 mapState 返回的对象和局部计算属性混合使用。若同名,可以给 mapState 传一个字符串数组。
import {mapState} from ‘vuex’

export default {
//…
computed: {
otherComputed () { // 其他局部计算属性

},
…mapState({
countNumber: ‘count’, // 等于 ‘countNumber: state => state.count’
})
}
}

Getter
可以从 state 中派生出一些状态,类似于 vue 中的计算属性
接受 state 作为第一个参数,可以接受其他 getter 作为第二个参数
const store = new Vuex.Store({
state: {
todos: [
{id: 1, done: true},
{id: 2, done: false}
]
},
getters: {
doneTodos: state => {
return state.todos.filter(todo => todo.done)
},
doneTodosCount: (state, getters) => {
return getters.doneTodos.length
}
}
})
通过属性访问
通过方法访问
mapGetters 辅助函数 + 对象展开运算符
import {mapGetters} from ‘vuex’

export default {
computed: {
…mapGetters([
‘doneTodosCount’,
‘anotherGetter’
])
}
}
Mutation
更改 state 的唯一方式,必须是同步函数
参数
Action
类似 Mutation,但 Action 提交的是 mutation,不能直接改变 state,可以包含异步操作。
注册 Action 及参数
  Action 函数接受一个 context 对象,该对象与 store 实例具有相同的方法和属性(但不是 store 实例本身),因此可以通过 context.commit 提交一个 mutation,或通过 context.state 和 context.getters 来获取 state 和 getters。可以通过 ES6 的参数解构来简化代码。
actions: {
// context 对象, obj 为载荷(其他参数)
action1 (context, obj) {
console.log(context)
context.commit(‘xxx’)
},

// 参数解构 context 对象
action2 ({commit, state, getters}, obj) {
console.log(commit, state, getters)
}
}
触发 Action
// 以载荷形式分发
this.$store.dispatch(‘updateNumber’,{
number: 10
})

// 以对象形式分发
this.$store.dispatch({
type: ‘updateNumber’,
number: 10
})
Module

正文完
 0