joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
  404 随笔 :: 39 文章 :: 8 评论 :: 20万 阅读

在 Vue 3 中使用 TSX 编写组件时,slots 的写法与 Vue 2 有所不同。Vue 3 的 TSX 支持通过 slots 属性或 v-slots 指令来传递插槽内容。以下是详细的写法说明:


1. 默认插槽

默认插槽可以通过 slots.default 来传递内容。

示例:

import { defineComponent } from 'vue';

const ChildComponent = defineComponent({
  render() {
    return <div>{this.$slots.default?.()}</div>;
  },
});

const ParentComponent = defineComponent({
  render() {
    return (
      <ChildComponent>
        {{
          default: () => <span>This is the default slot content</span>,
        }}
      </ChildComponent>
    );
  },
});

export default ParentComponent;

2. 具名插槽

具名插槽可以通过 slots.slotName 来传递内容。

示例:

import { defineComponent } from 'vue';

const ChildComponent = defineComponent({
  render() {
    return (
      <div>
        <header>{this.$slots.header?.()}</header>
        <main>{this.$slots.default?.()}</main>
        <footer>{this.$slots.footer?.()}</footer>
      </div>
    );
  },
});

const ParentComponent = defineComponent({
  render() {
    return (
      <ChildComponent>
        {{
          header: () => <h1>This is the header slot</h1>,
          default: () => <p>This is the default slot content</p>,
          footer: () => <p>This is the footer slot</p>,
        }}
      </ChildComponent>
    );
  },
});

export default ParentComponent;

3. 作用域插槽

作用域插槽可以通过 slots.slotName 传递一个函数,函数的参数是子组件传递的数据。

示例:

import { defineComponent } from 'vue';

const ChildComponent = defineComponent({
  setup() {
    const user = { name: 'Alice', age: 25 };
    return { user };
  },
  render() {
    return (
      <div>
        {this.$slots.default?.({ user: this.user })}
      </div>
    );
  },
});

const ParentComponent = defineComponent({
  render() {
    return (
      <ChildComponent>
        {{
          default: ({ user }: { user: { name: string; age: number } }) => (
            <p>
              User: {user.name}, Age: {user.age}
            </p>
          ),
        }}
      </ChildComponent>
    );
  },
});

export default ParentComponent;

4. 使用 v-slots 指令

Vue 3 提供了 v-slots 指令,可以更简洁地传递插槽内容。

示例:

import { defineComponent } from 'vue';

const ChildComponent = defineComponent({
  render() {
    return (
      <div>
        <header>{this.$slots.header?.()}</header>
        <main>{this.$slots.default?.()}</main>
      </div>
    );
  },
});

const ParentComponent = defineComponent({
  render() {
    return (
      <ChildComponent
        v-slots={{
          header: () => <h1>This is the header slot</h1>,
          default: () => <p>This is the default slot content</p>,
        }}
      />
    );
  },
});

export default ParentComponent;

5. 插槽的简写形式

如果只有一个默认插槽,可以直接传递内容,而不需要使用 slots 属性。

示例:

import { defineComponent } from 'vue';

const ChildComponent = defineComponent({
  render() {
    return <div>{this.$slots.default?.()}</div>;
  },
});

const ParentComponent = defineComponent({
  render() {
    return (
      <ChildComponent>
        <p>This is the default slot content</p>
      </ChildComponent>
    );
  },
});

export default ParentComponent;

6. 总结

  • 默认插槽:使用 slots.default 或直接传递内容。
  • 具名插槽:使用 slots.slotNamev-slots 指令。
  • 作用域插槽:通过函数参数接收子组件传递的数据。
  • v-slots 指令:提供了一种更简洁的插槽传递方式。

通过以上方式,你可以在 Vue 3 的 TSX 中灵活使用插槽功能。

posted on   joken1310  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示