vue3 slot插槽在tsx中的使用方法

本文详细介绍了在Vue的TSX语法中如何使用默认插槽、具名插槽和作用域插槽,提供了具体的子组件示例,并展示了在父组件中如何填充这些插槽,帮助开发者更好地理解和应用Vue组件的插槽功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里只记录在tsx中插槽如何使用,至于在template中的使用插槽可查阅 官方文档–插槽 Slots

TSX中使用插槽

  • 默认插槽

    这里setup接收两个参数

    props 组件外部传递过来,且组件内部声明接收了的属性
    context 上下文对象 (一般使用解构{attrs, slots, emit, expose})

    这里是一个子组件 A.tsx

export default defineComponent({
    setup(props, { emit, slots, expose }) {
        return () => <div>{slots.default?.()}</div>
    }
})

  • 具名插槽

这里是一个子组件 B.tsx

export default defineComponent({
    setup(_, { slots }) {
        return () => <>{slots.foo?.()}</>
    }
})

这个foo就是定义的插槽名字

  • 作用域插槽

    这里是一个子组件 C.tsx

export default defineComponent({
    setup(_, { slots }) {
        return () => <>{slots.footer?.({ name: 'C插槽传递的数据', data: [1, 2, 3, 4, 5, 6] })}</>
    }
})

{ name: 'C插槽的数据', data: [1, 2, 3, 4, 5, 6] } 这个对象就是向外部传递的数据

在父组件中使用

import A from './A'
import B from './B'
import C from './C'
export default defineComponent({
    setup() {
        return () => (
            <div>
          			<A>我是默认插槽的内容</A>
                <A>{{ default: () => <p>我是默认插槽的内容</p> }}</A>
                <B>{{ foo: () => <p>我是具名插槽的内容</p> }}</B>
                <C>
                    {{
                      	// 通过解构得到插槽作用域的参数。{ name: string; data: number[] }是定义的ts类型
                        footer: ({ name, data }: { name: string; data: number[] }) => (
                            <p>
                                {name}---{data}
                            </p>
                        )
                    }}
                </C>
            </div>
        )
    }
})
  • 显示效果

在这里插入图片描述

以上是简单列举的几种常用的使用场景

其他

更多的tsx用法可参考官方文档–渲染函数案例

### 如何在 TSX使用插槽Vue 3 的 JSX/TSX 环境中,可以通过特定的方式来实现插槽功能。以下是详细的介绍以及代码示例。 #### 插槽的基本概念 Vue插槽机制允许父组件向子组件传递模板内容。默认插槽用于提供通用的内容填充,而具名插槽和作用域插槽则提供了更灵活的功能来满足复杂场景的需求[^1]。 #### 在 TSX 下的插槽写法 为了在 TSX使用插槽,可以利用 `h` 函数或者直接通过 JSX 属性绑定的方式完成。具体来说: - **默认插槽** 默认插槽可以直接作为子节点传入到组件实例中。 - **具名插槽** 具名插槽需要指定名称并通过对象的形式传递给目标组件。 - **作用域插槽** 对于带有数据的作用域插槽,则需借助回调函数形式定义其结构并返回对应的 VNode。 ##### 示例代码 以下是一个完整的例子,展示了如何在 TSX使用不同类型的插槽: ```tsx import { defineComponent, h } from &#39;vue&#39;; // 子组件定义 const ChildComponent = defineComponent({ render() { return ( <div> {/* 默认插槽 */} <slot></slot> {/* 具名插槽 */} <slot name="header"></slot> <slot name="footer"></slot> {/* 作用域插槽 */} <slot name="item" data={{ id: 1, text: &#39;Example&#39; }}></slot> </div> ); }, }); export default defineComponent({ setup() { const renderItemSlot = (props: any) => { return <span>{`ID: ${props.data.id}, Text: ${props.data.text}`}</span>; }; return () => h(ChildComponent, {}, { // 默认插槽 default: () => <p>这是默认插槽的内容</p>, // 具名插槽 header: () => <h2>Header Content</h2>, footer: () => <footer>Footer Content</footer>, // 作用域插槽 item: renderItemSlot, }); }, }); ``` 上述代码实现了如下功能: - 定义了一个名为 `ChildComponent` 的子组件,其中包含了三种类型的插槽:默认插槽、具名插槽(`header` 和 `footer`)、以及带数据的作用域插槽(`item`)。 - 在父组件中,分别通过匿名箭头函数或预定义的方法为这些插槽注入了具体的 DOM 结构[^3]。 #### Element Plus 组件中的应用案例 当涉及到像 `el-popover` 或者表格组件时,同样遵循类似的逻辑去处理它们内部支持的插槽特性。例如对于一个弹窗提示框而言,可能希望定制触发按钮样式及其显示区域布局;而对于复杂的表格列配置情况,则可通过组合多种方式达成预期效果——既可以采用简单的字符串描述简单字段映射关系,也能运用高级技术手段如 Reactivity API 动态计算衍生属性值后再渲染出来[^2]。 ```tsx import { ElPopover, ElTableColumn } from &#39;element-plus&#39;; import { defineComponent, h } from &#39;vue&#39;; export default defineComponent({ setup() { return () => h( ElPopover, { title: &#39;Title&#39;, content: &#39;Content&#39;, trigger: &#39;hover&#39; }, { reference: () => <button type="button">Hover Me</button>, // 自定义参考元素 } ); /* 表格列自定义 */ return () => h( ElTableColumn, {}, { default: ({ row }: any) => <span style="color:red;">{row.name}</span>, // 利用作用域插槽修改单元格呈现方式 } ); }, }); ``` 此部分演示了两个实际应用场景下的操作方法:一个是关于悬浮气泡卡片控件设置外部交互入口外观设计;另一个则是针对列表型数据显示模块调整个别项目表现形态的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值