关于vuex的使用


 

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

简单来说就是一个全局的变量管理,在项目中都是可以用到里面的变量。

 

vuex的核心

State 共享状态(存放全局变量)
Getter 从 store 中的 state 中派生出一些状态(变量),即从state中获取状态(变量)
Mutation 更改 Vuex 的 store 中的状态的唯一方法,通过提交mutation修改状态,同步操作
Action 类似于mutation,不同的是,action不能直接修改state的状态,需要通过提交mutation修改state状态,支持异步
Module   模块,为了方便状态的管理,将store拆分为多个子模块(modules),每个子模块拥有完整的state、getter、mutation、action

 

vuex的安装及使用

一、vuex的安装

npm install vuex --save     // 如果安装了淘宝镜像,可以使用 cnpm安装

二、vuex的使用

  新建store的js,引入vue和vuex

  

 

   在实例中注册store

  

 

 三、store中变量的定义、管理、派生(getter)

  1、state — 状态

  在store实例中注册state并在state中定义变量text,也可以给一个初始值;在组件中使用$store.state.text使用定义的变量

          

 

  2、mutation — 更改 store 中的状态的唯一方法

  vuex中规定只能通过提交mutation的方式去更改store中的状态,包括action中的操作,也是通过提交mutation去修改,且mutation中不能包含异步操作

    

  说明:在mutations里声明了两个方法,一个是不带参数更新text,一个是带参数更新text,在示例文件的methods里,

     通过this.$store.commit('方法名', ‘传参’) 调用,从而达到修改store的状态

 

  3、action — 异步更改状态

    action 可支持异步修改state的状态,而修改state的唯一方法是通过mutation,那么想要在action里面修改state,则需要提交一个mutation,由mutation去做修改

    

   说明:<1>、在actions里声明了两个异步方法,一个是不带参数更新text,一个是带参数更新text,在示例文件的methods里,

       通过this.$store.dispatch 调用actions的方法,在actions里执行异步操作,通过commit提交mutation,在mutation中修改store的状态

      <2>、store.dispatch 的分发传参时的两种形式(载荷形式,对象形式),载荷形式:store.dispatch('方法名', '传参');对象形式:store.dispatch({ type: ‘方法名’,key: value, [ ... ] })

 

   4、getter — store中state的派生状态

    可以理解为 store 的计算属性,  更像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,然后返回结果

     

   说明:通过 getter 拿到的是相当于计算后的值,所以通过对象的方式传值

     如果需要传值计算,那么此时相当于是调用getters里面的方法,所以 getter 的值需要是一个方法, 通过双箭头函数返回,传参在后面的箭头函数,第一个箭头函数的state是派生的state状态

 

  5、module

    使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象会变得相当臃肿

    Vuex 允许我们将 store 分割成模块(module),每个模块拥有自己的 state、mutation、action、getter

     

     

     注:由于 modules 也是一个对象,渲染数据时要带上对象的key (store.state.module1.名称)

 

  6、vuex辅助函数

    mapStatemapMutationsmapGettersmapActions

    <1>、mapState

     

 

   <2>、mapMutations

      

 

  <3>、mapGetters

      

 

  <4>、mapActions

       

 

 7、vuex 的命名空间

   默认情况下,模块内部的 action、mutation 和 getter 是注册在全局命名空间的,则不同模块有相同命名的mutations、actions时,不同模块对同一命名的 mutation 或 action 都会作出响应;

    且模块过多时,在使用辅助函数mapState、mapGetters、mapMutations、mapActions时很难查询引用的state、getters、mutations、actions来自于哪个模块,不便于后期维护

  此时我们可通过添加 namespaced: true 的方式使其成为带命名空间的模块(命名空间),当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名

         

    方法一:                        方法二:

     

   

    说明:当开启命名空间后,通过辅助函数获取 store 的值时,若未指定空间名且全局命名空间中没有该变量,将获取不到该变量参数

   

 

   

 

posted @ 2021-04-30 17:09  地yu荒冢  阅读(233)  评论(1编辑  收藏  举报