美文网首页
vuex详解

vuex详解

作者: 岚平果 | 来源:发表于2020-04-24 15:39 被阅读0次

    一、什么是vuex ?

    答: 通俗的来说,我们可以把全局需要用到的数据【例如: 数据 a】放在vuex中,同理,vuex中可以通过acitons 和mutations 来获取到全局的数据例如如【a】,把这个【a】放在state中,全局便能进一步获取。

    二、vuex 的5个核心概念

      1. State 定义状态(变量), 辅助函数mapState
      1. Getter 获取状态(变量的值),同时可以对状态进行处理, 辅助函数- mapGetters
      1. Mutation 修改状态(修改变量的值)
      1. Action 触发 mutation 函数,从而修改状态,支持异步
      1. Module 当状态很多时,把状态分开来管理

    三、安装 vuex。

    vuex也是需要安装的,并不是vue-cli 自带出来的。前提是我们已经初始了一个项目。

    // 创建一个vue项目
    vue init webpack '项目名称'  
     // 下载模块
    cnpm install                         
    // 下载vuex
    cnpm install vuex --save    
    

    四、vuex配置

    1. 在根目录下新建store 文件夹, 然后在store文件夹中再新建一个index.js. 目录路径如下图,不可更改

    image.png
    2. store文件夹中【index.js】 中这样书写
    // from 'vue'为小写,提醒我自己,经常用写成大写
    import Vue from 'vue'
    // 引入vuex
    import Vuex from 'vuex'
    Vue.use(Vuex);
    
    const store = new Vuex.Store({
        // 定义状态(变量)
        state: {
            // 收藏的商品的数量
            favoriteNum: 0
        },
        // 获取状态(变量的值),同时可以对状态进行处理, 辅助函数-  mapGetters
        getters: {
            // 收藏的商品总数
            favoriteNum(state) {
                return state.favoriteNum
            }
        },
        // Mutation 修改状态(修改变量的值)
        mutations: {
            // 收藏的商品总数
            setFavoriteNum(state, params) {
                state.favoriteNum = params;
            }
        },
        // Action 触发 mutation 函数,从而修改状态,支持异步
        actions: {
            // 得到收藏的商品数量
            // 需要传参数这样写   getFavoriteNum({ commit }, {vm, 参数名1, 参数名2, 参数名3...}) {}
            getFavoriteNum({commit}, {vm}) {
                vm.$resetAjax({
                    type: 'GET',
                    url: `/choose/goods/get_favorite_num`,
                    success: (res) => {
                        let result = JSON.parse(res).data;
                        commit('setFavoriteNum', result ? Number(result) : 0);
                    }
                })
            },
        }
    });
    // 导出store 这里需要用export default 进行导出
    export default store;
    

    3. 在main.js导入store并挂载到vue的实例上

    import Vue from 'vue'               // vue引入需要小写
    import App from './App.vue'
    import store from './store/store'   // 引入store
    
    var app = new Vue({
      el: '#app',
      store: store,                     // 把store注入到app实例里面
      render: h => h(App)
    })
    

    五、组件中引用 store

    1. 获取store中state中的商品总数【favoriteNum】,以 fixed.vue 中为例子

    <template>
       // 引用store中的favoriteNum数据
      <span>{{favoriteNum}}</span>
    </template>
    <script>
    import { mapState} from 'vuex';
    export default {
        computed: {
            //  通过辅助函数mapState可以把store中state中所有数据引进来,我们只引一个favoriteNum
            ...mapState([
                'favoriteNum'   // state中一个数据
            ]),
        },
    </script>
    

    2. 调用store中state中的获取商品总数的方法事件,以typeList.vue为例子

    <script>
    import { mapActions } from 'vuex';
    export default {
        computed: {
            //  通过辅助函数mapState可以把store中state中所有数据引进来,我们只引一个favoriteNum
            ...mapState([
                'favoriteNum'   // state中一个数据
            ]),
        },
    methods: {
       ...mapActions([
           'getFavoriteNum'
       ]),
        /**
         * 收藏、取消收藏操作
        */
       collectHandle(item,favorite) {
         this.$resetAjax({
              type: 'POST',
              url: '/choose/goods/add_favorite',
              success: (res) => {
                  let result = JSON.parse(res);
                  this.$Message.success({
                      duration: 3,
                      content: favorite === 0 ? '收藏商品成功 !' : ' 取消商品收藏成功 !'
                  });
                 // 通过this.getFavoriteNum({vm:this})来调用。
                 this.getFavoriteNum({vm: this})
              }
         })
      },
    }
    </script>
    

    相关文章

      网友评论

          本文标题:vuex详解

          本文链接:https://www.haomeiwen.com/subject/rfrfwhtx.html