zoukankan      html  css  js  c++  java
  • 简单明了的vuex详解

    vuex是什么?

      Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

      个人简单的理解就是你在state中定义了一个数据之后,你可以在所在项目中的任何一个组件里进行获取,进行修改,并且你的修改可以得到全局的响应变更。

    首先下载vuex

    npm install vuex --save

    然后在src文件目录下新建一个名为store的文件夹,为方便引入并在store文件夹里新建一个index.js,里面的内容如下:

     
    import Vue from 'vue';
    import Vuex from 'vuex';
    Vue.use(Vuex);
    const store = new Vuex.Store();
     
    export default store;
    

      

    接下来,在main.js里面引入store,然后再全局注入一下,这样一来就可以在任何一个组件里面使用this.$store了:

    import store from './store'//引入store
     
    new Vue({
      el: '#app',
      router,
      store,//使用store
      template: '<App/>',
      components: { App }
    })

    接下来,就是进入正题了,vuex有五大核心,分别是state,getter,mutation,action,module。

    我们一一说明:

    state就是一个数据仓库,存放数据的,

     回到store文件的indexjs里面,我们先声明一个state变量,并赋值一个空对象给它,里面随便定义两个初始属性值;然后再在实例化的Vuex.Store里面传入一个空对象,并把刚声明的变量state仍里面: 

     
    import Vue from 'vue';
    import Vuex from 'vuex';
    Vue.use(Vuex);
     const state={//要设置的全局访问的state对象
         showFooter: true,
         changableNum:0
         //要设置的初始属性值
       };
     const store = new Vuex.Store({
           state
        });
     
    export default store;

    现在你已经可以使用this.$store.state.showFooter和this.$store.state.changebleNum在任何一个组件里面获取showFooter和changebleNum的值。但这不是理想的过去方式,vuex官方API提供了一个getters属性,和vue计算属性computed一样,来实时监听state值的变化,并把它扔进Vuex.Store里面,具体看代码:

    import Vue from 'vue';
    import Vuex from 'vuex';
    Vue.use(Vuex);
    const state = { //要 设置的全局访问的state对象
      showFooter: true,
      changableNum: 0
      //要设置的初始属性值
    };
    const getters = { //实时 监听state值的变化(最新状态)
      isShow(state) { //方法名随意,主要 是来承载变化的showFooter的值
        return state.showFooter
        //在组件中可以用 this.$store.getters.isShow 来获取它的return值
      },
      getChangedNum() {
        // 方法名随意, 主要是用来承载变化的changableNum的值
        return state.changableNum
        //在组件中可以用 this.$store.getters.getChangedNum 来获取它的return值
      }
    }
    const store = new Vuex.Store({
      state,
      getters
    });
    export default store;

    光有定义的state的初始值,不改变它不是我们想要的需求,接下来要说的就是mutations了,mutattions也是一个对象,这个对象里面可以放改变state的初始值的方法,具体的用法就是给里面的方法传入参数state或额外的参数,然后利用vue的双向数据驱动进行值的改变,同样的定义好之后也把这个mutations扔进Vuex.Store里面,如下:

     
    import Vue from 'vue';
    import Vuex from 'vuex';
    Vue.use(Vuex);
     const state={   //要设置的全局访问的state对象
         showFooter: true,
         changableNum:0
         //要设置的初始属性值
       };
    const getters = {   //实时监听state值的变化(最新状态)
        isShow(state) {  //承载变化的showFooter的值
           return state.showFooter
        },
        getChangedNum(){  //承载变化的changebleNum的值
           return state.changableNum
        }
    };
    const mutations = {
        show(state) {   //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
            state.showFooter = true;
        },
        hide(state) {  //同上
            state.showFooter = false;
        },
        newNum(state,sum){ //同上,这里面的参数除了state之外还传了需要增加的值sum
           state.changableNum+=sum;
        }
    };
     const store = new Vuex.Store({
           state,
           getters,
           mutations
    });
    export default store;

    这时候你完全可以用this. $store.commit('show)或this. $store.commit("hide')以及this. $store. commit("newNum',6)在别的组件里面进行改变showfooter和changebleNum的值了,这不是理想的改变值的方式;因为在Vuex中,mutations里面的方法都是同步事务,意思就是说:比如这里的一个this.$store.commit( newNum' sum)方法,两个组件里用执行得到的值,每次都是一样的,这样肯定不是理想的需求。

    好在vuex官方API还提供了一个actions,这个actions也是个对象变量,最大的作用就是面的Action方法
    可以包含任意异步操作,这里面的方法是睐异步触发mutations里面的方法,actions里面自定 义的函数接
    收一个context参数和要变化的形参, context 与store实例具有相同的方法和属性,所以它可以执行
    context.commit(' "),然后也不要忘了把它也扔进Vuex.Store里面:

     
    import Vue from 'vue';
    import Vuex from 'vuex';
    Vue.use(Vuex);
     const state={   //要设置的全局访问的state对象
         showFooter: true,
         changableNum:0
         //要设置的初始属性值
       };
    const getters = {   //实时监听state值的变化(最新状态)
        isShow(state) {  //承载变化的showFooter的值
           return state.showFooter
        },
        getChangedNum(){  //承载变化的changebleNum的值
           return state.changableNum
        }
    };
    const mutations = {
        show(state) {   //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
            state.showFooter = true;
        },
        hide(state) {  //同上
            state.showFooter = false;
        },
        newNum(state,sum){ //同上,这里面的参数除了state之外还传了需要增加的值sum
           state.changableNum+=sum;
        }
    };
     const actions = {
        hideFooter(context) {  //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性
            context.commit('hide');
        },
        showFooter(context) {  //同上注释
            context.commit('show');
        },
        getNewNum(context,num){   //同上注释,num为要变化的形参
            context.commit('newNum',num)
         }
    };
      const store = new Vuex.Store({
           state,
           getters,
           mutations,
           actions
    });
    export default store;

    而在外部组件里进行全局执行actions里面方法的时候,你只需要用执行

    this.$store.dispatch('hideFooter')

    或this.$store.dispatch('showFooter')

    以及this.$store.dispatch('getNewNum',6) //6要变化的实参

    这样就可以全局改变改变showfooter或changebleNum的值了,如下面的组件中,需求是跳转组件页面后,根据当前所在的路由页面进行隐藏或显示页面底部的tabs选项卡

    <template>
      <div id="app">
        <router-view/>
        <FooterBar v-if="isShow" />
      </div>
    </template>
    
    <script>
    import FooterBar from '@/components/common/FooterBar'
    import config from './config/index'
    export default {
      name: 'App',
      components:{
        FooterBar:FooterBar
      },
      data(){
        return {
        }
      },
      computed:{
         isShow(){
           return this.$store.getters.isShow;
         }
      },
      watch:{
          $route(to,from){ //跳转组件页面后,监听路由参数中对应的当前页面以及上一个页面
              console.log(to)
            if(to.name=='book'||to.name=='my'){ // to.name来获取当前所显示的页面,从而控制该显示或隐藏footerBar组件
               this.$store.dispatch('showFooter') // 利用派发全局state.showFooter的值来控制        }else{
               this.$store.dispatch('hideFooter')
            }
          }
      }
    }
    </script>
            }else{
               this.$store.dispatch('hideFooter')
            }
          }
      }
    }
    </script>

    至此就可以做到一呼百应的全局响应状态改变了!

    总结:

    • state:存储状态(变量)
    • getters:对数据获取之前的再次编译,可以理解为state的计算属性。我们在组件中使用 $sotre.getters.fun()
    • mutations:修改状态,并且是同步的。在组件中使用$store.commit('',params)。这个和我们组件中的自定义事件类似。
    • actions:异步操作。在组件中使用是$store.dispath('')
    • modules:store的子模块,为了开发大型项目,方便状态管理而使用的。这里我们就不解释了,用起来和上面的一样。
  • 相关阅读:
    SpannaleString总结
    【未完成】bug记录2013427>import工程时出现Build path contains duplicate entry:'src' for project 'XXX'
    【未完成】给eclipse项目改名
    android创建和删除桌面快捷方式
    bug记录2013426(2)>Select at least one project错误
    hosts配置
    获取当前应用的版本号及android系统版本号及手机型号
    转载:如何将offcie 2003文档(.doc、.xls、.ppt)转换成mht文档
    转载:.NET2.0 验证控件常用的正则表达式
    转载: RESTORE DATABASE命令还原SQLServer 2005 数据库
  • 原文地址:https://www.cnblogs.com/bokeyanghao/p/11385273.html
Copyright © 2011-2022 走看看