Vue中Vuex的使用方法技巧

备注:此案例是用vue脚手架创建的demo

1、首先要知道什么是Vuex?

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

2、使用Vuex时,常见的关键词

1、store:仓库容器, 包含应用中大部分的状态 (state)

2、state:数据状态

3、mutations:更改 Vuex 的 store 中状态的唯一方法是提交 mutation

4、commit: 调用 store.commit 方法,触发 mutation

5、mapState:借助mapState辅助函数获取store中保存的状态,避免当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性时代码冗余

3、组件及模块的分配

1、main.js:主模块

2、store.js:管理仓库

3、state.js:数据状态

4、mutations.js:更改 Vuex 的 store 中数据状态

5、template.vue:组件渲染

备注:为了方便以后代码的修改,我将state和mutations从store中抽离出来,单独做了模块,使用时直接在store中引用

4、Vuex的使用

(1)、安装vuex,在工作目录下执行命令:

npm install vuex --save

(2)、创建store,状态管理仓库:store.js

import  Vue  from  'vue'

import  Vuex  from  'vuex' 

Vue.use(Vuex)

import  state  from  'state.js路径'

import  mutations  from  'mutations.js路径'   

const  store  =  new  Vuex.Store({

            state,mutations

})

export  default  store

(3)、创建state.js

//定义状态管理数据

//user 记录用户的登录信息

const state = {

        user:localStorage.user?JSON.parse(localStorage.user):'',

}

export  default  state


(4)创建mutations.js

//更改 Vuex 的 store 中状态的唯一方法是提交 mutation,Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数

const  mutations  =  {

          onLogin(state){ //更改state中的user数据

                 state.user = JSON.parse(localStorage.user);

          },

}

export default mutations

(5)、在main.js中引入store

import   Vue  from  'vue'

import  App  from  './App'

import  router  from  './router'

import  store  from  'store.js路径'

Vue.config.productionTip  =  false

new Vue({

      el: '#app',

      router,

      store,

      template: '<App/>'

       components: { App }

})

(6)、在template.vue组件中使用

<template>

        <div class='app-footer'>

                 <div v-if='_user'>

                          <span>购物车</span>

                 </div>

                <button @click="onToLogin">立即登录</button>

        </div>

</template>

<script>

           import   {mapState}   from   'vuex'

           export  default{

                name:' app-footer ',

                /*

                //方法1

                computed:{//计算属性,动态获取state数据

                         user(){

                                  return    this.$store.state.user;

                         },

                },

                */

                /*

                //方法2

                //当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性,方法1会产生代码冗余,可以借助mapState辅助函数获取store中保存的状态

                computed:mapState(['user']),

                */

                /*

                //方法3

                //方法2中,当组件本身的数据名与state中的数据名重复时,这时很容易造成数据混乱,为了不破坏state中原有的数据,在使用mapState函数时可以传入一个对象,给state数据起一个别名

                computed:mapState({

                        //_user:'user',    //方法1:key-value键值对形式,key为别名,value为state里对应的数据

                       _user(state){     //方法2:函数形式,函数名为别名,参数为state,返回值为state里对应的数据名

                                return state.user;

                        }

                }),

                */

                //方法4

                //如果我们在组件中有很多自己的业务逻辑需要计算属性,我们可以用对象展开运算符

                computed:{

                        userStr(){//自己的业务逻辑

                                return JSON.stringify(this.$store.state.user);

                        },

                          ...mapState({//展开运算符,获取state数据

                                   _user(state){ 

                                           return state.user;

                                     },

                            }),

                    },

                    methods:{//登录事件,更改state的user信息

                            onToLogin(){

                                    localStorage.user = JSON.stringify({nick:'FamilyLi',user:'Hello',id:1})

                                    this.$store.commit('onLogin');//注意,这里的参数应该对应mutations里的事件属性

                             }

                    },

           }

</script>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容