javascript - Vue 事件处理程序,在所有组件之间共享
问题描述
我创建了一个新的 Vue 实例并将其分配给我的窗口,这应该让我可以在所有组件中访问它。这应该让我可以访问在我的应用程序中任何地方发出的事件。
但是由于某种原因,情况并非如此,有人可以告诉我吗?
应用程序.js
window.Vue = require('vue');
window.events = new Vue();
window.app = new Vue({
el: '#app',
methods: {
emit: function (name, params) {
window.events.$emit(name, params);
}
}
});
我emit
在我的应用程序中创建了一个方法供我的组件使用,因为简单的调用v-on:change="window.events.$emit('makeChanged', $event)"
不起作用,我收到了window
未定义的错误。
我正在侦听组件内部发出的任何事件,emit
如下所示:
window.events.$on('makeChanged', function(evt) {});
编辑:
仍然无法让这个工作......
app.js
Vue.component('models-select', require('./components/results-text/ModelsSelect.vue'));
window.app = new Vue({
el: '#app',
methods: {
emit(name, ...params) {
this.$root.$emit(name, ...params);
},
...
ModelsSelect.vue
export default {
props: [ 'endpoint', 'makeId', 'modelId', 'typeId'],
mounted() {
this.$root.$on('make-changed', function(evt) {
console.log(evt);
});
在我的一个观点中(add.blade.php)
<select name="make" id="makes" v-on:change="emit('make-changed', $event)" tabindex="2" class="{{ old('make') ? ' is-changed' : '' }}">
解决方案
$root
您可以使用元素发出和监听事件。
methods: {
emit(name, ...args) {
this.$root.$emit(name, ...args)
}
}
在组件中:
mounted() {
this.$root.$on('event-name', this.handleEvent)
},
beforeDestroy() {
this.$root.$off('event-name', this.handleEvent)
},
methods: {
handleEvent() {
// handle event (with optional args)
}
}
推荐阅读
- kubernetes - 如何从 EKS 集群中删除 pod?
- angular - 在 Angular Ivy 中,为什么在 View Engine 中的用法之间没有缓存纯管道实例?
- modbus - 带有 RTU 成帧器的 Pymodbus 异步服务器不工作
- html - getbootstrap.com vs bootstrapdocs.com:这些应该是相同的东西吗?
- swift - 如果有非英文字符SwiftUI如何处理URL图像
- c# - .net 5.0 AssemblyLoadContext 中的插件
- android - 如何访问可组合内的@Composable 属性?
- ios - 在 tableView 末尾添加一个按钮
- google-apps-script - 如何根据以下条件在 google sheet 中发送电子邮件?
- symbols - 符号计算器符号表示结构