简单入手 vuex--状态管理


如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接下来我们就来学习一下vuex是如何修改状态值的:


安装: npm install vuex --save


引入:import Vue from 'vue'


  import Vuex from 'vuex'


  Vue.use(Vuex)   //将vuex注册给vue


安装 Vuex 之后,让我们来创建一个 store。创建过程直截了当——仅需要提供一个初始 state 对象和一些 mutation:


基础:


const store = new Vuex.Store({


  state: {


    count: 0


  },


  mutations: {


    increment (state) {


      state.count++


    }


  }})
export defert store   //导出store


new Vue({


el: '#app',


store,  //在vue实例全局引入store对象


router,


render: h => h(App)


})


 


关于 States:


vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;


 state: {


    count: 0


  },
在组建中获取值使用:  直接获得count共享数据:{{ $store.state.count }}
关于 Getter:
Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果


getters: {


// 方法名称(state参数){}


// state参数可以帮助获取到vuex声明的共享数据


getCount(state) {


// 对共享数据count再加上200


 return state.count + 200


}


},


在组建中使用getter: 获得getters的共享数据:{{ $store.getters.getCount }}


 


关于 Mutations:   切记同步


数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在文件中添加按钮,这里我们点击按钮调用add(执行加的方法)和addN(执行减法的方法),然后在里面直接提交mutations中的方法修改值


// 对共享数据进行修改操作


mutations: {


// 对count进行累加1操作


// 方法参数state是固定语法,可以用以访问共享数据


add(state) { state.count++ },


// 对count指定参数进行累加操作


addN(state, arg) { state.count += arg },


// 定义一个异步累加方法


addAsync(state) {


setTimeout(() => {


state.count++


}, 1000)


}


},


在组件中使用Mutations:    


首先注册事件:


<button @click="addOpt">count累加操作(无参)</button> 


<button @click="addOptN(5)">count累加操作(参数)</button> 


<button @click="addOptAsync">count异步累加操作</button> 


export default {


methods: {


// 对共享数据修改的方法


addOpt(){


// 要调用vuex mutations的add方法


// 语法:this.$store.commit(mutations的方法)


this.$store.commit('add')


},


addOptN(n){


// 要调用vuex mutations的add方法


// 语法:this.$store.commit(mutations的方法, 参数)


this.$store.commit('addN', n)


}


}


}


关于 Actions:  切记异步


虽然页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不建议我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,先定义actions提交mutation的函数


actions: {


// 对数据进行"异步"修改


// 方法(参数){}


// context是固定参数,可以用于调用mutations的方法


addAsync(context) {


// 异步设置


setTimeout(() => {


// 调用mutations中的操作方法


context.commit('add')


}, 1000)


},


// 根据参数进行异步修改


addAsyncN(context, n) {


setTimeout(() => {


context.commit('addN', n)


}, 1000)


}


},


在组件中使用:调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。


Action 通过 store.dispatch 方法触发:


addOptAsync(){


// this.$store.commit('addAsync')


// 调用actions的成员方法,实现数据异步修改操作


this.$store.dispatch('addAsync')


},


关于 mapState、mapGettersmapMutationsmapActions’优化vuex


首先


// 做按需导入


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


在组件中使用:


<p>直接获得count共享数据:{{ $store.state.count }}</p>


<p>mapState方式获得count共享数据:{{ count }}--{{ count1 }}</p>


<p>mapGetters方式获得共享数据:{{ getCount }}</p>


操作组件中的数据:


<p><button @click="add">通过mapMutations进行数据修改(无参)</button></p>


<p><button @click="addN(10)">通过mapMutations进行数据修改(有参)</button></p>


<p><button @click="addAsync">mapActions异步修改(无参)</button></p>


<p><button @click="addAsyncN(7)">mapActions异步修改(有参)</button></p>




methods:{


// 展开操作


...mapMutations(['add','addN']),


// 展开效果类似如下


  add(){


   this.$store.state.count++


},


  addN(arg){


this.$store.state.count+=arg


 },


...mapActions(['addAsync','addAsyncN'])


},


计算属性


computed:{


// 展开运算符使用,


// 作用是 把mapState函数的返回值做展开运算


...mapState(['count','count1']),


// mapState函数的返回值为:


// {count:function(){return xxx},count1:function(){return xxx}}


// 展开结果为如下:


// count:function(){


// return this.$store.state.count


// }


// count1:function(){


// return this.$store.state.count1


// }


...mapGetters(['getCount'])


}












 


 






 










 


 


 






原文地址:https://www.cnblogs.com/zhulinxianxain/p/10757326.html