【发布时间】:2018-05-11 05:18:33
【问题描述】:
我有一个子组件从我的服务器获取一些数据,在获取之前我将加载状态更改为 true,并且我想在获取完成后将其设置为 false。所以我在我的子组件中做了类似的事情:
mounted() {
this.$emit('update:loadingMessage', 'Loading version options from Artifactory...');
this.$emit('update:isLoading', true);
this.fetchVersions();
},
methods: {
fetchVersions() {
const promises = [
this.$http.get(`${process.env.API_URL}/version/front`),
this.$http.get(`${process.env.API_URL}/version/back`),
];
Promise.all(promises)
.then((values) => {
// Do some stuff
})
.then(() => {
this.$emit('update:isLoading', false);
})
.catch(requestService.handleError.bind(this));
},
},
在我的父组件中,我像这样收听这个事件:
<version-selector
:form="form"
@update:loadingMessage="updateLoadingMessage"
@update:isLoading="updateLoadingStatus"
:isSnapshotVersion="isSnapshotVersion">
</version-selector>
最后在updateLoadingStatus 中,我将isLoading 的值相应地设置为true 或false。
updateLoadingMessage(message) {
this.$log.debug(message);
this.loadingMessage = message;
},
updateLoadingStatus(status) {
this.$log.debug(status);
this.isLoading = status;
},
这对显示或不显示我的loading 组件很有用:
<loading
v-if="isLoading"
:loadingMessage="loadingMessage"
:isGiphy="true">
</loading>
我的问题是第一个发射工作正常,isLoading 值设置为true,但第二个发射不工作,我的isLoading 值永远保持在true...在我的方法中@ 987654335@ 我记录了status 的值,我发现这个方法只被调用了一次。
【问题讨论】:
-
重要注意事项:首先,您在
.then()上下文中使用this.$emit()。您可能会遇到this引用与 Vue 实例不同的上下文的问题。考虑在输入Promise之前执行var this_vue_instance = this;之类的操作,然后改用this_vue_instance.$emit()。至于你的发射捕获问题,我自己没有测试过,但也许在你的事件中使用冒号会产生问题?我会尝试消除它作为一个快速测试,以确保它没有冲突的语法。 -
他使用箭头语法自动将 this 绑定到外部范围。事件中的冒号不会成为问题,因为 Vue 本身实际上在最新版本之一的 Vue 的
.sync中将冒号用于它自己的事件。您使用的是哪个版本的 Vue?编辑:带有冒号的属性键可能是个问题。 -
"vue": "^2.5.8" -
您所描述的功能与
.sync在Vue 及更高版本的2.3.0中提供的功能几乎相同。 vuejs.org/v2/guide/components.html#sync-Modifier 实际上 Vue 本身使用了 @update:key 事件,这可能是你问题的根源。 -
我也尝试过类似
v-on:loadingMessage="updateLoadingMessage($event)"v-on:isLoading="updateLoadingStatus($event)"的方法,但也没有用。
标签: javascript vue.js