Vue前端之路(三)---Vuex的入门

目录

1.Vuex概述

2.组件之间共享数据的方式

2.1.父组件向子组件传值(用:属性名发送参数和props接收参数)

2.2.子组件向父组件传值(用$emit发送参数和@方法名接收参数)

2.3.兄弟组件相互传值(自定义Vue实例,用$emit发送参数和$on接收参数)

3.Vuex的引用

3.1.安装vuex依赖包

3.2.导入vuex包

3.3.创建store对象

3.4.将store对象挂载到vue实例中

3.5.多模块化使用

4.vuex的四大核心概念以及使用示例

4.1.State(共享常量或者变量)

4.2.Mutations(同步修改state中数据的方法集合)

4.3.Actions(异步任务,调用Mutations中的方法)

4.4.Getters(包装Store中的数据,不会修改数据)


1.Vuex概述

是实现组件全局状态数据管理的一种机制,可以方便的实现组件之间数据的共享

好处

  • 管理共享的数据,易于开发和后期维护
  • 共享高效率,能够提高开发效率
  • 存储在vuex中的数据都是响应式的,能够实时保持数据与页面的同步

2.组件之间共享数据的方式

Vue.js为最常用的两个指令v-bind和v-on提供了缩写方式。

v-bind指令可以缩写为一个冒号。

v-on指令可以缩写为@符号

父组件向子组件传值:v-bind属性绑定

子组件向父组件传值:v-on 事件绑定

2.1.父组件向子组件传值(用:属性名发送参数和props接收参数)

//父组件调用子组件,父组件调用子组件的时候 绑定动态属性
<template>
    <HeaderTest :isTest1="isTest1"/>
</template>

<script>
import HeaderTest from "@/components/HeaderTest";
export default {
    components: {
        HeaderTest
    },
    data() {
        return {
            isTest1: true,
        }
    }
}
</script>

//子组件HeaderTest.vue,在子组件里面通过 props接收父组件传过来的数据,通过传递不同的数据类型,给不同的默认值,例如:Boolean:false,String:"",Array:() => [],Object:() => {}
export default {
    props: {
	    isTest1: {
		    type: Boolean,
		    default: false
	    },
	    isTest2: {
		    type: String,
		    default: ""
	    },
	    isTest3: {
		    type: Array,
		    default: () => []
	    },
	    isTest4: {
		    type: Array,
		    default: () => []
	    },
	    isTest5: {
		    type: Object,
		    default: () => {}
	    }
    },
}

2.2.子组件向父组件传值(用$emit发送参数和@方法名接收参数)

//子组件HeaderTest.vue通过$emit方法向父组件传值
<script>
    methods: {
        test1(){
            this.$emit("cancel", false);
        },
        test2(){
            this.$emit("finish", ["1","2"]);
        },
    }
</script>

//父组件通过@方法名接收
<template>
    <HeaderTest :isTest1="isTest1" 
        @cancel="cancel1"  
        @finish="finish1" 
    />
</template>
<script>
    methods: {
        cancel1(data){
            //这里接收子组件传递过来的值;
            console.log(data);
        },
        finish1(data){
            console.log(data);
        },
    }
</script>

2.3.兄弟组件相互传值(自定义Vue实例,用$emit发送参数和$on接收参数)

Vue 没有直接子对子传参的方法,建议将需要传递数据的子组件,都合并为一个组件。如果一定需要子对子传参,可以先从传到父组件,再传到子组件。

或者通过eventBus或vuex(小项目少页面用eventBus,大项目多页面使用 vuex)传值

1.专门定义一个新的vue实例的EventBus.js文件用于传递数据并导出
import Vue from 'vue';
export default new Vue();

2.组件A定义传递的方法名和传输内容,点击事件或钩子函数触发eventBus.emit事件
<script>
import eventBus from "./js/EventBus.js";
export default {
    methods: {
        emitToB() {
            eventBus.$emit("eventFromA","要向组件B传递的参数");
        }
    }
}
</script>
3.组件B接收参数
注意:eventBus是一个另一个新的Vue实例,区分两个this所代表得vue实例
<script>
import eventBus from "./js/EventBus.js";
export default {
    data(){
        return {
            test: '',
        }
    },
    mounted(){
        this.getEventData();
    },
    methods: {
        getEventData() {
            const that = this;//这里this指的是本项目的vue实例,用that接收,与eventBus的vue区分
            eventBus.$on("eventFromA",function(val){
                that.test = val;
            });
        }
    }
}
</script>

3.Vuex的引用

3.1.安装vuex依赖包

npm install vuex --save

3.2.导入vuex包

import Vuex from "vuex";
Vue.use(Vuex);

3.3.创建store对象

const store = new Vuex.Store({
    state: {count: 0}
});
export default store;

3.4.将store对象挂载到vue实例中

在main.js中

import store from "./store";
new Vue({
  store,
  render: h => h(App)
}).$mount("#app");

3.5.多模块化使用

一般都是多模块化使用,例如:

//在src的store文件夹下,新建一个index.js文件,内容如下:
import Vue from "vue";
import Vuex from "vuex";
import test from "./modules/test";

Vue.use(Vuex);
const store = new Vuex.Store({
    modules: {
        test,
    }
});

export default store;

//在store文件夹下新建modules文件夹,然后再新建一个test.js的文件,内容如下:
const state = {
    num: 0
}

const mutations = {
    addN(state, step){
        state.num+=step;
    },
}

const actions = {
    addNAsync({commit}, step){
        setTimeout(() => {
            commit('addN', step)
        }, 1000)
    },
}
    
const getters = {
    showNum(state){
        return "当前是几?"+state.num;
    }
} 

export default {
    namespaced: true,
    state,
    mutations,
    actions,
    getters
};

//在src下的store文件夹下,新建一个index.js文件
import Vue from "vue";
import Vuex from "vuex";
import test from "./modules/test";

Vue.use(Vuex);

const store = new Vuex.Store({
    modules: {
        test,
    }
});

export default store;

4.vuex的四大核心概念以及使用示例

用多模块化举例,开启了namespaced:true

4.1.State(共享常量或者变量)

提供唯一的公共数据源,所有共享的数据都要统一放到Store的State中进行存储

const state = {
    num: 0
}

组件调用State中数据方式:

第一种直接调用方式:

//js中使用this.$store.state.<模块名称>.<全局数据名称>
this.$store.state.test.num
//在template中
{{ $store.state.test.num }}

第二种辅助函数方式:

1.从vuex中按需导入mapState函数
import {mapState} from "vuex";
2.通过刚才导入的mapState函数,将当前组件所需要的的全局数据,映射为当前的computed计算属性
computed: {
    ...mapState({
        "num": state => state.test.num,
    }),
},
//如果没有模块化
computed: {
    ...mapState(["num"]),
},
3.js使用
this.num

4.2.Mutations(同步修改state中数据的方法集合)

Mutations用于变更Store中state的数据,只有通过mutations中的方法才能修改state中的数据

const mutations = {
    addN(state, step){
        state.num+=step;
    },
}

组件调用Mutations中方法的方式:

第一种直接调用方式:

methods: {
    addNum(){
      this.$store.commit('test/addN',3);
    },
}

第二种辅助函数方式

1.从vuex中按需导入mapMutations函数
import {mapMutations} from "vuex";
2.映射为当前的methods函数
methods: {
    ...mapMutations({
        "addN":"test/addN",
    }),
},
//如果没有模块化
...mapMutations(['addN']),
3.js使用
this.addN(3)

4.3.Actions(异步任务,调用Mutations中的方法)

触发actions异步任务时携带参数

const actions = {
    addNAsync({commit}, step){
        setTimeout(() => {
            commit('addN', step)
        }, 1000)
    },
}

组件调用actions中方法的方式:

第一种直接调用方式:

methods: {
    addNAsyncNum(){
      this.$store.dispatch('test/addNAsync',3);
    },
}

第二种辅助函数方式:

1.从vuex中按需导入mapActions函数
import {mapMutations} from "vuex";
2.映射为当前的methods函数
methods: {
    ...mapActions({
        "addNAsync":"test/addNAsync",
    }),
},
//如果没有模块化
...mapActions(['addNAsync']),
3.js使用
this.addNAsync(3)

4.4.Getters(包装Store中的数据,不会修改数据)

Getter用于对Store中的数据进行加工处理形成新的数据,不会修改store中的数据

const getters = {
    showNum(state){
        return "当前是几?"+state.num;
    }
} 

组件调用getters中方法的方式:

第一种直接调用方式:

//js中使用this.$store.getters.<模块名称>.<全局方法名称>
this.$store.getters['test/showNum'];

第二种辅助函数方式:

1.从vuex中按需导入mapGetters函数
import {mapGetters} from "vuex";
2.通过刚才导入的mapGetters函数,将当前组件所需要的的全局方法,映射为当前的computed计算属性
computed: {
    ...mapGetters({
        "showNum": "test/showNum",
    }),
},
或者(引入多个模块的getters时,则需要写多个mapGetters)
computed: {
    ...mapGetters('test', {
      showNum: 'showNum'
    }),
},
//如果没有模块化
computed: {
    ...mapGetters(["showNum"]),
},
3.js使用
this.showNum

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彼岸花@开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值