以下内容若有问题烦请即时告知我予以修改,以免误导更多人。
- es5源码
- es6源码
- 用法
- 单个slot
- 显示结果
- 进一步证实
- 显示结果
- 具名slot
- 显示结果
- 作用域slot
- 显示结果
- Tips
<slot>
元素作为组件模板之中的内容分发插槽。<slot>
元素自身将被替换。
es5源码
1 | function renderSlot ( |
es6源码
1 | export function renderSlot ( |
用法
当需要让组件组合使用,混合父组件的内容与子组件的模板时,就会用到slot , 这个过程叫作内容分发( transclusion )。
slot 分发的内容,作用域是在父组件上的。
props 传递数据、events 触发事件和slot 内容分发就构成了Vue 组件的3 个API 来源,再复杂的组件也是由这3 部分构成的。
单个slot
在子组件内使用特殊的<slot>元素就可以为这个子组件开启一个slot(插槽)。
在父组件模板里,插入在子组件标签内的所有内容将替代子组件的
<slot>
标签及它的内容。
1 | <div id="J_app1"> |
- 不使用slot
1 | Vue.component('first-child', { |
- 使用slot
1 | Vue.component('first-child', { |
显示结果
- 不使用slot
1 | <div id="J_app1"> |
- 使用slot
父组件有插入内容,所以子组件中的slot并没有展示。
1 | <div id="J_app1"> |
进一步证实
若父组件的插入内容为空,则默认展示子组件的额插槽内容
1 | <div id="J_app1"> |
1 | Vue.component('first-child', { |
=> 显示结果
1 | <div id="J_app1"> |
具名slot
- 给<slot> 元素指定一个name 后可以分发多个内容,具名Slot 可以与单个slot 共存。
1 | <div id="J_app2"> |
1 | Vue.component('second-child', { |
显示结果
如果子组件的slot指定了name,将展示对应的匹配内容。
如果子组件的slot没有name属性,将和单个slot一样展示逻辑,父组件没有slot属性的内容都将展示在子组件的slot中。
1 | <div class="container"> |
作用域slot
作用域插槽是一种特殊的slot ,使用一个可以复用的模板替换己渲染元素。
父组件使用
<template scope="props"></template>
元素,通过scope作用域传递变量props。
1 | <div id="J_app3"> |
1 | Vue.component('third-child', { |
显示结果
- slot元素上的属性可以通过
template
元素的scope
属性传递给指定含有临时变量的插槽。
1 | <div id="J_app3"> |
Tips
- slot不能通过
v-show
隐藏,只能通过v-if
,因为slot是一个类似template的抽象元素,而并非一个实际元素,不能通过display控制是否显示。
更多内容可以订阅本人微信公众号,一起开启前端小白进阶的世界!