在使用组件时,在引用的组件标签中添加内容时,会自动被组件中的模板代替,如【例1】

【例1】

<my-comp>Have a happy Life</my-comp>
Vue.component('my-comp',{template:`<div> Life is a shit! </div>`
})

【结果】

1.插槽的使用

当不想要传递给组件的内容被替代,则可以使用组件插槽来解决这个问题,具体使用方法是,在组件模板中添加 <slot> 标签,当组件渲染时,<slot></slot> 将会被替换为“写在组件标签结构中的内容”,如【例2】

【例2】

Vue.component('my-comp',{template:`<div> Life is a shit! <slot></slot>    </div>`
})

【结果】

【注】

  1. 插槽内可以包含任何模板代码,包括 HTML 和其他组件
  2. 如果组件没有包含 <slot> 元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃

2.编译作用域

因为父级模板里的所有内容都是在父级作用域中编译的,子模版里的所有内容都是在子作用域中编译的,所以插槽不能访问其所在组件的作用域,而是模板的作用域,如【例3】

【例3】

<my-comp>Hi {{ userName }}, Have a happy Life!</my-comp>
//组件
Vue.component('my-comp',{template:`<div><slot></slot>    </div>`,data(){return {userName: 'Jony'}}
})
//vue实例
const vm = new Vue({el:'#app',data:{userName:'Jim'}
})

【结果】

3.默认插槽

默认插槽即,若在组件引用时,没有像其传递内容,则使用默认插槽的内容(也称为后备内容);若在引用时,传递了内容,则渲染传递的内容,如【例4】

【例4】

组件

Vue.component('my-button',{template:`<button type="submit"><slot>Submit</slot>    </button>`
})

未传递内容

<my-button></my-button>

【结果】

传递内容

<my-button>Hit me</my-button>

【结果】

4.具名插槽

(1)具名插槽使用

若在一个组件中需要使用多个插槽,则要使用具名插槽来区分,其使用方式为:在组件中的 <slot> 元素上使用一个特殊的特性 name,利用这个特性可以定义额外的插槽;在引用组件时,需要在 <template>  元素上使用 v-slot 指令,v-slot 的参数即是特性 name,如【例5】

【注】一个不带name的 <slot> 会带有隐含的名字“default”。

【例5】

//组件
Vue.component('my-cmp',{template:`<div class="container"><header><slot name='header'></slot></header><main><slot name='main'></slot></main><footer><slot name='footer'></slot></footer><slot></slot></div>`
})
<!-- 组件引用 -->
<my-cmp><template v-slot:header><div>header</div></template><template v-slot:main><div>main</div></template><template v-slot:footer><div>footer</div></template><template v-slot:default><div>default</div></template>
</my-cmp>

【结果】

【注】v-slot 只能添加在 <template> 上,只有一种情况特殊(介绍如下)

(2)具名插槽的缩写

<my-cmp><template #header>header</template><template #default>default</template> <template #main>main</template> <template #footer>footer</template>
</my-cmp>

【注】该缩写只有在其有参数时可以使用

5.作用域插槽

为了能够让插槽内容访问子组件的数据,可以将子组件的数据作为绑定在 <slot> 元素的一个特性(插槽 prop),则在父级作用域中,可以给v-slot带一个值来定义所提供的插槽 prop 名字,如【例6】

【例6】

//组件
Vue.component('my-comp1',{data(){return {user:{name:'桃花扇J',age:18}}},template:`<div><slot v-bind:user="user"></slot>    </div>`
})
<my-comp1><template v-slot:default="slotProps">{{ slotProps.user.name }}</template>
</my-comp1>

 【结果】

(1)独占默认插槽的缩写语法

当被提供的内容只有默认插槽时,组件的标签可以被当作插槽的模板来使用,此时,可以将 v-slot 直接用在组件上,且可以缩写为以下形式:

<my-comp1 v-slot="slotProps">{{ slotProps.user.name }}
</my-comp1>

【注】默认插槽的缩写语法不能和具名插槽混用,会导致作用域不明确,即只要出现多个插槽,就需要为所有的插槽使用完整的基于 <template> 的语法

(2)解构插槽 Prop

使用结构传入具体的插槽prop会使模板更简洁

<my-comp1 v-slot="{ user }">{{ user.name }}
</my-comp1>

根据解构的语法,还可以给 prop 重命名

<my-comp1 v-slot="{ user:person }">{{ person.name }}
</my-comp1>

vue_组件插槽详述相关推荐

  1. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)

    (一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...

  2. 组件间数据交互——组件插槽的作用||具名插槽用法|| 作用域插槽

    组件插槽的作用 组件插槽:父组件向子组件传递内容 <!DOCTYPE html> <html lang="en"> <head><meta ...

  3. Uniapp学习笔记(数据展示、数据循环、条件编译、计算属性、组件的使用、组件插槽、生命周期)

    1.项目准备 1.1开发方式 uni-app为我们提供2种开发方式: 使用DCloud公司提供HBuilderX工具来快速开发: 使用脚手架来快速开发(我们这次项目使用此方式): 1.2脚手架搭建项目 ...

  4. Vue动态组件、组件缓存、组件激活和非激活、组件插槽、组件name

    一.动态组件 如何切换2个组件 互斥的显示或者隐藏呢 除了v-if 什么是动态组件? 多个组件使用同一个挂载点,并动态切换.这就是动态组件 完成一个注册功能页面, 2个按钮切换, 一个填写注册信息, ...

  5. 【Vue】Vue全家桶(三)Vue组件通信+Vue组件插槽+动画与过渡+使用vue-cli解决Ajax跨域问题

    1 Vue组件通信 1.1 组件间通信基本原则 不要在子组件中直接修改父组件的状态数据 数据在哪, 更新数据的行为(函数)就应该定义在哪 1.2 vue 组件间通信方式 props vue 的自定义事 ...

  6. angular学习总结-组件插槽

    组件插槽 - Angular官网上叫内容投影,Vue也有一样的功能实现--插槽slot.他俩是同一种概念,目的是用来创建更加灵活的且可复用组件. 内容投影是一种模式,你可以在其中插入或投影要在另一个组 ...

  7. 组件插槽的使用(组件进阶)

    vue中的插槽: 组件通过插槽传入自定义结构 用于实现组件的内容分发, 通过 slot 标签, 可以接收到写在组件标签内的内容 vue提供组件插槽能力, 允许开发者在封装组件时,把不确定的部分定义为插 ...

  8. 组件插槽和自定义属性

    组件插槽 文章目录 组件插槽 基础使用--匿名插槽 默认内容 具名插槽 作用域插槽 使用场景 自定义指令 局部注册和使用 全局注册和使用 自定义指令-传值 用来实现组件内容的分发,通过slot标签,可 ...

  9. 小程序-自定义组件-插槽

    自定义组件-插槽 1.什么是插槽 在自定义组件的wxml结构中,可以提供一个<slot>节点(插槽),用于承载组件使用者提供的wxml结构. 2.单个插槽 在小程序中,默认每个自定义组件中 ...

最新文章

  1. java拉姆达表达式事例,Java Lambda表达式详解和实例
  2. 最全面详细讲解Oracle入门
  3. OpenKruise v0.10.0 版本发布:新增应用弹性拓扑管理、应用防护等能力
  4. 用于在Synology NAS上测试Spring Boot Web应用程序的JUnit模拟文件
  5. 小程序 获取当前用户城市信息(省市区)
  6. RedHat Linux 7.3基础环境搭建
  7. 如何将多个一维列表转化为二维列表_数据分析2_如何处理一维、二维数据
  8. JS基础--Date.parse(),Date.UTC()和Date.now()
  9. IDEA 使用generator逆向工程生成pojo,mapper
  10. 这是云代驾,不是打游戏
  11. 关于局部变量的几个难点
  12. 解决VuePHP跨域请求
  13. DAX计算月末一次加权平均出库金额
  14. 阿里、美团、Oracle等大厂的Java虚拟机面试题集锦
  15. 进阶无人驾驶—百度Apollo高精度地图
  16. 微信小程序圣诞帽_完成圣诞快乐Web应用程序界面
  17. 全国大学生GIS应用技能大赛(开发试题参考)
  18. Highcharts翻译系列三:exporting导出和打印选项
  19. 树莓派微信小程序服务器搭建,之四-呕血制作-Lettuce IOT框架-移远BC35G+树莓派+华为OC+SpringBoot后台+微信小程序...
  20. 处理器CPU概念及CPU多线程

热门文章

  1. 网狐棋牌(二) CQueueServiceEvent初步分析
  2. live555 源码分析:MediaSever
  3. 第30讲:如何爬app的数据
  4. 如何正确、高效地阅读源代码?
  5. Go 内存对齐的那些事儿
  6. 未来已来,音视频江湖再起波澜
  7. 一文看懂WebTransport
  8. 沉浸式视频技术应用与挑战
  9. CES 2021线上大会前瞻、Roblox 估值近300亿美元、联想将推出企业级 AR 眼镜等|Decode the Week...
  10. 音视频技术开发周刊 | 142