vue中的插槽

插槽是什么

插槽(slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽。
插槽分为:
1、默认插槽
2、具名插槽
3、作用域插槽

默认插槽

APP父组件

  <div class="app">
    <Category :listdata="foods" title="美食">
      <img src="./assets/logo.png" alt="">
    </Category>
   </div>

Category子组件

    <div class="content">
        <h3>{{title}}</h3>
        <ul>
         	<h3>不是插入位置</h3>
         	<h3>不是插入位置</h3>
         	<h3>不是插入位置</h3>
          <slot>默认值,传值就会消失</slot>
        </ul>
    </div>
  • 如果不在子组件添加v-slot, img标签不知道插入的具体位置
  • 当传入值后v-slot原来的数据不再显示

具名插槽

当有多个标签需要插入到子组件时,需要使用具名插槽。 可以把标签传入名字相对应的插槽
APP父组件

	<div class="container">
		<Category title="美食" >
			<p slot="header">插入子组件头部的数据</p>
			<img slot="footer" src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="">
		</Category>
	</div>

Category子组件

		<div class="category">
		<slot name="header">我是一些默认值,当使用者没有传递具体结构时,我会出现</slot>
		<h3>{{title}}</h3>
		<!-- 定义一个插槽(挖个坑,等着组件的使用者进行填充) -->
		<slot name="foorter">我是一些默认值,当使用者没有传递具体结构时,我会出现</slot>
	</div>

当标签是template是 v-slot:footer 和 v-slot=‘footer’ 功能一样

作用域插槽

APP父组件 !!!必须用template标签包裹

		<Category title="游戏">
			<template scope="list">
				<ul>
					<li v-for="(g,index) in list.games" :key="index">{{g}}</li>
				</ul>
			</template>
		</Category>

Category子组件

	<div class="category">
		<h3>{{title}}分类</h3>
		<slot :games="games" msg="hello">我是默认的一些内容</slot>
	</div>
<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]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值