vue中的slot与slot-scope
参考网站https://cn.vuejs.org/v2/guide/components-slots.htmlhttps://www.cnblogs.com/waitforyou/p/6773978.html非插槽模板指的是html模板指的是‘div、span、ul、table’这些,非插槽模板的显示与隐藏以及怎样显示由插件自身控制插槽模板指的是slot,它是一个空壳子,......
参考网站
vue 使用Slot 分发内容 学习总结。 - 铅笔画不出的黑白 - 博客园
非插槽模板指的是html模板
指的是‘div、span、ul、table’这些,非插槽模板的显示与隐藏以及怎样显示由插件自身控制
插槽模板
指的是slot,它是一个空壳子,因为它显示与隐藏以及最后用什么样的html模板显示由父组件控制。但是插槽显示的位置确由子组件自身决定,slot写在组件template的哪块,父组件传过来的模板将来就显示在哪块。
使用场景
当组件中某一项需要单独定义,那么就应该使用solt(组件解决特殊单独的业务逻辑的时候使用slot)。 举例说明。例如项目中需要一个模态框提示 付款成功,付款失败。那么这个模态框也就仅仅差这几个字或者是状态图片而已。那么此时应用solt就是一个非常不错的选择。
如果没有 <slot>
插口,则父组件标签内的的内容将会被丢弃。
单个插槽(匿名插槽。不用设置name属性。)
当子组件模板只有一个没有属性的 slot 时,父组件整个内容片段将插入到 slot 所在的 DOM 位置,并替换掉 slot 标签本身。
备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容。
父组件:
<template>
<div class="father">
<h3>这里是父组件</h3>
<child>
<div class="tmpl">
<span>菜单1</span>
<span>菜单2</span>
<span>菜单3</span>
</div>
</child>
</div>
</template>
子组件:
<template>
<div class="child">
<h3>这里是子组件</h3>
<slot>备用</slot> // ‘备用’为备用内容,当没有东西传入时,展现
</div>
</template>
结果为
<template>
<div class="father">
<h3>这里是父组件</h3>
<div class="child">
<h3>这里是子组件</h3>
<div class="tmpl">
<span>菜单1</span>
<span>菜单2</span>
<span>菜单3</span>
</div>
</div>
</div>
</template>
具名插槽
父组件:
<template>
<div class="father">
<h3>这里是父组件</h3>
<child>
<div class="tmpl" slot="up">
<span>菜单1</span>
<span>菜单2</span>
<span>菜单3</span>
</div>
<div class="tmpl" slot="down">
<span>菜单-1</span>
<span>菜单-2</span>
<span>菜单-3</span>
</div>
<div class="tmpl">
<span>菜单->1</span>
<span>菜单->2</span>
</child>
</div>
</template>
子组件:
<template>
<div class="child">
// 具名插槽
<slot name="up"></slot>
<h3>这里是子组件</h3>
// 具名插槽
<slot name="down"></slot>
// 匿名插槽
<slot></slot>
</div>
</template>
结果为:
<template>
<div class="father">
<h3>这里是父组件</h3>
<div class="child">
<div class="tmpl">
<span>菜单1</span>
<span>菜单2</span>
<span>菜单3</span>
</div>
<h3>这里是子组件</h3>
<div class="tmpl">
<span>菜单-1</span>
<span>菜单-2</span>
<span>菜单-3</span>
</div>
<div class="tmpl">
<span>菜单->1</span>
<span>菜单->2</span>
</div>
</div>
</div>
</template>
作用域插槽 (slot待数据)
有时让插槽内容能够访问子组件中才有的数据是很有用的,例如我们想让它的后备内容显示用户的名,以取代正常情况下用户的姓,如下:
<current-user>
{{ user.firstName }}
</current-user>
然而上述代码不会正常工作,因为只有 <current-user>
组件可以访问到 user
而我们提供的内容是在父级渲染的(子组件访问不到)。
为了让 user
在父级的插槽内容可用,我们可以将 user
作为一个 <slot>
元素的特性绑定上去:
<span>
<slot v-bind:user="user"> // 将 `user` 对象作为一个插槽的 prop 传入
{{ user.lastName }}
</slot>
</span>
绑定在 <slot>
元素上的特性被称为插槽 prop。现在在父级作用域中,我们可以给 v-slot
带一个值来定义我们提供的插槽 prop 的名字:
<current-user>
<template v-slot:default="slotProps">
// 设置slot作用于并且命名为slotProps
// v-slot就相当于是一个对象,这个对象里面的数据就是子组件插槽绑定传上来了。
{{ slotProps.user.firstName }}
</template>
</current-user>
在这个例子中,我们选择将包含所有插槽 prop 的对象命名为 slotProps
,但你也可以使用任意你喜欢的名字。
我们可以清晰的看到,在子组件中有个插槽slot通过v-bind绑定了一个值item,在父组件中引用了子组件child,child标签里面可以看到作用域插槽template,此时v-slot
就是一个对象,这个对象是由子组件的插槽slot所绑定的值所组成的一个对象
总结:可以绑定数据的插槽,显示内容完全由子组件决定,数据来自子组件。
注意
v-slot
指令自 Vue 2.6.0 起被引入,提供更好的支持 slot
和 slot-scope
特性的 API 替代方案。v-slot
完整的由来参见这份 RFC。在接下来所有的 2.x 版本中 slot
和 slot-scope
特性仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。
单个插槽和具名插槽:不绑定数据,所以父组件是提供的模板要既包括样式由包括内容的,上面的例子中,你看到的文字,“菜单1”,“菜单2”都是父组件自己提供的内容;
作用域插槽:父组件只需要提供一套样式(在确实用作用域插槽绑定的数据的前提下)。
动态插槽名
<base-layout>
<template v-slot:[dynamicSlotName]>
...
</template>
</base-layout>
更多推荐
所有评论(0)