admin 发表于 2019-6-12 15:24:50

Vuex 的用法详解

Vuex 的用法详解

本案例测试下Vuex的使用,创建一个新的web项目
Vue init webpack web
安装vuex
npm install vuex --save
启动, npm run dev,打开localhost:8080即可


(1)引入vuex
创建一个src/store文件夹,创建index.js , 引入并导出store
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.Store({
})
export default store;

(2)引入store到main.js
import Vue from 'vue'
import App from './App'
import store from './store'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
el: '#app',
store,
components: { App },
template: '<App/>'
})



(3) 修改 helloword.vue ,先使用state获取值进行测试
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
const store = new Vuex.Store({
state: {
      count:1
}
})

helloword.vue----
<template>
<div class="hello">

    <h2>{{this.$store.state.count}}</h2>

</div>
</template>


显示结果为: 1


(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:

const store = new Vuex.Store({
state: {
      count:1
},
getters:{
      getStateCount:state=>{
          return state.count + 1;
      }
}
})

<template>
<div class="hello">

    <h2>StateValue: {{this.$store.state.count}}</h2>
   <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
</div>
</template>


显示结果:
StateValue: 1GettesVaule: 2

(5)
Mutations:数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
mutations:{
      add(state){
         state.count = state.count + 1;
      },
      reduce(state){
      state.count = state.count - 1;
    }
}
<template>
<div class="hello">
    <h1>Actions:</h1>
    <el-button type="primary" @click="addFunc()">Add</el-button>
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
    <h2>StateValue: {{this.$store.state.count}}</h2>
    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
</div>
</template>


结果:


Actions:Add ReduceStateValue: 5GettesVaule: 6








(6)Actions:
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:

mutations:{
      add(state){
         state.count = state.count + 1;
      },
      reduce(state){
      state.count = state.count - 1;
    }
},
actions:{
      addFunc(context){
          context.commit("add");
      },
      reduceFunc(context){
          context.commit("reduce");
      }
}



methods:{
    addFunc(){
      //this.$store.commit("add");
      this.$store.dispatch("addFunc");
    },
    reduceFunc(){
      //this.$store.commit("reduce");
       this.$store.dispatch("reduceFunc");
    }
}

这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
实现效果一样!!!!
















admin 发表于 2019-6-12 15:28:01

mapState、mapGetters、mapActions如果我们不喜欢这种在页面上使用“this.$stroe.state.count”和“this.$store.dispatch('funName')”这种很长的写法,那么我们可以使用mapState、mapGetters、mapActions就不会这么麻烦了;我们修改Hello World.vue文件如下:


正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。

import {mapState,mapGetters,mapMutations} from 'vuex';
export default {
name: 'HelloWorld',
data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
},
computed:{
    ...mapState({
      mapCount:state=>state.count
    })
},
methods:{
    addFunc(){
      //this.$store.commit("add");
      this.$store.dispatch("addFunc");
    },
    reduceFunc(){
      //this.$store.commit("reduce");
       this.$store.dispatch("reduceFunc");
    }
}
}




页: [1]
查看完整版本: Vuex 的用法详解