Vuex模块化

254 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

前言

在之前的文章中,我们讲解了Vuex如何利用state与mutations、actions进行集中状态的管理、Vuex通过getters对state中的数据进行加工以及Vuex四个map方法的使用,本文我们将继续对Vuex的模块化操作进行讲解。

概念

Vue官网对于Vuex模块化做出了这样的定义:如果你的 store 文件太大,只需将 action、mutation 和 getter 分割到单独的文件。对于大型应用,我们会希望把 Vuex 相关代码分割到模块中。下面是项目结构示例:

 store
    ├── index.js          # 我们组装模块并导出 store 的地方
    ├── actions.js        # 根级别的 action
    ├── mutations.js      # 根级别的 mutation
    └── modules
        ├── cart.js       # 购物车模块
        └── products.js   # 产品模块

我们便依据官网给的结构来进行简单演示。

案例

案例对于实际需求进行粗略实现,所以actions以及mutation就不单独拆分出来了,只要能达到Vuex模块化需求即可。

设计

我们先来大概设计一下页面的结构,分析一下数据就是要有一个产品列表

image.png

实现

页面

1.products.vue

   <h3>这里是products</h3>
   <ul>
       <li v-for="(item,index) in productList" :key="index">
           {{item.name}}--{{item.desc}}--{{item.price}}
           <button @click="addToCart">加入购物车</button>
       </li>
   </ul>

2.cart.vue

    <h3>这里是cart</h3>
    <ul>
        <li v-for="(item,index) in cartList" :key="index">
            {{item.name}}--{{item.desc}}--{{item.price}}
        </li>
    </ul>

Vuex中准备数据及方法

这里要先说到一个东西,命名空间:namesapced:true,当模块被导入注册之后,它的所有配置项都会自动根据模块注册的路径调整命名,也就是说,我们在调用这些方法时,需要加上这个文件的路径(比如我要访问这个文件中的state里边的某个属性:this.$store.state.car。后边这个car就是多了个car.js模块名,因为如果不加模块名,那我们会访问所有模块中的属性,那就乱了),所以我们要加上命名空间,相当于独立的区块去使用,模块和模块之间互不干扰。

1.module/products.js

export default{
    namespaced: true,
    state : {
        productList: [
            { name: "苹果", desc: "红,可口", price: 6 },
            { name: "橘子", desc: "甘甜、微酸", price: 4 },
            { name: "香蕉", desc: "软、条状", price: 8 },
            { name: "西瓜", desc: "椭圆、绿", price: 20 },
            { name: "樱桃", desc: "小,圆", price: 40 }
        ]
    },
}

2.module/cart.js

export default {
    namespaced: true,
    state: {
        cartList: [
            { name: "男鞋", desc: "红,41码", price: 300 },
            { name: "男T恤", desc: "170cm", price: 200 },
        ]
    },
}

3.store下index.js

import Vue from "vue";
import Vuex from 'vuex';
import products from './modules/products'
import cart from './modules/cart'
Vue.use(Vuex)
​
const mutations={
    addToCart(state, value) {
        state.cart.cartList.push(value)
    }
}
export default new Vuex.Store({
    mutations,
    modules: {
        products,
        cart
    }
})

页面中使用

products.vue

   computed: {
/*        //方式一:直接自己读取
     productList(){
         return this.$store.state.products.productList
     }   */
     //方式二:借助mapState读取,第一个参数为store的index.js文件中暴露的modules名
     ...mapState('products',['productList']),
   },
   methods: {
       
/*        addToCart(item){
           console.log("成功加入购物车");
           //方式一:自己直接commit
           this.$store.commit('addToCart',item)
       }, */
           //方式二:借助mapMutations:此处因为直接在index.js文件中定义mutations就不用加第一个命名参数
       ...mapMutations(['addToCart']),
   },

效果

Vuex模块化加入购物车.gif

总结

以上就是Vuex模块化的内容,到这里关于Vuex的文章也告一段落。希望大家都能学到一点东西!