vue.js - Vue $emit 在动态组件 /promise 上无法正常工作
问题描述
我创建了一个接受动态数据(th、tr、td、...)的表组件。表数据(td)可以是一个动态组件,如下所示:
<td>
<component
:is="data.content"
:colspan="data.colspan"
v-bind="data.props"
v-on="data.events"/>
</td>
...
export default {
name: "DynamicTable",
props: {
...
isLoading : { // loading slot will be used if true
type: Boolean,
default: false
}
}
}
我在另一个组件中提供所需的数据,如下所示:
<other-html-elements/>
<dynamic-table
:table-heads="tableHeads"
:table-rows="tableRows"
:is-loading="isLoading">
...
computed: { ...
tableRows () {...
new TableData(CancelOrderButton, 'component', {
props: {
order
},
events: {
'updateLoadingStatus': this.updateLoadingStatus
}
})
...
methods: { ...
updateLoadingStatus (status) {
this.isLoading = status
}
这是我的 CancelOrderButton:
methods: {
cancelOrder () {
this.$emit('updateLoadingStatus', true)
somePromise().finally(() => {
this.$emit('updateLoadingStatus', false)
})
一旦我点击一个按钮并调用 cancelOrder 方法,updateLoadingStatus 将毫无问题地发出。在 promise 解决后,它会再次发出。但处理程序不会触发。我已经检查了一切。我确定会发出事件。当我将第二个 emit 语句移出 finally 块或者如果我不将 isLoading 作为动态表的道具传递时,这个问题将得到解决。
解决方案
尝试像这样设置该发射的道具:
<dynamic-table
:table-heads="tableHeads"
:table-rows="tableRows"
@update-loading-status="updateLoadingStatus"
:is-loading="isLoading">
并像这样调用它(尽管它应该像你拥有的那样工作):
this.$emit('update-loading-status', true)
您也可以以一般方式定义它们并在所需的组件中使用它们: https ://vuejs.org/v2/guide/custom-directive.html
推荐阅读
- list - Google 表格 - 列出 2 个不同列的组合并指出它们出现的次数
- python - 安装 LabelImg 窗口
- java - 在 Spring Web 应用程序中找不到类 [org.springframework.scheduling.quartz.SchedulerFactoryBean]
- sql - 在 2 列和第三列的组合之间定义唯一约束
- python - 如何访问作为列表的 Pandas 系列元素
- java - javafx避免按键时在开始处暂停
- reactjs - 当位置改变时重新定位地图的中心?
- android - Firebase 无法检索到类的值
- django-models - Django - 将表单保存到数据库中
- django-rest-framework - 出错时返回不同的 Content-Type 响应