等待祖父母组件的方法在孙组件中解决

时间:2019-06-14 01:20:26

标签: javascript vue.js

我的vue应用程序中包含三个组件:

  • 首页:(Button的祖父母)
  • 对话框:(主页的子项/ Button的父项)
  • 按钮:(家的孙子)

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方法内执行后续步骤:

  1. loading设置为true
  2. 发出接受自定义事件
  3. 等待handleDialogAccept完成
  4. loading设置为false

是否需要等待?

1 个答案:

答案 0 :(得分:2)

也许,您可以在isAcceptDone组件中定义变量(Home),以确定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是另一种简单的方法。