简单明了的vuex详解

Posted bokeyanghao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单明了的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的子模块,为了开发大型项目,方便状态管理而使用的。这里我们就不解释了,用起来和上面的一样。

以上是关于简单明了的vuex详解的主要内容,如果未能解决你的问题,请参考以下文章

vuex里mapState,mapGetters使用详解

Vuex详解

VueJS中学习使用Vuex详解

VueJS中学习使用Vuex详解

Vue.js中学习使用Vuex详解

intellij idea - Project Structure 项目结构详解(简单明了)