vue中的插槽用法(动态插槽)

本文介绍了Vue中的插槽机制,包括默认插槽、具名插槽(尤其是作用域插槽在Vue3中的变化)以及动态插槽的使用方法。通过实例演示了如何在父组件和子组件间进行有效通信。

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

vue中提供了一种通讯方式叫插槽>分为:默认插槽、具名插槽(作用域插槽)

1. 当一个组件有不确定的结构时, 就需要使用slot技术了

2. 注意: 插槽内容是在父组件中编译后, 再传递给子组件

3. 如果决定结构的数据在父组件, 那用默认slot或具名slot

(1) 当只有一个不确定的结构时, 可以使用默认slot

(2) 当有多个不确定的结构时, 可以使用具名slot
(3)如果决定结构的数据在子组件, 那需要使用具名slot(作用域slot)

在 Vue3 中,作用域插槽已被废弃,改为了新的 v-slot 语法。新的 v-slot 语法与 Vue2 中的作用域插槽类似,但是使用方式有所不同。

在 Vue3 中,我们可以使用 v-slot 来声明一个插槽,并绑定插槽的参数。

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

默认插槽和具名插槽的用法+动态插槽名:

父组件

<template>
  <Child>
    <template v-slot:header>{{text}}传来的具名插槽header</template>
    <template #header2><p>{{text}}传来的具名插槽header2</p></template>
    
    <p>{{text}}传来的默认插槽1</p>
    <p>{{text}}传来的默认插槽2</p>

    <template v-slot:footer="{title}">
      <p>父组件来控制插槽内容:{{ title }}</p>
    </template>

    <!-- 动态插槽名 -->
    <template v-slot:[mySlotName1]>
      <p>动态插槽名1</p>
    </template>
    <!-- 缩写动态插槽名 -->
    <template #[mySlotName2]>
      <p>动态插槽名2</p>
    </template>
  </Child>
</template>

<script lang="ts">
// vue3.0版本语法
import { ref, defineComponent } from "vue";
import Child from './child.vue'

export default defineComponent({
  name: "父组件",
  components: {
    Child
  },
  setup() {
    const text = ref('父组件');
    const mySlotName1 = ref('name1')
    const mySlotName2 = ref('name2')
    // 3秒后 将动态的插槽name1 和 name2 调换位置
    setTimeout(() => {
      mySlotName1.value = 'name2'
      mySlotName2.value = 'name1'
    }, 3000)

    return {
      text,mySlotName1,mySlotName2
    };
  },
});
</script>

子组件

<template>
  <div style="font-size: 14px">
    <header>
      <!--具名插槽-->
      <slot name="header"></slot>  
      <slot name="header2"></slot> 
    </header>
    <main>
      <!--默认插槽-->
      <slot></slot> 
    </main>
    <footer>
      <!--具名插槽-->
      <slot name="footer" :title="title"></slot> 
    </footer>
    <slot name="name1" ></slot> 
    <slot name="name2" ></slot> 
  </div>
</template>

<script lang="ts">
// vue3.0版本语法
import { ref, defineComponent } from "vue";

export default defineComponent({
  name: "Child",
  setup() {
    const title = ref('子组件title');
    
    return {
      title
    };
  },
});
</script>

初始页面显示效果:

3秒后页面显示效果:

可以看到3秒后 动态的插槽name1 和 name2 调换位置了

欢迎关注我的原创文章:小伙伴们!我是一名热衷于前端开发的作者,致力于分享我的知识和经验,帮助其他学习前端的小伙伴们。在我的文章中,你将会找到大量关于前端开发的精彩内容。

学习前端技术是现代互联网时代中非常重要的一项技能。无论你是想成为一名专业的前端工程师,还是仅仅对前端开发感兴趣,我的文章将能为你提供宝贵的指导和知识。

在我的文章中,你将会学到如何使用HTML、CSS和JavaScript创建精美的网页。我将深入讲解每个语言的基础知识,并提供一些实用技巧和最佳实践。无论你是初学者还是有一定经验的开发者,我的文章都能够满足你的学习需求。

此外,我还会分享一些关于前端开发的最新动态和行业趋势。互联网技术在不断发展,新的框架和工具层出不穷。通过我的文章,你将会了解到最新的前端技术趋势,并了解如何应对这些变化。

我深知学习前端不易,因此我将尽力以简洁明了的方式解释复杂的概念,并提供一些易于理解的实例和案例。我希望我的文章能够帮助你更快地理解前端开发,并提升你的技能。

如果你想了解更多关于前端开发的内容,不妨关注我的原创文章。我会不定期更新,为你带来最新的前端技术和知识。感谢你的关注和支持,我们一起探讨交流技术共同进步,期待与你一同探索前端开发的奇妙世界!

<think>我们被要求回答关于Vue.js插槽的使用指南和示例,并且提供了相关引用。根据引用[3]:“通过以上示例,我们可以看到插槽Vue.js中的强大功能和灵活性。它不仅能够实现组件间的通信,还能让组件的复用性和可维护性得到极大的提升。”因此,我们将重点介绍插槽的基本概念、使用方法和示例。Vue.js插槽(Slot)是一种用于组件的内容分发机制。它允许你向组件传递模板片段,这些片段可以在组件的模板中被渲染。###插槽的基本使用1.**默认插槽**:在组件模板中使用`<slot>`标签作为内容分发的出口。如果在组件的开始标签和结束标签之间没有内容,那么将显示插槽内的默认内容。示例:创建一个`Button`组件,允许用户自定义按钮内部的文本。```html<!--Button.vue--><template><buttonclass="btn"><slot>默认按钮</slot></button></template>```使用这个组件:```html<Button>点击我</Button><!--显示“点击我”--><Button></Button><!--显示“默认按钮”-->```2.**具名插槽**:当需要多个插槽时,可以使用具名插槽。在组件模板中给插槽命名,在使用组件时通过`v-slot`指令指定具体插槽。示例:创建一个`Layout`组件,包含头部、主体和尾部。```html<!--Layout.vue--><template><divclass="container"><header><slotname="header"></slot></header><main><slot></slot><!--默认插槽,没有name属性,默认为"default"--></main><footer><slotname="footer"></slot></footer></div></template>```使用组件:```html<Layout><templatev-slot:header><h1>这是头部</h1></template><!--默认插槽的内容,可以不用template包裹,或者使用v-slot:default--><p>这是主体内容</p><templatev-slot:footer><p>这是尾部</p></template></Layout>```3.**作用域插槽**:有时需要让插槽内容访问子组件中的数据。这时可以使用作用域插槽,将子组件的数据作为插槽的属性绑定。示例:创建一个`TodoList`组件,允许父组件自定义每个待办项的显示方式。```html<!--TodoList.vue--><template><ul><liv-for="(item,index)initems":key="index"><slot:item="item":index="index">{{item.text}}</slot></li></ul></template><script>exportdefault{props:['items']}</script>```使用组件:```html<TodoList:items="todos"><!--使用v-slot接收传递过来的数据,这里使用解构--><templatev-slot:default="{item,index}"><span:class="{done:item.isDone}">#{{index}}-{{item.text}}</span></template></TodoList>```###注意事项-在Vue2.6.0及以上版本,使用`v-slot`指令(可以缩写为`#`)来定义插槽。在旧版本中使用`slot`和`slot-scope`属性,但已废弃。-默认插槽可以省略`v-slot:default`,直接用元素内容填充。-在作用域插槽中,可以使用解构语法来获取传递的数据。###高级用法插槽函数在Vue3中,还可以使用作用域插槽来实现类似React的renderprops模式,允许父组件通过函数的方式动态决定子组件的渲染内容。###总结插槽Vue组件中非常重要的一个特性,它使得组件更加灵活和可复用。通过默认插槽、具名插槽和作用域插槽,可以应对不同的内容分发需求。§§相关问题§§1.Vue.js中作用域插槽的具体应用场景有哪些?2.如何在Vue3中使用插槽?3.插槽和Props在组件通信上有什么异同?4.如何使用Vue插槽实现组件的可扩展性设计?以上内容参考了引用[3]关于插槽的说明,并扩展了具体用法和示例。</think> ### Vue.js 插槽使用指南与示例 Vue.js 中的插槽(Slot)是组件化开发的核心功能,允许父组件向子组件注入自定义内容,实现灵活的组件组合。[^3] #### 一、基础插槽使用 **默认插槽** - 在子组件中预留内容分发位置: ```html <!-- 子组件 ChildComponent.vue --> <template> <div class="container"> <h3>子组件标题</h3> <slot>默认内容(当父组件未提供内容时显示)</slot> </div> </template> ``` **父组件调用**: ```html <child-component> <p>父组件注入的自定义内容</p> </child-component> ``` #### 二、具名插槽 用于多个内容分发点: ```html <!-- 子组件 Layout.vue --> <template> <div> <slot name="header"></slot> <slot name="main"></slot> <slot name="footer"></slot> </div> </template> ``` **父组件调用**: ```html <layout> <template v-slot:header> <h1>自定义头部</h1> </template> <template v-slot:main> <p>主要内容区</p> </template> <template v-slot:footer> <p>页脚信息</p> </template> </layout> ``` > 注意:Vue 2.6+ 使用 `v-slot` 替代旧的 `slot` 属性[^3] #### 三、作用域插槽 子组件向插槽传递数据: ```html <!-- 子组件 UserList.vue --> <template> <ul> <li v-for="user in users" :key="user.id"> <slot :user="user">{{ user.name }}</slot> </li> </ul> </template> <script> export default { data: () => ({ users: [ { id: 1, name: '张三', role: '管理员' }, { id: 2, name: '李四', role: '用户' } ]}) } </script> ``` **父组件接收数据**: ```html <user-list> <template v-slot:default="slotProps"> <span class="badge">{{ slotProps.user.role }}</span> {{ slotProps.user.name }} </template> </user-list> ``` #### 四、插槽高级技巧 1. **插槽缩写语法** `v-slot:header` 可简写为 `#header` 2. **解构作用域** ```html <template #default="{ user }"> {{ user.name.toUpperCase() }} </template> ``` 3. **动态插槽名** ```html <template #[dynamicSlotName]> ... </template> ``` #### 五、最佳实践场景 1. 通用布局组件(如卡片、模态框) 2. 数据列表的自定义渲染 3. 高阶组件(HOC)设计 4. 组件库开发时保留扩展点 > 提示:在大型项目中,可配合 Vuex 管理插槽相关状态[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值