vue3插槽的使用

这篇具有很好参考价值的文章主要介绍了vue3插槽的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。

1.插槽基本使用

子组件SlotComponent.vue
<template>
    <div class="child-box">
    <p>我是子组件</p>
    <!-- 插槽 -->
    <slot></slot>
  </div>
  </template>
<script setup lang="ts">
</script>
父组件
<template>
  <div class="demo1">
    <h1>我是父组建</h1>
    <SlotComponent></SlotComponent>
  </div>
</template>

<script setup lang="ts">
import SlotComponent from "./component/SlotComponent.vue";
</script>
输出结果:

vue3插槽的使用

2.插槽默认内容

<template>
  <div class="child-box">
    <p>我是子组件</p>
    <!-- 插槽 -->
    <slot>
      <p>我是默认内容</p>
    </slot>
  </div>
</template>
<script setup lang="ts"></script>
输出结果:

vue3插槽的使用

3.具名插槽

子组件SlotComponent.vue
<template>
  <div class="child-box">
    <p>我是子组件</p>
    <header>
      <slot name="header"></slot>
    </header>
    <main>
      <slot></slot>
    </main>
    <footer>
      <slot name="footer"></slot>
    </footer>
  </div>
</template>
<script setup lang="ts"></script>

上段代码中我们添加了 3 个 slot 插槽,并且给其中两个 slot 标签添加了一个 name 属性,也就是每个插槽的名字。需要注意的是,上段代码中有一个插槽我们没有添加 name 属性,这个时候 Vue 会隐式的将这个插槽命名为“default”,

父组件
<template>
  <div class="demo1">
    <h1>我是父组建</h1>
    <SlotComponent>
      <template #header>
        <div>我是 header{{ message }}</div>
      </template>
      <template #default>
        <div>我没有名字{{ message }}</div>
        <div>我没有名字{{ message }}</div>
        <div>我没有名字{{ message }}</div>
      </template>
      <template #footer>
        <div>我是 footer{{ message }}</div>
      </template>
    </SlotComponent>
  </div>
</template>
<script setup lang="ts">
import SlotComponent from "./component/SlotComponent.vue";
const message = ref("---我是父组建中的数据");
</script>
输出结果:

vue3插槽的使用

4.简写

原写法
<template v-slot:footer></template>
简写
<template #footer></template>

默认插槽与具名插槽混用

当一个子组件中既有具名插槽,又有默认插槽时,该如何渲染呢?

前面我们说默认插槽会被隐式的命名为 default,所以我们传入内容时可以将插槽名字改为 defalut 即可。

子组件SlotComponent.vue
<template>
  <div class="child-box">
    <p>我是子组件</p>
    <header>
      <slot name="header"></slot>
    </header>
    <main>
      <slot></slot>
    </main>
    <footer>
      <slot name="footer"></slot>
    </footer>
  </div>
</template>
<script setup lang="ts"></script>
父组件
<template>
  <div class="demo1">
    <h1>我是父组建</h1>
    <SlotComponent>
      <template #header>
        <div>我是 header{{ message }}</div>
      </template>
      <template #default>
        <div>我没有名字{{ message }}</div>
        <div>我没有名字{{ message }}</div>
        <div>我没有名字{{ message }}</div>
      </template>
      <template #footer>
        <div>我是 footer{{ message }}</div>
      </template>
    </SlotComponent>
  </div>
</template>
<script setup lang="ts">
import SlotComponent from "./component/SlotComponent.vue";
const message = ref("---我是父组建中的数据");
</script>
输出结果:

vue3插槽的使用

5.插槽作用域问题

上段代码中 message 是我们在父组件中定义的数据,但是在我们的子组件SlotComponent 中渲染了出来,说明子组件中的插槽是可以访问到父组件中的数据作用域的,但是反过来是不行的,因为我们无法通过插槽拿到子组件的数据。

- 总结:
  • 插槽内容可以访问到父组件的数据作用域,就好比上述中的 message 是父组件的。
  • 插槽内容无法访问到子组件的数据,就好比上述 App.vue 中的插槽内容拿不到子组件 child 的数据。

6.作用域插槽

前一节我们说父组件中的插槽内容是无法访问到子组件中的数据的,但是,万一我们有需求就是需要在插槽内容中获取子组件数据怎么办呢?

6.1默认插槽作用域传值
子组件SlotComponent.vue
<template>
  <div class="child-box">
    <p>我是子组件</p>
    <slot text="我是子组件" :count="1"></slot>
  </div>
</template>
<script setup lang="ts"></script>
父组件
<template>
  <div class="demo1">
    <h1>我是父组建</h1>
    <SlotComponent v-slot="slotProps">
      <div>{{ slotProps.text }}---{{ slotProps.count }}</div>
    </SlotComponent>
  </div>
</template>
<script setup lang="ts">
import SlotComponent from "./component/SlotComponent.vue";
</script>
输出结果:

vue3插槽的使用
上段代码中我们在子组件中 slot 标签上添加了一些自定义属性,属性值就是我们想要传递给父组件的一些内容。在父组件 中通过 v-slot="slotProps"等形式接收子组件传过来的数据,slotProps 的名字是可以任意取的,它是一个对象,包含了所有传递过来的数据。

需要注意的是,子组件传递过来的数据只能在子组件这个标签内使用。

父组件解构写法:
<template>
  <div class="demo1">
    <h1>我是父组建</h1>
    <SlotComponent v-slot="{ text, count }">
      <div>{{ text }}---{{ count }}</div>
    </SlotComponent>
  </div>
</template>
<script setup lang="ts">
import SlotComponent from "./component/SlotComponent.vue";
</script>
6.2具名插槽作用域传值
子组件SlotComponent.vue
<template>
  <div class="child-box">
    <p>我是子组件</p>
    <slot name="header" text="我是子组件的" :count="1"></slot>
  </div>
</template>
<script setup lang="ts"></script>
父组件
<template>
  <div class="demo1">
    <h1>我是父组建</h1>
    <SlotComponent>
      <template #header="{ text, count }">
        <div>{{ text }}---{{ count }}</div>
      </template>
    </SlotComponent>
  </div>
</template>
<script setup lang="ts">
import SlotComponent from "./component/SlotComponent.vue";
</script>

上段代码中我们给 slot 添加了一个 name,在父组件中接收数据的时候不在采用 v-slot=““形式了,而是直接再插槽内容上采用#header=”“形式,当时这是简写形式,你也可以写为:v-slot:header=””

6.tsx中插槽的使用

子组件
<script lang="tsx">
  import { defineComponent} from 'vue';
  export default defineComponent({
    setup(props, context) {
        const {slots}=context
      return () => (
        <div>默认插槽: {slots.default && slots.default()}</div>
      );
    },
  });
</script>
<style scoped></style>
父组建写法一
<script lang="tsx">
  import { defineComponent } from 'vue';
  import Child from './component/child.vue'
  export default defineComponent({
    setup() {
        const text = ref("欢迎");
        return () => (
            <div style="color: red" class="my-test">
            <h1 v-text={text.value}></h1>
            <p>333</p>
                <Child v-slots={{
                default: () => '默认的内容是'
                }}/>
            </div>
        );
    },
  });
</script>
<style scoped></style>
父组建写法二
<script lang="tsx">
  import { defineComponent } from 'vue';
  import Child from './component/child.vue'
  export default defineComponent({
    setup() {
        const text = ref("欢迎");
        return () => (
            <div style="color: red" class="my-test">
            <h1 v-text={text.value}></h1>
            <p>333</p>
                <Child>
                    {{
                    default: () => '默认的内容是'
                    }}
                </Child>
            </div>
        );
    },
  });
</script>
<style scoped></style>
输出结果:

vue3插槽的使用

7.插槽高阶用法

  • 实际开发中可以遇到组件层层嵌套,如果遇到一下情况如何解决。
    7.1. 如果父组件需要拿到子组件的数据
    7.2. 父组件还需要拿到孙组件的数据
父组件 useSlot.vue
<template>
  <div class="demo1">
    <h1>我是父组建</h1>
    <SlotComponent>
      <template #action="data">
        <div>我是 action----{{ data.text }}</div>
      </template>
      <template #SlotDemo="data">
        <div>我是 SlotDemo----{{ data.obj.text }}</div>
      </template>
    </SlotComponent>
  </div>
</template>
<script setup lang="ts">
import SlotComponent from "./component/SlotComponent.vue";
</script>

注释:

  • #action="data"中的data为子组件中传递过来的数据
  • #SlotDemo="data"中的data为孙组件中传递过来的数据
子组件 SlotComponent.vue
<script lang="tsx">
import SlotDemo from "./SlotDemo.vue";
import { Slots } from 'vue'
export default defineComponent({
  name:'SlotComponent',
  setup(props,{ attrs,slots,emit,expose }){
    let state=reactive({ text:'我是子组件中的数据' })
    //slots收到的插槽集合
    //slot 当前插槽的名字  默认是default
    //data 要传给插槽的数据
    const getSlot = (slots: Slots, slot = 'default', data?: Recordable) => {
      const slotFn = slots[slot] //获取到父组件SlotDemo插槽
      if (!slotFn) return null //如果没在父组件找到插槽  就return null
      return slotFn(data)// 将数据data传递给父组件中的插槽
    }
    return () =>(
      <>
        <div>{slots.action?.(state)}</div>
        <SlotDemo>
          {{  
            default: (data) => getSlot(slots,'SlotDemo',data),
          }}
        </SlotDemo>
      </>
    )
  }
})
</script>

注释:

  • default: (data) => getSlot(slots,'SlotDemo',data),:default代表SlotDemo组件中的默认插槽data表示SlotDemo组件上v-bind绑定的参数,
  • getSlot(slots,'SlotDemo',data):在slots中找到插槽SlotDemo,将参数data传给插槽SlotDemo,并返回插槽SlotDemo中的内容。
孙组件 SlotDemo.vue
<template>
    <div class="SlotDemo">
        <slot :obj="obj"></slot>
    </div>
</template>
<script>
export default defineComponent({
    setup() {
        let obj=reactive({ text:'我是孙子组件' })
        return { obj }
    },
})
</script>

注释:

  • :obj="obj"表示要传给父组件的数据
输出结果:

vue3插槽的使用文章来源地址https://www.toymoban.com/news/detail-419543.html

到了这里,关于vue3插槽的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue.js 中的插槽是什么?如何使用插槽?

    在 Vue.js 中,插槽是一种组件之间通信的机制,允许父组件向子组件传递内容,并在子组件中进行渲染。本文将介绍 Vue.js 中插槽的概念、优势以及如何使用插槽。 在 Vue.js 中,插槽是一种组件之间通信的机制,允许父组件向子组件传递内容,并在子组件中进行渲染。Vue.js 中

    2024年02月07日
    浏览(42)
  • element-ui Vue 封装组件按钮工具栏,使用slot插槽

    封装常用按钮工具栏,方便其它页面调用 缺点:工具栏下面div会显示工具栏下面,下面需要使用margin-top:40px(小学生一个没整明白)希望大神能帮解决 运行效果          组件代码 tt-btnBar.vue 父窗口调用 testbtnbar.vue

    2024年02月02日
    浏览(41)
  • vue3 插槽详解

           在某些场景中,封装组件,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。由此出现了插槽 封装的组件代码如下图所示: 页面对封装组件的应用 注意:为插槽默认指定内容,代码如下图所示 封装组件的代码: 应用组件代码: 运

    2024年02月04日
    浏览(39)
  • Vue3 slot插槽多层传递

    如果你想传递一个slot,从爷到孙的传递, 看了网上的一些方案,依赖注入都来了,其实没那么麻烦 最顶层组件,插入一个按钮到 slot name为 btn的 插槽里面,Button接收一个row的参数,参数可能有多个,这里 用了 { row } 只取 row 在中间组件,这里把插入一个 插槽 插入到 slot n

    2024年02月15日
    浏览(40)
  • 【day 12】插槽和vue3

    用于父组件给子组件内 传递html内容 默认插槽 具名插槽 作用域插槽 适用于: 数据不在父组件内 在 子组件内 如果父组件想个性化定制子组件的内容 确保 你的 vue-cli 是 4.5.0的版本以上 vue --verstion的方式查看 版本过低请更新版本 初始文件对比 router/index.js的区别 store/index.js 关

    2024年02月11日
    浏览(41)
  • Vue——动态组件、插槽

    1.ref属性(也可以实现组件间通信:子和父都可以实现通信) ref放在 标签 上,拿到的是 原生的DOM节点 ref放在 组件 上,拿到的是 组件对象  ,对象中的数据、函数 都可以直接使用 通过这种方式实现子传父(this.$refs.mychild.text) 通过这种方式实现父传子(调用子组件方法传

    2024年02月01日
    浏览(33)
  • Vue3——第十三章(插槽 Slots)

    这里有一个 FancyButton 组件,可以像这样使用: 而 FancyButton 的模板是这样的: slot 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。 最终渲染出的 DOM 是这样: 通过使用插槽, FancyButton 仅负责渲染外层的 button (以及相应的样式),而

    2024年02月07日
    浏览(52)
  • 【Vue3 第十九章】插槽 slot

    数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus 权限系统-商城 个人博客地址 在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。这就用到了插槽。 插槽是子组件中的提供给父组件使用的一个占位符,用 slot 表示,父组件可以

    2024年02月09日
    浏览(39)
  • Vue2向Vue3过度核心技术插槽

    1.作用 让组件内部的一些 结构 支持 自定义 2.需求 将需要多次显示的对话框,封装成一个组件 3.问题 组件的内容部分, 不希望写死 ,希望能使用的时候 自定义 。怎么办 4.插槽的基本语法 组件内需要定制的结构部分,改用****占位 使用组件时, ****标签内部, 传入结构替换slo

    2024年02月11日
    浏览(40)
  • 在Vue3中,父组件调用子组件中的方法

    前言: 最近在写一个项目的过程中,遇到了父组件需要调用子组件中方法的情况,最终找到了实现方法,总结如下: 1.在子组件中定义方法并暴露出去 2.在父组件中获取子组件并调用子组件中的方法

    2024年02月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包