vue中子组件通过emit方法触发父组件的function。并且想等待父组件函数的回调(异步)。

101 阅读1分钟
  • 原本是将逻辑写在子组件中,为了解耦方便维护。将子组件改为展示组件。父组件作为容器组件。并将子组件原有的逻辑抽离到封装成hook。然后在父组件中引入。

  • 由于子组件使用的是vant的tab组件。 其中用到了before-change的属性。该参数说明是 “切换标签前的回调函数,返回 false 可阻止切换,支持返回 Promise”; 如果我在子组件中写逻辑。没有任何问题。可以同步或异步。

  • 但我现在通过emit的方法去触发父组件中的function,并且希望得到父组件函数的回调用作子组件返回。 记录一下两种实现方案

  1. 通过props将父组件中函数直接传递给子组件。没什么毛病,但我觉得不够优雅。而且vue也不推荐。
  2. 通过emit事件去触发。
<template>
  <van-tabs :before-change="handleTabsBeforeChange"></van-tabs>
</template>

<script>
import { defineComponent, ref, emits } from 'vue';

export default defineComponent({
  emits: ["tabs-before-change"],
  setup() {
    
    const handleTabsBeforeChange = async (name: number | string): boolean | Promise<boolean> => {
      let resBool = true;
      await new Promise<void>(resolve => {
          ctx.emit("tabs-before-change", (val: boolean) => {
              resBool = val;
              resolve();
          });
      });
      console.log("resBool", resBool)
      return resBool;
    }
    return {
      handleTabsBeforeChange,
    };
  },
});
</script>