【发布时间】:2021-08-12 18:44:12
【问题描述】:
我创建了一个简单的 ionic 应用程序,允许用户预订服务。用户将选择服务类别,选择服务,然后导航到表单以完成预订。
我已经使用 tiny emitter 设置了一个事件总线,因为该项目使用 vue 3 和组合 API。数据按预期发出,但是在导航到预订表单时不会触发侦听器。
预期行为是获取所选服务并将其与其余预订信息一起发送到 REST api。
eventBus.js
import { TinyEmitter } from 'tiny-emitter';
const emitter = new TinyEmitter();
const eventBus = () => {
return { emitter };
};
export default eventBus;
Service.vue
// template
<ion-button routerDirection="forward" routerLink="/booking" @click="sendEvent">Book Now</ion-button>
// script
import eventBus from './eventBus';
export default {
...
setup() {
...
const sendEvent = () => {
eventBus().emitter.emit('selected-service', 100) // the real code emits an array
}
return { sendEvent }
}
}
Booking.vue - 控制台日志中没有任何反应
<script>
...
onMounted(() => {
eventBus().emitter.on('selected-service', (payload) => {
console.log('listener', payload);
})
})
</script>
我知道这适用于常规 Vue 3 项目,但我不确定为什么它不适用于 ionic。
我尝试过的事情
- 通过
context使用本机发射器作为设置参数。 https://v3.vuejs.org/guide/composition-api-setup.html#accessing-component-properties - 使用
mitt包,如下所述:Vue 3 Event Bus with Composition API - 在用户选择服务而不是点击“立即预订”时发出事件
- 直接调用
setup()中的监听器而不是onMounted。
更新
我注意到,当我离开预订页面然后返回该页面时,监听器会被调用。因此,如果我从服务详情 -> 预订 -> 返回服务详情 -> 预订,它会触发总线并捕获有效负载。
【问题讨论】:
-
我创建了一个快速启动 repo 来复制这个问题:github.com/carlHandy/Ionic5-Event-Bus
标签: javascript vue.js ionic-framework ionic5 vue-composition-api