Vuex

关于VueX

Vuex 是一个专为 Vue.js 应用程序开发的状态管理工具
大型项目使用为解决组件之间传递数据

之前处理方法:

  • 父子组件传值、平行组件在跳转时,利用url,路由里的传
  • 模式非常脆弱,通常会导致无法维护的代码

vueX的作用

  1. vuex能够保存全局数据,供整个应用使用
  2. vuex保存的数据是响应式的
  3. vuex保存的数据可以跟踪状态的变化

使用步骤

  1. 安装
npm install vuex –save
  1. 创建对象 ./src/store/index.js下
//引入vueX
import Vuex from 'vuex'

//把vueX安装到Vue里
Vue.use(Vuex)

export default new Vuex.Store({
    state:{},
    getters:{},
    mutations:{},
    actions:{}
})
  1. 将vueX.store对象植入到vue的根属性 ./src/main.js
import store from './store'

new Vue({
    el: '#app',
    store
})
  1. 组件获取数据
//模板里:
$store.state.id
//脚本里
this.$store.state.id

vueX的核心概念:

04185834_TAxe.png
state : 数据仓库 ,存储所有的 共享数据,相当于vue组件里的data 存放状态
export default new VueX.Store({
    state:{
        age:12,
        isAdult:"未成年",
        isAllowMarry:false
    }
    ......
});


<!--获取-->
{{$store.state.age}}
{{$store.state.isAdult}}
{{$store.state.isAllowMarry?"可以结婚了":"不要着急,再等等"}}




//对state对象中添加一个age成员
Vue.set(state,"age",15)

//将刚刚添加的age成员删除
Vue.delete(state,'age')
Getter : 在state的基础上派生的数据, 相当于vue组件里 computed 加工state成员给外界

Getters中的方法有两个默认参数

  • state 当前VueX对象中的状态对象
  • getters 当前getters对象,用于将getters下的其他getter拿来用
export default new VueX.Store({
    state:{
        age:12,
    },
    getters:{
        ageChina:state=>{
            let shi = parseInt(state.age/10); //1
            let ge = state.age%10;//2
            let str = "";
            switch(shi){
                case 1:str='一';break;
                case 2:str='二';break;
            }
            return str;
        }
    }
});
//获取
{{$store.getters.ageChina}}
Mutation:修改state的数据时,用mutation,这与跟踪状态 有关系 模块化状态管理

mutations方法都有默认的形参:

  • ([state] [,payload])
  • state是当前VueX对象中的state
  • payload是该方法在被调用时传递参数使用的
export default new VueX.Store({
    state:{
        age:12,
        isAdult:"未成年",
        isAllowMarry:false
    },
    // mutations:是跟踪状态。这里面只能有同步代码
    mutations:{
        incAge(state,num){
        state.age+=num;
    }
});
Action:解决mutation里只能有同步代码的问题action里可以有异步代码

Actions中的方法有两个默认参数

  • context 上下文(相当于箭头函数中的this)对象
  • payload 挂载参数
actions:{
    aEdit(context,payload){
        setTimeout(()=>{
            context.commit('incAge',payload)
        },2000)
    }
}
提交mutation(如果有异步就在action提交,如果没有异步就在组件里提交)
//组件里提交
$store.commit('incAge',num);
$store.commit('incAge',{ num:111 });
$store.commit({
    type:'incAge',
    payload:{
    age:15,
    sex:'男'
}
});


//action提交
$store.dispatch("incAge",num)
Action和mutation的区别
  • 在代码的角度上,action是来提交mutation的
  • 在用途上:区分 actions 和 mutations
  • 并不是为了解决静态问题,而是为了能用 devtools 追踪状态变化。 vuex 真正限制你的只有 mutation 必须是同步的这一点。

关于Module

如果项目大的话全局数据太多会混乱,可以分类处理,分模块

./src/store/moduleA.js

export default {
    state: {count:1}, 
    mutations: { ... }, 
    actions: { 
         incCount(context){
            console.log("moduleA的action");
            setTimeout(()=>{
                context.commit("incCount");
            },2000);
        }
    }, 
    getters: { ... } 
}
                                                   
./src/store/moduleB.js

export default {
    state: {count:2}, 
    mutations: { ... }, 
    actions: { 
         incCount(context){
            console.log("moduleB的action");
            setTimeout(()=>{
                context.commit("incCount");
            },2000);
        }
    }, 
    getters: { ... } 
}

在总的store里包含所有的模块:

import Vue from "vue";
import vueX from "vuex";
import moduleA from "./moduleA";
import moduleB from "./moduleB";

Vue.use(vueX);

export default new vueX.Store({
    modules:{
        moduleA:moduleA,
        moduleB:moduleB
    }
    //简写:
    modules:{
        moduleA,moduleB
    }
});

使用

store.state.moduleA.count // -> moduleA 的状态
store.state.moduleB.count // -> moduleB 的状态
模块(Module)里的命名空间(namespaced:true)

模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。

export default {
    namespaced:true,
    state:{
        count:1
    },
    mutations:{
    },
    actions:{        
    }
}

派发action时,加上模块名

this.$store.dispatch('moduleA/incCount');

vuex中mapState、mapMutations、mapAction的理解
https://blog.csdn.net/wangguoyu1996/article/details/80573113

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