VUEX笔记

2019-08-27  本文已影响0人  艾满

状态管理

当多个组件依赖于同一个数据时,比如购物车和结账,购物车需要作为全局变量,在整个单页面中需要调用的地方调用。在angular 1.X中我们通常用$rootscope来绑定,在vue中可以用VUEX开解决这个问题。

vuex介绍

vuex是一个专门为vue.js设计的集中式状态管理架构,集中存储和管理状态。一个组件的行为--→改变数据--→影响另一个组件的视图(这里影响的实际还是同一个组件,只是这个组件作为了全局变量,可供多处调用)。而管理状态就是对状态(数据)的获取和修改。
vuex组成:state(存放的数据状态,相当于Vue中的data)、getters(对state中的状态进行过滤处理,相当于vue实例中的 computed)、mutations(直接变更状态数据,相当于vue实例中的methods)、actions(间接修改数据,非必须,提交给mutation,异步操作多用actions,,相当于vue实例中的methods)。

vuex使用

添加依赖,使用依赖,创建实例,在vue实例中添加store。

<body>
    <div id="app">
        <template>
          <button @click="add">增加</button>
          <button @click="reduce">减少</button>
          {{countNum}}
        </template>
    </div>
</body>

<script src="https://cdn.bootcss.com/vuex/2.4.1/vuex.js"></script><!--直接引入-->
Vue.use(Vuex);//在创建Vue实例之前
var myStore =  new Vuex.Store({
    state:{
        //存放组件之间共享的数据
        count:0
    },
     mutations:{
         //显式的更改state里的数据
         reduce:function(state){
            state.count--;
         }
     },
     getters:{
         //获取数据的方法
         countNum:function(state){
            return state.count<0?0:state.count;//对返回数据做过滤,减小到0时不让再减小
         }
     },
     actions:{
         //异步方式调用
         add:function(content){
            setTimeout(function(){
                content.commit('add');
             },1000)
         }
     }
});
//创建vue实例
new Vue({
    el:'#app',
    data:{

    },
    store:myStore,//在vue实例中添加store
    computed:{
        countNum:function(){//通过计算得到新的countNum数据,页面可以通过{{}}获取到
            //return this.$store.state.count;
            return this.$store.getters.countNum;//getters方式获取数据
        }
    },
    methods:{
        add:function(){//通过action方式调用
            this.$store.dispatch('add');
        },
        reduce:function(){//通过mutations直接调用
            this.$store.commit('reduce');
        }
    }
})

vuex的几点说明

1.在根组件中引入vuex,根实例中引入store,则全局组件都可以获取到store中的数据,每个组件的this上都绑定的有$store属性,可以通过调用this.$store.state来获取store中的数据。
2.vuex中store的数据不能直接用{{}}在页面上取得,可以通过在vue实例中的computed方法计算后得到一个新数据再展示在页面上。
3.不能在vue实例中改变store的值,需要在vue实例通通过调用this.$store.commit方法来促发mutations中对应的方法。
4.action不是必要的,action一般用于异步操作。
详见:vuex action 与mutations 的区别

上一篇 下一篇

猜你喜欢

热点阅读