对于非父子组件的传值,如果不是项目很大很复杂,可以使用eventBus方法来实现传值。这种方法通过一个空的Vue实例作为中央事件中心,用他来触发事件和监听事件。具体步骤如下:
import Vue from 'vue'
export default new Vue
Bus.$emit("getCourse", this.coursename)
Bus.$on("getCourse", (msg) => {
this.nameList.push(msg);
console.log(this.coursename);
});
Vuex是适用于Vue项目开发时使用的状态管理工具。如果在一个项目开发中频繁的使用组件传参的方式来同步data中的值,一旦项目变得很庞大,就不利于管理和维护。因此,Vue为这些被多个组件频繁使用的值提供了一个统一管理工具—Vuex。
在具有Vuex的Vue项目中,只需要把这些值定义在Vuex中,即可在整个Vue项目的组件中使用。
每一个Vuex应用的核心就是store(仓库)。"store"基本上就是一个容器,它包含着应用中的大部分状态(state)。Vuex的状态存储是响应式的,不能直接改变store中的状态,改变store中状态唯一的途径就是 显式地提交(mutation)。
用于跨组件通信
当两个组件不是父子组件进行通信的时候
通过npm全局安装Vuex。
在项目根目录下创建一个store文件夹,并在里面创建index.js、state.js、actions.js、mutations.js、getters.js文件
在index.js文件中对vuex进行初始化.。
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
import state from './state'
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
export default new Vuex.Store({
state,
mutations,
actions,
getters
})
vuex中使用state来存储应用中需要共享的状态。所有的数据都存在这里。
为了能让Vue组件在state更改后也随着改变,需要基于state创建计算属性。
//state.js
const state = {
// todoList: JSON.parse(localStorage.getItem('todoList')) || []
todoList: [
'这是第一句话',
'这是第二句话',
'这是第三句话',
'这是第四句话',
'这是第五句话'
],
name: '花花'
}
export default state;
<p>获取state里面的数据:{{ this.$store.state.name }}</p>
<template>
<div>
<p>获取state里面的数据:{{ name }}</p>
</div>
</template>
<script>
export default {
computed:{
name(){
return this.$store.state.name
}
}
}
</script>
mutation是Vuex中改变state数据的唯一方法。
mutation的使用与事件处理函数十分相似,都具有类型和回调函数。
//mutations.js
const mutations = {
changeName(state) {
state.name = '改变后的名字'
}
}
export default mutations;
在设置好mutation之后,需要利用commit连触发mutation函数。
注意:commit是同步函数,只能是同步执行,那如果我们想一步操作的话就需要用另一种方法(下面的action)
在需要改变值的组件内:
methods: {
change() {
// 直接commit了mutation里面的函数操作。
this.$store.commit("changeName");
},
}
如果需要异步操作state里面的数据,就需要通过action来执行。
action并不是直接改变state而是发起mutation。
//mutations.js
const mutations = {
// 同步事件函数,通过commit
changeName(state) {
state.name = '改变后的名字'
},
// 异步事件函数
add(state) {
state.number++;
}
}
export default mutations;
//actions.js
const actions = {
addNumber({ commit }) {
setTimeout(function () {
commit('add')
}, 2000)
}
}
export default actions;
changeNumber() {
this.$store.dispatch("addNumber");
}