3 回答

TA貢獻1799條經驗 獲得超8個贊
總結你給出的信息:
chrome 的 vue 開發者控制臺也確認了跳過事件已被觸發。
TL; 博士
vm.$emit 基本上調用中列出的每個方法 vm._events[eventName]
v-on通過context.listenersin注冊createElemet并通過注入updateListeners
基本上你可以使用debugger語句進行調試:
skip(evt) {
let payload = { id: this.question_id };
this.skipQuestion(payload).then( () => {
debugger; // scope -> _events & scope -> $parent.componentInstance
// or console.log(JSON.stringify(this._events))
this.$emit('skip', this.uuid);
}).catch( (error) => {
console.log(error);
});
},
然后你知道發生了什么。
檢查事項:
有效this范圍
有效的 parent
實際觸發時已解決
vm._events 掛號的

TA貢獻1111條經驗 獲得超0個贊
您丟失了對thisthen 塊內的引用。引用現在是調用的回調函數。而是這樣做
...mapActions(['skipQuestion']),
skip(evt) {
let payload = { id: this.question_id };
let vm = this; // Preserve Vue instance for use inside block
this.skipQuestion(payload).then( () => {
vm.$emit('skip', vm.uuid);
}).catch( (error) => {
console.log(error);
});
},

TA貢獻1850條經驗 獲得超11個贊
我遇到了完全相同的問題,并且終其一生都無法弄清楚發生了什么。我能想到的就是,不知何故,組件在等待承諾解決時失去了發出事件的能力。
無論如何,我的解決方案是發出承諾本身,如下所示:
skip(evt) {
let payload = { id: this.question_id };
this.$emit('skip', skipQuestion(payload));
}
而在父母身上,你可以做
... @skip="receive_skip($event)" ...
...
methods: {
receive_skip(skipped) {
skipped
.then((data) => {
// do something on success
})
.catch((err) => {
// do something on fail
});
}
}
它沒有那么干凈和優雅,但它完成了工作。
添加回答
舉報