VueX如何实现数据共享 |
1 VueX1.1 VueX概述回顾组件之间共享数据的方式:
VueX是实现组件数据(状态)管理的一种机制,可以方便的实现组件之间数据共享 。 使用VueX的好处:
1.2 VueX的基本使用
npm i vuex --save
import Vuex from 'vuex' Vue.use(Vuex)
const store = new Vuex.Store({
//state中存放的就是全局共享数据
state:{count:0}
})
new Vue ({
el:'#app',
render: h=>h(app),
router,
//将创建的共享数据对象,挂载到vue实例中,所有组件就可以直接从store中获取全局的数据了
store
})1.3 VueX的核心概念
State提供唯一的公共数据源,所有共享的数据都要统一放到Store的state中 组件访问的state中数据的第一种方式: this.$store.state.全局数据名称 组件访问的state中数据的第二种方式: //从vuex中导入mapState函数
import {mapState} from 'vuex'
注释:通过导入的mapState函数,将当前组件需要的全局数据,映射为当前组件的computed计算属性: //例如:
computed:{
...mapState(['count'])
}
Mutation用于变更Store的数据
触发 mutation的第一种方式:this.$store.commit()函数 实例代码: mutations: {
add(state){
//变更状态
state.count++
}
},<template>
<div>
<h3>当前最新的count值:{{this.$store.state.count}}</h3>
<button @click="handle1">+1</button>
</div>
</template>
<script>
export default {
data(){
return{};
},
methods:{
//触发mutation
handle1(){
this.$store.commit('add')
}
}
}
</script>
mutation时传递参数: mutations: {
addN(state,step){
//变更状态
state.count += step
}
},handle2(){
this.$store.commit('addN',2)
}
触发mutation的第二种方式: mutations: {
sub(state){
state.count--
},
subN(state,step){
state.count -= step
},
},<template>
<div>
<h3>当前最新的count值:{{count}}</h3>
<button @click="handlersub">-1</button>
<button @click="handlesub2">-2</button>
</div>
</template>
<script>
import { mapState ,mapMutations} from 'vuex';
export default {
computed:{
...mapState(['count'])
},
methods:{
...mapMutations(['sub','subN']),
handlersub(){
this.sub()
},
handlesub2(){
this.subN(2)
}
}
}
</script>
Action用于处理异步任务 在actions中不能直接修改state中的数据,必须通过context.commit触发某个mutations中的函数 触发actions的第一种方式: this.$store.dispatch() actions中携带参数: //context是默认参数
addNdely(context,step){
setTimeout(()=>{
context.commit('addN',step)
},1000)
}触发actions的第二种方式: import {mapActions} from 'vuex';
export default {
methods:{
//触发actions
...mapActions(['addNdely']),
}
}
Getter用于对store中的数据进行加工处理形成新的数据
使用getters的第一种方式: this.$store.getters.函数名称 使用getters的第二种方式: import {mapGetters} from 'vuex';
export default {
computed:{
...mapGetters(['showNum'])
},
}store.js: import { setTimeout } from 'core-js'
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
count:0
},
getters: {
//这是一个函数
showNum:state =>{
return '最新count:'+state.count
}
},
mutations: {
add(state){
//变更状态
state.count++
},
addN(state,step){
//变更状态
state.count += step
},
sub(state){
state.count--
},
subN(state,step){
state.count -= step
},
},
actions: {
//context是默认参数
addNdely(context,step){
setTimeout(()=>{
context.commit('addN',step)
},1000)
}
},
modules: {
}
})Addi.vue: <template>
<div>
<h3>当前最新的count值:{{this.$store.state.count}}</h3>
<!-- <h4>getters:{{$store.getters.showNum}}</h4> -->
<h4>getters:{{showNum}}</h4>
<button @click="handle1">+1</button>
<button @click="handle3">+2</button>
<button @click="addNdely">+dely</button>
</div>
</template>
<script>
import { mapMutations,mapActions,mapGetters} from 'vuex';
export default {
computed:{
...mapGetters(['showNum'])
},
methods:{
//触发mutation
...mapMutations(['add','addN']),
...mapActions(['addNdely']),
handle1(){
this.add()
},
handle2(){
this.$store.commit('addN',2)
},
handle3(){
this.$store.dispatch('addNdely',2)
}
}
}
</script>Sub.vue: <template>
<div>
<h3>当前最新的count值:{{count}}</h3>
<button @click="handlersub">-1</button>
<button @click="handlesub2">-2</button>
</div>
</template>
<script>
import { mapState ,mapMutations} from 'vuex';
export default {
computed:{
...mapState(['count'])
},
methods:{
...mapMutations(['sub','subN']),
handlersub(){
this.sub()
},
handlesub2(){
this.subN(2)
}
}
}
</script>
总结以上为个人经验,希望能给大家一个参考,也希望大家多多支持 。 |