Vue--vuex的使用(下)

简介: Vue--vuex的使用

Module


由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter 等,参见以下代码模型

const moduleA = {
 state: { ... },
 mutations: { ... },
 actions: { ... },
 getters: { ... }
}
const moduleB = {
 state: { ... },
 mutations: { ... },
 actions: { ... }
}
const store = new Vuex.Store({
 modules: {
  a: moduleA,
  b: moduleB
}
})
store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

修改 store\index.js

import Vue from 'vue'
import Vuex from 'vuex'
// 引入 Vuex 插件
Vue.use(Vuex)
const home = {
  // 存放状态(共享属性)
  state: {
    count: 1
 },
  //派生属性
  getters: {
    desc(state) {
      if(state.count < 50) {
        return '吃饭'
     }else if(state.count < 100) {
        return '睡觉'
     }else {
        return '打豆豆'
     }
   }
 },
  // 改变 state 状态
  mutations: {
    increment(state, n) { // n 为载荷
      // state.count ++
      state.count += n
   },
    decrement(state) {
      state.count --
   }
 },
  actions: {
    add(context) {
      // 触发 mutations 中的 increment 改变 state
      context.commit('increment', 10)
   },
    decrement({commit, state}) { // 按需传值
      commit('decrement')
   }
 }
}
const store = new Vuex.Store({ // 注意V 和 S都是大写字母
  modules: {
    home // home: home
 }
})
export default store

修改 Home.vue

<template>
 <div>
   <!--修改部分-->
 count: {{ $store.state.home.count }}
  <button @click="addCount">加法</button>
  <button @click="decrement">减法</button>
 派生属性desc: {{ $store.getters.desc }}
 </div>
</template>
<script>
export default {
 methods: {
  addCount() {
   console.log(this.$store.state.home.count)
   this.$store.dispatch('add', 10)
 },
  decrement(){
   this.$store.dispatch('decrement')
 }
},
}
</script>


标准项目结构


如果所有的状态都写在一个 js 中,这个 js 必定会很臃肿,Vuex 并不限制你的代码结构。但是它建议你按以下代码

结构来构建项目结构:

├── index.html
├── main.js
├── api
│  └── ... # 抽取出API请求
├── components
│  ├── App.vue
│  └── ...
└── store
 ├── index.js     # 我们组装模块并导出 store 的地方
 ├── actions.js    # 根级别的 action
 ├── mutations.js   # 根级别的 mutation
 └── modules
   ├── cart.js    # 购物车模块
   └── products.js  # 产品模块

在 store下创建 modules 目录,该目录下创建 home.js

const state = {
      count: 1
    }
    const getters ={
      desc(state) {
        if(state.count < 50) {
          return '吃饭'
       }else if(state.count < 100) {
          return '睡觉'
       }else {
          return '打豆豆'
       }
     }
    }
const mutations = {
  increment(state, n) { // n 为载荷
    // state.count ++
    state.count += n
 },
  decrement(state) {
    state.count --
 }
}
const actions = {
  add(context) {
    // 触发 mutations 中的 increment 改变 state
    context.commit('increment', 10)
 },
  decrement({commit, state}) { // 按需传值
    commit('decrement')
 }
}
export default {
        // 存放状态(共享属性)
          state,
          //派生属性
          getters,
          // 改变 state 状态
          mutations,
          actions
}

修改 store\index.js, 导入 ./modules/home.js,删除之前的home变量

import Vue from 'vue'
import Vuex from 'vuex'
// 导入 Module
import home from './modules/home'
// 引入 Vuex 插件
Vue.use(Vuex)
const store = new Vuex.Store({ // 注意V 和 S都是大写字母
  modules: {
    home // home: home
 }
})
export default store

正常访问, 与重构前一样


相关文章
|
JavaScript API UED
vue2和Vue3的区别
vue2和Vue3的区别
94 0
|
5月前
|
JavaScript 编译器 API
vue2和vue3区别
vue2和vue3区别
98 4
|
1月前
|
缓存 JavaScript 前端开发
对比一下Vue2和Vue3?
本文首发于微信公众号“前端徐徐”,详细对比了 Vue 2 和 Vue 3 在原理、生命周期、性能、编码方式、API、Diff 算法、打包构建、TS 支持等八个方面的差异,帮助读者全面了解两者的不同之处。
173 0
对比一下Vue2和Vue3?
|
5月前
|
JavaScript 前端开发 API
vue3和vue2的区别
vue3和vue2的区别
|
5月前
|
JavaScript API 索引
说说Vue2.0和Vue3.0有什么区别
说说Vue2.0和Vue3.0有什么区别
40 3
|
6月前
|
存储 资源调度 JavaScript
vue引入vuex
vue引入vuex
57 7
|
6月前
|
JavaScript API 开发者
vue3与vue2的区别
vue3与vue2的区别
76 2
|
6月前
|
存储 JavaScript 算法
Vue2 和Vue3 有什么区别
Vue2 和Vue3 有什么区别
|
6月前
|
JavaScript API 开发者
区别Vue 2.0 和 Vue 3.0
区别Vue 2.0 和 Vue 3.0
58 1
|
6月前
|
存储 JavaScript
vue3中如何使用vuex
首先,在这里回答一个粉丝的问题,为什么有local storage 和session storage还要使用vuex,这里我解释一下,我们要明白浏览器的存储和vuex的存储的不同点,首先,浏览器存在本地,vuex存在内存里,所以vuex刷新会丢失,从现在来看,好像存在浏览器里会更好,但是,有个问题时,存在浏览器里不是响应式的啊,只有存在vuex才是响应式啊,我们通过计算属性或者watch监听下在同步更新下就行,但是,浏览器不支持响应式,所以,我们为了规避掉vuex的的刷新丢失的问题,所以,当刷新时,从浏览器的存储里拿数据,防止在vuex里面,在传给组件,借助vuex的特性,来实本地存储响应式。