vuex模块式开发

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。统一配置管理不仅有助于我们的协同开发,也有利于提高代码的可读性。

安装

npm install --save vuex

在src目录下新增store文件夹,然后新增modules文件夹,存放每个模块的状态管理文件,然后新增action.js,getters.js,index.js,mutation.js,types.js

每个js含义如下

  • types.js 内定义常量来表示事件类型
  • user.js 内写该 user 组件内用到的 state 、 getters 、 actions 和 mutations,并最后统一导出
  • getters.js 内写原来的 getters ,用来获取属性
  • actions.js 内写原来的 actions ,就是要执行的动作,如流程的判断、异步请求
  • index.js 是用来组装 actions.js 、 getters.js 、user.js 的,然后进行统一的导出

在store文件夹下,创建一个index.js文件;还有其他子仓库

  • state:仓库存储数据的地方
  • mutations:修改state的唯一手段
  • action:处理action,可以书写自己的业务逻辑,也可以处理异步
  • getters:理解为计算属性,用于简化仓库数据,让组件获取仓库的数据更加方便
import Vue from 'vue';
import Vuex from 'vuex';
// 需要使用插件一次
Vue.use(vuex);
// state: 仓库存储数据的地方
const state = {
  count: 1,
}
// mutations: 修改state的唯一手段
const mutations = {
  ADD(state){
    state.count++
  }
}
// action: 处理action,可以书写自己的业务逻辑,也可以处理异步
const actions = {
//  这里可以书写业务逻辑,但是不能修改state
  add({commit)}{
    commit('ADD')
  }
}
// getters:理解为计算属性,用于简化仓库数据,让组件获取仓库的数据更加方便
const getters = {}
// 对外暴露Store类的一个实例
export default new Vuex.Store{
  state,
  mutations,
  actions,
  getters
}

在main.js文件下引入、注册仓库

// 引入仓库
import store from '@/store'
// 注册仓库
new Vue({
  // 组件实例的身上会多一个$store属性
  store
}).$mount('#app')

组件获取store仓库中的数据,需要使用辅助函数mapState

<script>
import {mapSate} from 'vuex';
export default {
  name: "",
  components: {},
  computed: {
    ...mapState(['count'])
  },
  methods: {
    add() {
      // 派发action
      this.$store.dispatch('add')
    }
}
</script>

当需要管理的数据过多时,就需要在store大仓库下建许多小仓库

 

 index.js文件

import Vue from 'vue';
import Vuex from 'vuex';
// 需要使用插件一次
Vue.use(Vuex)
// 引入小仓库
import home from './home'
import search from './search'

export default new Vuex.Store({
  modules: {
    home,
    search
  }
})

home子仓库下的index.js

import {reqCategoryList} from '@/api'
// home模块的小仓库
const state = {
  //state中数据默认初始值要根据接口返回值初始化
  categoryList: [],
}
const mutations = {
  CATEGORYLIST(state, categoryList) {
    state.categoryList = categoryList;
  }
}
const actions = {
//  通过API里面的接口函数调用,像服务器发请求,获取服务器的数据
  async categoryList({commit}) {
    let result = await reqCategoryList()
    if (result.code === 200) {
      commit("CATEGORYLIST", result.data)
    }
  }
}
const getters = {}
export default {
  state,
  mutations,
  actions,
  getters
}

 在组件中使用时

<script>
import {mapState} from 'vuex';

export default {
  name: 'TypeNav',
//  组件挂载完毕:可以向服务器发请求
  mounted() {
    //  通知Vuex发请求,获取数据,存储于仓库当中
    this.$store.dispatch('categoryList')
  },
  computed: {
    ...mapState({
      //右侧需要的是一个函数,当使用这个计算属性的时候,右侧函数会立即执行一次
      //注入一个参数state,其实即为大仓库中的数据
      categoryList: state => state.home.categoryList
    })
  },
}
</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值