小白带你学习Vuex
栏目: JavaScript · 发布时间: 7年前
内容简介:在做一些Vue项目时,如果遇到嵌套多层的组件间的数据同步和通信将会非常麻烦,另外如果一些数据交互是分散在各个组件的,很可能会重复获取数据,或者接口数据的返回有更改时,不能及时的定位,所以如果能在全局对数据进行统一的状态管理将会非常方便。 Vuex是Vue官方推荐的状态管理利器。Vuex的官方文档(创建全局唯一的存储对象,命名随意,一般使用store,声明state对象,设置count为0;在mutations中使用add方法和minus方法更改count的值,mutation的参数一般是state对象和传
在做一些Vue项目时,如果遇到嵌套多层的组件间的数据同步和通信将会非常麻烦,另外如果一些数据交互是分散在各个组件的,很可能会重复获取数据,或者接口数据的返回有更改时,不能及时的定位,所以如果能在全局对数据进行统一的状态管理将会非常方便。 Vuex是Vue官方推荐的状态管理利器。
基础知识
Vuex的官方文档( https://vuex.vuejs.org/zh/ )中有相应的阐述,以下是我的理解和整理。
- state“状态”,整个应用只有一个state,为了确保对全局状态的管理,可以想象成一个大的“json对象”,也可以分为各个模块。
- getter获取状态,进行数据请求
- mutation修改状态的操作,同步
- action提交mutation,异步简单来说,如果我们的state对象中有一个变量a的值为0;我们希望把a改为1,则需要进行的操作是先定义一个mutation将a置为1,然后用action去提交这个mutation,从而去修改state中的a。
开始实践
1.安装
npm i -g vue-cli // 安装vue-cli vue init webpack 项目名 // 初始化一个集成webpack的vue项目 npm i vuex // 项目根目录下安装vuex
2.引入并使用Vuex,以及创建存储对象
import Vuex from 'vuex' Vue.use(Vuex)
创建全局唯一的存储对象,命名随意,一般使用store,声明state对象,设置count为0;在mutations中使用add方法和minus方法更改count的值,mutation的参数一般是state对象和传入的参数;在actions中也有add和minus方法(actions中的函数的命名可以跟mutations中的一样)用于mutation的提交,参数一般是store对象和传入的参数。
const store = new Vuex.Store({
strict: true, // 严格模式——只能由mutation修改状态
state: {
count: 0
},
mutations: {
add (state, arg) {
arg = arg || 1
state.count += arg
},
minus (state, arg) {
arg = arg || 1
state.count -= arg
}
},
actions: {
add ({commit}, arg) {
commit('add', arg)
},
minus ({commit}, arg) {
commit('minus', arg)
}
},
getters: {
}
})
最后需要把store对象挂载到Vue对象上。
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})
3.在组件中使用store对象
前面我们已经准备好store对象,现在在组件中开始使用。我们写一个简单的父组件来显示count的值。
<template lang="html">
<span>{{state.count}}</span>
</template>
<script>
export default {
data () {
return {
state: this.$store.state
}
}
}
</script>
然后我们在下面的子组件中改变count的值,Add方法中调用前面store中的action中的方法,用于提交更改,这样我们就简单实现了在一个组件中更改数据,在另一个组件中显示数据,其中的传参是为了在没有传值的时候加1和减1,在有参数的时候根据传参进行加减,这样就简单的使用了Vuex。
<template lang="html">
<li>
<input type="button" value="加1" @click="Add">
<input type="button" value="减1" @click="Minus">
</li>
</template>
<script>
export default {
data () {
return {
}
},
methods: {
Add () {
this.$store.dispatch('add',3)
},
Minus () {
this.$store.dispatch('minus',3)
}
}
}
</script>
那怎么把数据交互和Vuex配合起来呢? 我们来写一个demo实现从接口返回数据并显示在页面上。 写一个node server来模拟返回数据
const koa1=require('koa');
const router1=require('koa-router');
let server=new koa();
server.listen(8084);
server.use(async (ctx, next)=>{
ctx.set('Access-Control-Allow-Origin', '*');
await next();
});
let r1=router();
r1.get('/a', async ctx=>{
ctx.body=[1,2,3,4,5,6];
});
server.use(r.routes());
在state中声明一个数组
state: {
arr: []
}
在mutations中声明一个setArr方法用于更改arr的值
mutations: {
setArr(state,arg){
state.arr = arg;
}
}
在actions中访问接口获取值
actions: {
async getArr({commit},arg){
let arr = await (await fetch('http://localhost:8084/server')).json();
commit('setArr',arr);
}
}
在getters中触发action(如果state中的arr不为空,则不会去请求数据)
getters: {
arr(state){
if(state.arr.length == 0){
store.dispatch('getArr');
}
return state.arr;
}
}
在组件中显示接口返回的值
<template>
<ul><li v-for="i in arr">{{i}}</li></ul>
</template>
<script>
export default {
data () {
return {
}
},
computed: {
arr () {
return this.$store.getters.arr
}
},
}
</script>
这样就实现了vuex和数据交互的简单配合,可以在这个demo的基础上加以更改也可以跟上面的加以结合,实现前端触发更改传给后端的过程。
总结,Vuex的核心是store对象,我们在使用的时候需要先创建一个store对象(它是Vuex.Store对象的一个实例),然后在注册到Vue身上,就可以在组件里面使用了,在组件中的使用过程是,执行this.$store.dispatch方法,这个方法的作用是,找到对应的action,store对象中对应的action中会有一个commit方法去触发对应的mutation,只有mutation可以更改state对象的值,getters对象和actions对象配合使用可以进行数据交互。
以上所述就是小编给大家介绍的《小白带你学习Vuex》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 一文读懂监督学习、无监督学习、半监督学习、强化学习这四种深度学习方式
- 学习:人工智能-机器学习-深度学习概念的区别
- 统计学习,机器学习与深度学习概念的关联与区别
- 混合学习环境下基于学习行为数据的学习预警系统设计与实现
- 学习如何学习
- 深度学习的学习历程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pattern Recognition and Machine Learning
Christopher Bishop / Springer / 2007-10-1 / USD 94.95
The dramatic growth in practical applications for machine learning over the last ten years has been accompanied by many important developments in the underlying algorithms and techniques. For example,......一起来看看 《Pattern Recognition and Machine Learning》 这本书的介绍吧!