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
相关产品推荐
相关产品推荐

