[英]Await a grandparent component's method to be resolved in grandchild component
我的vue應用程序中包含三個組件:
Home
組件具有一個異步方法:
async handleDialogAccept() {
try {
const response = await this.$axios.get('https://jsonplaceholder.typicode.com/todos/');
console.log(response.data);
} catch (err) {
console.log(err);
}
},
並且它將在Dialog
組件發出“ accept”自定義事件后立即執行:
<dialog-confirmation
@accept="handleDialogAccept()"
/>
Dialog
組件有一個子項( Button
):
<button-accept
v-on="$listeners"
>
Accept
</button-accept>
在我的buttonAccept.vue
,它被導入到Dialog
並如上所示使用,其結構如下:
<template>
<v-btn
color="primary"
@click="handleClick()"
:loading="loading"
:disabled="loading"
>
<slot name="accept"></slot>
</v-btn>
</template>
<script>
export default {
props: ['parentFunction'],
data() {
return {
loading: false,
};
},
methods: {
handleClick() {
this.$emit('accept');
},
},
};
</script>
我想在handleClick
方法中執行以下步驟:
loading
設置為true handleDialogAccept
完成 loading
設置為false 需要等待嗎?
也許可以在Home
組件中定義一個變量( isAcceptDone
),以確定在Button
組件中是否完成了異步方法。
Home
組件
async handleDialogAccept() {
try {
const response = await this.$axios.get('https://jsonplaceholder.typicode.com/todos/');
console.log(response.data);
this.isAcceptDone = true;
} catch (err) {
console.log(err);
}
},
Dialog
組件
<dialog-confirmation
@accept="handleDialogAccept()"
:isAcceptDone="isAcceptDone"
/>
Button
組件
<script>
export default {
props: ['parentFunction', 'isAcceptDone'],
data() {
return {
loading: false,
};
},
watch: {
isAcceptDone(val) {
if(val) {
this.loading = false
}
}
},
methods: {
handleClick() {
this.$emit('accept');
},
}
};
</script>
另一方面,如果您認為在三個組成部分中傳遞isAcceptDone
太復雜了。 使用EventBus是另一種簡單的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.