~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

store的架构关系

 
 
new Vuex.store({
  state,
  mutations,
  actions,
  getters
})

main.js

import store from './store/store'

new Vue({
    store, //注入进来
    router,
    render: h => h(App),
}).$mount('#app')

state

定义

new Vuex.store({
  state:{
    count:0
  }
})

使用

const Counter = {
  template: `<div>{{ count }}</div>`,
  computed: {
    count () {
      return this.$store.state.count
    }
  }
}

放在计算属性中

getters

理解为store中的计算属性

一、state做为第一参数

getters:{
  f:(state)=>{...}

二、getter做为第二参数

getters:{
  f:(state,getter)=>{...}

三、将getter返回成函数,方便传参

getters:{
  f:(state)=>(fm)=>{
    return ....}

使用方法:

this.$store.getters.f(xx)

mutations

每个mutation可以抽象为一个事件类型(type)+回调函数(handler)

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    // 事件类型 type 为 increment
    increment (state) {
      // 变更状态
      state.count++
    }
  }
})

使用 commit触发

store.commit('increment')

一、state做为第一参数

mutations: {
  increment (state, n) {
    state.count += n
  }
}

// 调用
store.commit('increment', 10)

二、载荷做为第二参数

这个额外的参数称为 '载荷',一般为对象

mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}

提交的两种方式

// 1、把载荷和type分开提交
store.commit('increment', {
  amount: 10
})

// 2、整个对象都作为载荷传给 mutation 函数
store.commit({
  type: 'increment',
  amount: 10
})

事件名使用常量

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'

const store = new Vuex.Store({
  state: { ... },
  mutations: {
    // 使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
    [SOME_MUTATION] (state) {
      // mutate state
    }
  }
})

actions

Action 类似于 mutation,不同在于:

1、Action 提交的是 mutation,而不是直接变更状态。
2、Action 可以包含任意异步操作。

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

可以看到,Action 函数接受一个 context 参数,注意,这个参数可不一般,它与 store 实例有着相同的方法和属性,但是他们并不是同一个实例,后面学习 Modules 的时候会介绍它们为什么不一样。

 

所以在这里可以使用 context.commit 来提交一个 mutation,或者通过 context.statecontext.getters 来获取 state 和 getters。

当然,为了代码简化,我们可以使用 ES2015 的 参数解构 来直接展开,便于 commit、state 等多次调用。如下:

actions: {
  increment ({ commit }) {
    commit('increment')
  }
}

context(也即store)的属性

context.commit(ADD_COUNT)
context.dispatch(ADD_COUNT)
context.getters
context.rootGetters
context.rootState
context.state

分发action

store.dispatch('increment')

modules

模块示意图

模块里面定义的mutation和action都是注册到全局中去的。

posted on 2022-01-07 14:00  LuoTian  阅读(47)  评论(0编辑  收藏  举报