vuex

65 阅读2分钟

vue2安装 npm i vue@3

//在main.js中:
import vuex from 'vuex'  // 引入vuex
Vue.use(vuex)  //使用

新建store文件夹在index.vue中:

//store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  // 1. 储存公共数据(变量)的地方 => 类比vue文件中的data ()的返回值
  state: {

  },
  // 2. 是state中定义数据的计算属性 => 类比computed
  getters: {
  },
  // 3. 外界只可读取state中的属性,不可直接进行修改,但是可以通过mutations中定义的方法来修改state中的属性
  // => 类比与methods中的方法, 使用逻辑与refs来调用子组件方法一致
  mutations: {
 
  },
  // 4. 在vuex中的mutations里的方法不允许进行任何的异步操作,如果修改逻辑涉及到异步操作时,现在actions中执行完异步步骤,再让mutations进行state的值的修改
  // 翻译翻译: actions中执行异步操作,mutations中执行赋值操作
  actions: {
  },
  // 5. 模块化vuex,一个状态管理器中可能有很多类 state mutations actions getters,那么没必要在一个文件中写完所有的内容,可以分不同的模块来写相应的方法和数据,最后在modules里面统一整合
  modules: {
  }
})

在main.js中引入store

import store from './store';
new Vue({
  store,
}).$mount('#app')

总结:

(一) 全局数据状态存储的位置 state 使用方式:

  1. this.$store.state.属性名
  2. 通过组件的计算属性computed 进行导入和使用 computed: { ...mapState(['属性名']) }
  3. mapState 辅助函数能后省去 this.$store.state 这一繁琐的前缀 methods: { ...mapState('属性名') }

(二) 修改state数据的同步方法 mutations 使用方式:

  1. this.$store.commit('方法名', 需要传递的值)
  2. mapMutations 辅助函数, 在methods: { ...mapMutations(['方法名']) }

(三) 处理异步事件,并传达数据给mutations actions

  1. this.$store.dispatch('方法名', 需要传递的值)
  2. mapActions 辅助函数, 在methods: { ...mapActions(['方法名']) }

(四) state的计算属性,将不同模块中的state在此统一导出 getters

  1. this.$store.getters.计算属性名
  2. mapGetters 辅助函数, 在computed: { ...mapGetters(['计算属性名']) }

(五) 模块,将零散的数据和方法根据用途进行分类 modules 关于模块内容的写法: modules: { 模块名称: { state: {}, mutations: {}, actions: {}, getters: {} } }

  1. 获取模块中的数据 this.$store.state.模块名称.属性名

  2. 简化获取模块中数据的方式 在全局的getters中通过 属性名: state => state.模块名称.属性名 来简化获取时的写法 获取形式:this.$store.getters.属性名

  3. 在通常情况下,所有的模块中的方法都会暴露在全局中,使用最常用的请求方式 .commit .dispatch 就可以直接调用 问题: 每个模块中都可能有同一个名称的方法,这样大家都暴露在全局时会引起冲突,所以为了提高各模块的方法私有性,可以为每个模块添加一个属性 namespaced: true 让每个模块方法独立

  4. 当各模块独立时,调用方法的方式发生了变化

4.1 this.$store.commit('模块名称/方法名', 需要传递的参数)
4.2 通过mapMutations辅助函数来设置简化方法 ...mapMutations(['模块名称/方法名'])
    使用时不可以写在行内
    在js中通过 this['模块名称/方法名'](需要传递的参数)调用
4.3 通过 createNamespacedHelpers` 辅助函数, 通过它能创建某个模块中的某类辅助函数
  引入 createNamespacedHelpers` 辅助函数
  通过解构赋值的形式来引出特定模块的辅助函数 
  如: const { mapActions: userMapActions } = createNamespacedHelpers('user')
  在 methods 中使用 ...userMapActions(['模块中的方法名'])