vuejs2 - 如何从 vuex 中的子组件向任何父组件触发事件
问题描述
所以我有组件“X”作为父组件或组件“Y”作为
父组件,“a”作为子组件触发一个或多个事件
“a”或“a”的任何子兄弟或父级本身可以使用
我想要的事件使用“a”作为独立成分
所以我有自己的“X”组件
state
mutations
actions
getters
我有自己的“一个”组件
state
mutations
actions
getters
“a”a.vue 文件看起来像这样
<template>
<div>
<app-select
@change.native="someevent()"
name="lineup_id"
v-model="$store.state.form.id" label="Select Id"
:options="options"
/>
</div>
</template>
import AppSelect from "../AppSelect.vue";
export default {
data() {
return {
options:[]
};
},
components: {
AppSelect,
},
}
所以我想从孩子“a”
“X”和“Y”触发更改事件,任何父母都得到那个事件并用那个事件做一些
我知道如何用VUE做的事情
解决方案
拳头:不要使用 $state 获取属性,使用 mapState
<template>
<div>
<app-select
@change.native="someevent()"
name="lineup_id"
v-model="explicitPropertyName" label="Select Id"
:options="options"
/>
</div>
</template>
<script>
import AppSelect from "../AppSelect.vue";
import { mapState } from 'vuex'
export default {
computed : {
...mapState(['explicitPropertyName'])
}
data() {
return {
options:[]
};
},
components: {
AppSelect,
},
}
</script>
第二:使用总线事件,看一个例子
Vue.config.productionTip = false
Vue.config.devtools = false
Vue.prototype.$eventBus = new Vue()
const componentA = {
template : `<button @click="emitMethod">Component A emit</button>`,
methods: {
emitMethod () {
this.$eventBus.$emit('EVENT_NAME_FROM_A', { id: 12, pseudo: "Unicorn power A"});
}
},
mounted () {
this.$eventBus.$on('EVENT_NAME_FROM_B', function (payload) {
console.log('Emitted from component B, received in Component A', payload);
});
}
}
const componentB = {
template : `<button @click="emitMethod">Component B emit</button>`,
methods: {
emitMethod () {
this.$eventBus.$emit('EVENT_NAME_FROM_B', { id: 12, pseudo: "Unicorn power"});
}
},
mounted () {
this.$eventBus.$on('EVENT_NAME_FROM_A', function (payload) {
console.log('Emitted from component A, received in Component B', payload);
});
}
}
const vm = new Vue({
el: "#app",
components : {
componentA,
componentB
},
mounted () {
this.$eventBus.$on('EVENT_NAME_FROM_B', function (payload) {
console.log('Emitted from component B, received in Parent', payload);
});
this.$eventBus.$on('EVENT_NAME_FROM_A', function (payload) {
console.log('Emitted from component A, received in Parent', payload);
});
}
})
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div id="app">
<div>
<component-b></component-b>
<component-a></component-a>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
</body>
</html>
推荐阅读
- javascript - 如何将关闭文本添加到现有的切换开关
- image - 在 Matlab 中打开 3D 二值图像
- node.js - 告诉 npm 包从安装它的项目根 node_modules 导入
- c# - c#通过串口打印到矩阵打印机(蓝牙适配器)
- calendar - 如何查询这个新的 CalendarEvent 属性名称 exceptionOccurrences?
- php - 如何获取带有错误 mk 的路径 laravel 没有这样的目录或文件?
- dns - 查找指向特定名称服务器的所有域
- java - 使用 StringBuilder 反转句子
- java - 使用扫描仪读取文本文件 (Java)
- python - 如何将 variables.py 中的变量作为全局值传递