Code前端首页关于Code前端联系我们

Vue3里用Slot总报错?这些坑和解决办法你得知道

terry 2小时前 阅读数 7 #SEO
文章标签 Vue3 Slot

报错“ can only be used inside render function or functional component”是哪里错了?

很多同学第一次遇到这个错误,大概率是用错了地方

举个真实场景:想在组件的setup里用JSX写渲染逻辑,结果直接把<slot/>当普通标签塞进去——

<script setup>  
import { h } from 'vue'  
export default {  
  setup() {  
    return () => <div><slot /></div> // 错误写法!  
  }  
}  
</script>  

为啥错?Vue3里,<slot>本质是模板语法糖,编译后会对应到“插槽渲染逻辑”,但你在setup返回的渲染函数里直接写<slot/>,Vue根本没法正确解析插槽的作用域,所以直接报错“只能在渲染函数或函数式组件里用”。

解决办法分两种情况

  • 如果你用<template>写结构,直接把<slot>丢模板里就行:
    <template>  
      <div><slot></slot></div>  
    </template>  
    <script setup></script>  
  • 如果你偏要用渲染函数(比如JSX/H函数),得用useSlots手动获取插槽:
    <script setup>  
    import { h, useSlots } from 'vue'  
    export default {  
      setup() {  
        const slots = useSlots() // 拿到所有插槽  
        return () => h('div', {}, slots.default ? slots.default() : [])  
      }  
    }  
    </script>  

用v-slot给具名插槽赋值,报“Invalid v-slot directive on