【问题标题】:Await a grandparent component's method to be resolved in grandchild component等待祖父组件的方法在孙子组件中解析
【发布时间】:2019-10-28 15:01:17
【问题描述】:

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

  • 首页:(Button 的祖父母)
  • 对话框:(Home 的子项/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 组件发出“接受”自定义事件时立即执行:

<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

需要等待吗?

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    也许,您可以在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 是另一种简单的方法。

    【讨论】:

    • 我会尝试一下事件总线的建议。感谢您的回答!
    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 2019-01-10
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多