Vuex详细教程(1)

1、使用Vue脚手架构建好项目后

1.1 安装Vuex
//  生产环境中需要使用
npm install Vuex --save   

1.2 新建一个 store 文件夹,并在文件夹下新建 store.js ,文件中引入 Vue 和 Vuex
import Vue from 'vue'
import Vuex from 'vuex'

1.3 使用 vuex,通过 vue.use 进行引用
Vue.use( Vuex )

1.4 在 main.js 中引入新建的 Vuex 文件
import  storeConfig from './vuex/store'

1.5 在实例化 Vue 对象时加入 store 对象
new Vue({
    el:'#app',
    router,
    store,    //使用store
    template:'<App/>',
    components:{ App }
})

2、 Demo 中使用 Vuex

2.1 简单 state 的使用

2.1.1 在store.js文件中增加一个常量对象
const state= {
    count : 1
}

export default封装代码抛出,让外部可以引用

export default new Vuex.store({
    state
})

2.1.2 新建一个 Vue 模板(组件),在组件中我们引入 store.js 文件,并在模板中使用 {{ $store.state.count }} 输出 count 的值
<template>
    <div>
        <p>{{ $store.state.count }}</p>
    </div>
</template>
<script>
    import store from '@/vuex/store'
    export default {
        data(){
            return { msg : "store的使用" }
        }
    }
</script>

3 store.js 中其他方法的使用

3.1 在 store.js 文件中加入两个改变 state 的方法

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

//  在 count.vue组件中加入两个按钮,并调用 mutations 中的方法
<template>
    <div>
        <button @click="$store.commit('add')"> 增加 </button>
        <button @click="$store.commit('reduce')"> 减少 </button>
    </div>
</template>

3.2 state 访问状态对象

const state , 访问状态对象,即 SPA (单页面应用程序)中的共享值

store.js 中的值,赋值给模板中的data的三种方式:

3.2.1 通过 computed 的计算属性直接赋值
//  computed属性可以在输出前,对data中的值进行改变
computed:{
    count(){
        return this.$store.state.count;
    }
}

3.2.2 通过 mapState 的对象来赋值
// 用 import 引入 mapState
import { mapState } from './vuex'

//  在  computed  计算属性里面修改值
computed:mapState( {
    //  理解为传入  state  对象,修改 state.count 属性
    count : state => state.count
} )

3.2.3 通过 mapState 的数组来赋值
computed:mapState(['count'])

3.3 mutations 修改状态 ( $store.commit() 同步修改 state 状态 )

//   vuex  提供了 commit 方法来修改状态
<button @click="$store.commit('add' , 10)"> + </button>
<button @click="$store.commit('reduce')"> - </button>

store.js

// 修改状态时传值,通过所传的值进行相应的操作,只需要再  mutations 里面再加一个参数,并再  commit  时传递进来就可以了
 const mutations={
        add( state , n ){
            state.count += n;
        },
        reduce( state ){
            state.count -= 1;
        }
    }

模板获取 Mutations 方法

实际开发中不想看到 $store.commit( ) 方法出现,步骤:

(1) 在模板 count.vue 中,用 import 引入 mapMutations

import { mapState, mapMutations }  from  'vuex';

(2) 在模板的js中添加 methods 属性,并加入 mapMutations

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

(3) 通过上述操作,可以再模板中直接使用 Mutatios 中的方法

<button @click="add"> + </button>

3.4 getters 计算过滤操作

3.4.1 getters 基本用法

若要对 store.js 文件中的count 进行一个计算属性的操作,(在他输出前,给它加100)

//  首先要在 store.js 中用 const  申明  getters  属性 
const getters = {
    count : function( state ){
        return state.count += 100
    }
}

写好 getters 后,需要在 Vuex.Store() 里面引入,由于之前已经引入 state 和 mutations ,所以这里引入需要引入三个属性 state、 mutations 、 getters

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

在 store.js 中的配置完成后,需要到模板也对 computed 进行配置

computed:{
    ...mapState(['count']),
    count(){
        return this.$store.getters.count;
    }
}

采用mapGetters 简化模板写法

//  用 import 引入mapGetters
import { mapState, mapMutations, mapGetters } from 'vues';

//  在 computed 属性中加入 mapGetters
computed: {
    ...mapState(['count']),
    ...mapGetters(['count'])
}

3.6 actions 异步修改状态(可异步修改state的状态)

3.6.1 在 store.js 中申明 actions

actions是可以调用Mutations中的方法的

const actions = {
    addCount( context ){
        context.commit( 'add', 10 )
    },
    reduceCount( {commit} ){
        commit( 'reduce', 10 )
    }
}

注意 :在 actions 中我们都用 commit 调用了 Mutations 里面的方法

参数

context: 上下文对象,可理解为 store 本身

{ commit }: 直接把 commit 对象传递过来,可以让方法体逻辑和代码更清晰

3.6.2 在模板中的使用
<template>
    <p>
      <button @click="addAction">+</button>
      <button @click="reduceAction">-</button>
    </p>
</template>

//  改造methods 方法,引入 mapActions  ,再用扩展运算符把   mapMutations  和  mapActions  加入

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

methods:{
    ...mapMutations([ 'add', 'rediuce' ]),
    ...mapActions([ 'addCount', 'reduceCount' ])
}

3.7 module 模块组

3.7.1 声明模块组
//  在 vuex/store.js 中声明模块组,需要用 const 常量的方法声明模块组
const moduleA = {
    state,mutations,getters,actions
}

//  声明好后,需要修改原来 Vuex.Store 中的值
export default new Vuex.Store({
    modules: { a: moduleA }
})

3.7.2 在模板中使用
//  模板中使用采用插值的形式填入
<h3>{{ $store.state.a.count }}</h3>

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

推荐阅读更多精彩内容

  • 姓名:岳沁 学号:17101223458 转载自:http://blog.csdn.net/h5_queensty...
    丘之心阅读 2,141评论 0 1
  • 引入vuex 1.利用npm包管理工具,进行安装 vuex。在控制命令行中输入下边的命令就可以了。 npm ins...
    令武阅读 301评论 0 0
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,015评论 4 111
  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,934评论 0 7
  • 最详细的Vuex教程 什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构。状态?我把它理解...
    北京大数据苏焕之阅读 6,154评论 0 6