记录: vue项目中使用vuex

998 阅读2分钟

如果在项目很大或者涉及到数据在多个组件中来回传递,这种情况就很适合使用vuex


安装vuex

  • vue脚手架安装vuex(推荐)
    • 创建时勾选vuex选项即可
  • 手动安装vuex
    npm install --save vuex
    //main.js同级创建store文件夹,文件夹里面创建index.js
    //main.js内部配置vuex
      import store from './store'
      new Vue({
          el: '#app',
          store, //挂载
          template: '<App></App>',
          components: { App }
      });
    

使用vuex

  • 创建文件夹

微信图片_20210531113047.png z i909

  • index.js 默认以这个文件为出口
import Vue from 'vue'
import Vuex from 'vuex'
// 引入其他模块的js文件
import state from './state'
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
Vue.use(Vuex);
// 挂载
export default new Vuex.Store({
    state,
    mutations,
    actions,
    getters,
    //modules模块可细分数据,适合数据繁琐模块多的情况
    modules: {
    }
})
  • state.js 和data差不多,默认导出一个对象
export default {
  page: 1 // 这里即是管理的数据
}
  • mutations.js 写方法更改数据(同步操作)
import * as types from './mutations-type' // 引入管理方法名的js文件
export default {
  [types.ADD_NUM](state,num) {
    console.log(num,'mutation')
    state.page  = num
  }
}
// 组件里面提交
import * as types from './mutations-type'
// commit和dispatch的区别在于commit是提交mutatious的同步操作,dispatch是分发actions的异步操作
this.$store.commit(types.ADD_NUM,num);
// 普通js文件里面提交
import store from '@/store'
store.commit('方法名', '值')
// 辅助函数提交 (单独介绍)
  • actions 写方法更改数据(异步操作)
export default {
  // 示例
  async reqUserInfo({commit}){
     // 从服务器端验证
     let result = await getUserInfo();
     if(200 === result.success_code){
        commit(USER_INFO, {userInfo: result.data});
     }
  }
}
// 组件里面调用
import * as types from './mutations-type'
// commit和dispatch的区别在于commit是提交mutatious的同步操作,dispatch是分发actions的异步操作
this.$store.dispatch(types.USER_INFO,res.data.data);
// 普通js文件里面调用
import store from '@/store'
store.dispatch('方法名', '值')// dispatch是分发actions的异步操作
// 辅助函数调用 (单独介绍)
  • getters 类似计算属性
export default {
// 示例
  getUAKey: (state) => (key) => { // 获取当前的环境(小程序,微信,APP)
    return state.userAgent[key]
  },
}
// 组件里调用
this.$store.getters.getUAKey("wx")
// js文件里调用
import store from '@/store'
const miniEnv = store.getters.getUAKey('miniProgram')
  • mutations-types.js 定义提交方法的 (精确导出)
export const ADD_GOODS = 'ADD_GOODS'; // 添加商品到购物车
export const INIT_SHOP_CART = 'INIT_SHOP_CART'; //初始化购物车
export const USER_INFO = 'USER_INFO'; // 用户信息
  • 辅助函数(可用于简化获取或者提交)
// 1. 获取state的数据
import {mapState,mapMutations} from 'vuex'
// this.page 即可访问
computed: {
   ...mapState(['page'])
},
// 2. 提交mutations
 methods: {
    ...mapMutations(['ADD_NUM']),
    add() {
      let num = this.page + 1
      this.ADD_NUM(num) //this.ADD_NUM即mutations里面的方法
    }
  }
// 3.异步数据分发actions
 methods: {
    ...mapActions(['reqUserInfo']),
  }
 mounted(){
    // 直接调用即可
    this.reqUserInfo();
},
  • modules 单独细分模块
// store文件夹index.js里面
import trace from './modules/trace'
const store = new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
  modules: {
    trace // 挂载trace文件
  },
});
  • index.js同级创建一个modules文件夹,专门存放其他模块的的js文件,trace.js就放在modules文件夹 可以在一个js里写,也可以再细分, 一个js里面写如图:

微信图片_20210531174549.png