继续上一篇的vuex上手,我们完成了父组件和子组件A、子组件B。那么我们接下来就要将数据抽离出来,放到vuex中实现状态管理。
Step 1:安装vuex
npm install vuex --save
接着在src目录
下,新建一个store
的文件夹,里面再新建一个index.js
文件,然后开始给它加点代码:
/* store/index.js */
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
dataNum: 10
}
})
export default store
细心的小伙伴肯定发现,我们的dataNum: 10
仿佛似曾相识,而且它还被放在state
中。没错,等会再来讲这里,我们先去main.js
文件把store
引进去:
// main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/index' // 在这里引入store
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
store, // 在这里调用store
components: { App },
template: '<App/>'
})
好了,接下来,我们讲一下刚刚绕过的这个知识点:
/* store/index.js */
const store = new Vuex.Store({
state: {
dataNum: 10
}
})
这里的state你可以理解为状态,总而言之它是用来存储数据的,我们有一个叫dataNum
的数据,需要在多个组件同时被调用且同时发生变更,那么就需要放在state中。
Step 2:去掉父子组件的冗余代码
把App.vue
中,data里面的数据删除,整个data删掉也行(本案例用不着了);然后把两个组件中的props都删掉,重新写一下data:
export default {
data(){
return{
dataNum: this.$store.state.dataNum
}
}
}
两个组件都是这样写就好。很明显,我们现在是在组件本身上写dataNum
,然而,我们这里看到,dataNum
的数据其实是这个:
this.$store.state.dataNum
没错,这就是我们获取state
中的数据所使用的方法。接下来去网页观看,你会发现数据正常获取,我们接着走下一步。
Step 3:添加点击事件
OK,这里需要着重说明,官方规定修改state
中数据的唯一方法是:使用mutations
!因此我们先绕开getters
,直接进入mutations
的学习。
我们在store
文件夹下面的index.js
中,给mutations添加几个方法:
/* store/index.js */
const store = new Vuex.Store({
state: {
dataNum: 10
},
mutations: {
reduceNum(state, payload){ //减少数量
state.dataNum -= payload;
},
addNum(state, payload){ // 增加数量
state.dataNum += payload;
},
changeNum(state, payload){ //修改数量
state.dataNum = payload;
}
}
})
export default store
我们可以看到,每个方法都有两个参数——state
和payload
,第一个参数是直接引用了state
,使我们下面的代码可以直接state.dataNum
,而不是this.$store.state.dataNum
这么冗余。另一个参数payload
,则是从组件发送过来的参数。我们定义这三个方法,分别是为了让数量减少、增加,或者直接修改。我们来看在组件中要怎么调用这些方法,用组件B举例:
<!-- 组件B(BCom.vue) -->
<template>
<div>
<input type="text" v-model="getDataNum">
<button @click="reduceFn">按钮 -</button>
</div>
</template>
<script>
export default {
data(){
return{
// dataNum: this.$store.state.dataNum
}
},
computed: {
getDataNum: { // v-modal中使用这个方法返回的值,每个方法都有get和set
get(){
return this.$store.state.dataNum; // 获取并返回state中的dataNum
},
set(val){
this.$store.commit('changeNum', val); // 调用mutations中的changeNum方法
}
}
},
methods: {
reduceFn(){
this.$store.commit('reduceNum',1);
}
}
}
</script>
<style scoped></style>
同理,组件A也是这么玩。这里需要注意的是,在组件中调用mutations
中的方法,需要使用this.$store.commit('方法名',参数)
才能调用。注意,这里的参数就是我们上面提到的payload
。
OK,学到这里你已经上手了,接下来回头去学getters
和actions
吧,这两个就很容易学会了!
网友评论