You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue 3 自定义封装Suspense组件时@resolve事件无法自动透传的问题咨询

Vue 3 自定义封装Suspense组件时@resolve事件无法自动透传的问题咨询

嗨,各位Vue开发者们,我最近在封装自定义Suspense组件的时候碰到了一个困惑,想跟大家请教下原因。

我想要封装一个自定义的Suspense组件,让它的resolve事件能自动透传下去,但实际测试下来发现必须手动绑定v-bind="attrs"才能让事件触发,这跟我理解的Vue文档描述不太一样,所以想问问大家这是为什么。

先贴一下我的代码示例:

App.vue

<script setup>
import SuspenseCustom from './components/SuspenseCustom.vue';
import SlowComponent from './components/SlowComponent.vue';
import { ref } from 'vue';

const suspenseResolved = ref(false);
const onSuspenseResolved = () => {
  suspenseResolved.value = true;
  alert('suspense resolved');
};
</script>

<template>
  <div>
    <h1>App</h1>
    <SuspenseCustom @resolve="onSuspenseResolved">
      <SlowComponent />
    </SuspenseCustom>
  </div>
</template>

<style scoped></style>

SuspenseCustom.vue

<script setup>
import {useAttrs} from "vue";
const attrs = useAttrs()
console.log('attrs', attrs)
</script>

<template>
  <Suspense v-bind="attrs">
    <slot></slot>
    <template #fallback>
      <div>LOADING</div>
    </template>
  </Suspense>
</template>

SlowComponent.vue

<script setup>
await new Promise((resolve) => {
  setTimeout(() => {
    resolve("Promise resolved after 2 seconds!");
  }, 2000);
});
</script>

<template>
  <div>IM DONE</div>
</template>

按照Vue官方文档的说法,组件上的事件监听器默认会自动透传到组件的根元素上。我原本以为不需要给<Suspense>标签加上v-bind="attrs",事件也能正常触发,但实际测试发现,如果去掉这行代码,@resolve对应的事件处理函数onSuspenseResolved就完全不会被调用了。

想请教下大家,为什么这个resolve事件没办法像普通事件那样自动透传呢?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:35:26