vuex入门

1.入门使用

(1)引入vuex

$npm install vuex --save

(2)新建src/vuex文件夹,在vuex中新建store.js文件。文件中引入vue和vuex。

import Vue from 'vue';
import Vuex from 'vuex';
//通过Vue.use()进行引用
Vue.use(Vuex);

(2)初步使用
store.js添加一个常量对象,

const state = {
    count:1,
}

export出去,让外部可以引用

export default new Vuex.Store({
    state
})

新建src/components/count.vue,模板中引入store.js,并用{{$store.state.count}}输出store.js中count的值。

<template>
    <div>
        <h2>{{msg}}</h2>
        <h3>{{$store.state.count}}</h3>
        <hr>
    </div>
</template>

<script>
import store from '@/vuex/store';
export default {
    data(){
        return {
            msg:"Hello Vuex"
        }
    },
    store
}
</script>

以上,在App.vue中<router-link>到count.vue页面中,成功显示了store.js的count值。
在store.js中增加两个方法改变state中count的值。

const mutations={
    add(state){
        state.count++;
    },
    reduce(state){
        state.count--;
    }
}

在export出的增加mutations

export default new Vuex.Store({
    state,
    mutations
})

在count.vue模板中增加两个button,调用store中mutations的方法控制count值的加减。

<div>
    <button @click="$store.commit('add')">+</button>
    <button @click="$store.commit('reduce')">-</button>
</div>

以上实现了vuex的初次使用,对count值的改变。

2.state

store.js中state值赋值给模板中的展示值。

(1)通过computed的计算属性直接赋值
computed:{
        count(){
            return this.$store.state.count;
        }
    }

修改count.vue中count展示方式

<h3>{{$store.state.count}}---{{count}}</h3>
(2)通过mapState的对象赋值

引入mapState

import {mapState} from 'vuex';

在computed计算属性里为count赋值

computed:mapState({
        count:state => state.count
    })

(3)通过mapState的数组赋值
同样要引入mapState,然后在computed中做设置

computed:mapState(["count"])

3.Mutations

(1)修改状态

修改mutations中add方法,添加一个参数n。

const mutations={
    add(state,n){
        state.count += n;
    },
    reduce(state){
        state.count--;
    }
}

修改count.vue中$store.commit的传参。

<div>
     <button @click="$store.commit('add',10)">+</button>
     <button @click="$store.commit('reduce')">-</button>
</div>

浏览器中count每次增加10。

(2)修改$store.commit()成@click=""的形式

在count.vue中import入mapMutations

import {mapState, mapMutations} from 'vuex';

在count.vue中的methods属性中加入mapMutations

methods:mapMutations([
       'add','reduce' 
    ])

在模板中直接使用@click=""

<div>
      <button @click="add(10)">+</button>
      <button @click="reduce">-</button>
</div>

4.getters

数据获取之前对数据进行过滤和加工。

(1)getters基本用法

在store.js中用const声明getters属性

const getters = {
    count:function(state){
        return state.count += 100;
    }
}

并export出

export default new Vuex.Store({
    state,
    mutations,
    getters
})

count.vue中配置computed属性

computed:{
        ...mapState(["count"]),
        count(){
            return this.$store.getters.count;
        }
    },
(2)用mapGetters简化

count.vue中import引入mapGetters

import {mapState, mapMutations, mapGetters} from 'vuex';

修改computed属性,mapGetters

    computed:{
        ...mapState(["count"]),
        ...mapGetters(["count"])
    },

5.actions

在actions中提交mutation,将mutations里面处理数据的方法编程可异步处理数据的方法(通过mutation来操作)。
在store.js中声明actions

const actions = {
    addAction(context){//context:上下文,可以理解成store.js本身
        context.commit('add',10)
    },
    reduceAction({commit}){//一般简写成直接把commit对象传递过来
        commit('reduce')
    }
}

同样要export导出

export default new Vuex.Store({
    state,
    mutations,
    getters,
    actions
})

在count.vue模板中使用

methods: {
      ...mapMutations([
        'add', 'reduce'
      ]),
      ...mapActions(['addAction','reduceAction'])
    },
//增加了一组增减button
    <div>
      <button @click="addAction">+</button>
      <button @click="reduceAction">-</button>
    </div>

以上在浏览器中可以增减count的值
增加异步效果

const actions = {
    addAction(context){
        context.commit('add',10);
        setTimeout(()=>{context.commit('reduce')},3000);
        console.log('我比reduce提前执行');
    },
    reduceAction({commit}){
        commit('reduce')
    }
}

在浏览器中可以看到,点击增加button之后,count增加,之后控制台先打印出'我比reduce提前执行',然后才会减少1。

6.module

状态管理器的模块组。
如果项目比较复杂,那state是一个很大的对象,store对象也将会变得非常大,难于管理。
module可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。
在store.js中声明模块组

const moduleA = {
    state,mutations,getters,actions
}

修改export出的Vuex.Store里的值

export default new Vuex.Store({
    modules:{a:moduleA}
})

在count.vue中使用

<h3>{{$store.state.a.count}}</h3>

同样可以简化方法,在computed中设置

computed: {
      count(){
          return this.$store.state.a.count;
      }
    }
<h3>{{count}}</h3>

store.js中有多个模块组的结构

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
 }
const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
 }

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

推荐阅读更多精彩内容

  • vuex 入门随记 首先肯定是要安装vuex 这里我们使用npm包管理工具进行安装 npm install vue...
    Yhong_阅读 375评论 0 2
  • Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有...
    寒梁沐月阅读 460评论 0 0
  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,926评论 0 7
  • 1. 简述 VUEX网上有不少教程,我也看了官方和不少博客的教程,但是还是看的不爽,因为总是用全局的写法,而实际...
    点_ba7a阅读 1,366评论 0 3
  • 姓名:岳沁 学号:17101223458 转载自:http://blog.csdn.net/h5_queensty...
    丘之心阅读 2,130评论 0 1