在Vue.js开发过程中,插槽的使用也是非常常见的,对于刚入门的新手来说对于这种概念性的知识的认识还是不是太清楚,那么本篇博文就来分享一下关于插槽的使用。
首先要知道插槽的使用场景,插槽一般是在子组件中使用的,其次插槽是为了把父组件中的子组件的数据展示正常的操作。通俗一点的来说,就是组件内部预留一个或者多个的插槽位置,可提供组件传对应的模板代码进去。插槽的使用,让开发者可以拓展组件,去更好的复用组件和对组件做定制化处理,可以让组件变得更加灵活。
Vue官方文档是这样解释插槽的:
Vue 实现了一套内容分发的 API,将 <slot> 元素作为承载分发内容的出口。父组件合成组件定义内容,然后子组件模板自定义设置<slot></slot>,当组件渲染的时候,<slot></slot> 将会被替换为父组件定义的内容。插槽内可以包含任何模板代码,包括 HTML,甚至其它的组件。(如果子组件的 template 中没有包含一个 <slot> 元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃。)
插槽的常用使用分为:匿名插槽和具名插槽、作用域插槽。
1、匿名插槽:就是没有署名的插槽,直接使用;
2、具名插槽:就是带有名字的插槽,如果需要在组件内部预留多个插槽,那就需要为插槽定义名字,指定插入的位置。
3、作用域插槽:就是为了解决父组件在向子组件插槽传递内容的时候存在访问子组件数据的问题,父组件传递的插槽内容是由于子组件编译的,插槽作用域由子组件决定,所以若需要动态修改插槽内容,就需子组件传递参数给父组件。
<slot> 元素有一个特殊的attribute:name属性。这个 attribute 可以用来定义额外的插槽。
具体的使用案例如下所示(这里以具名插槽使用来演示):
1、父组件:
<template> <div class="AddTask"> <CtrlPanel :split-line="true" class="bottom-sidebar" style="overflow: auto; height: 520px;"> <template v-slot:title> <span class="f16">{{ titleTag }}</span> <span class="f16 goBackList" @click="goBackList"> <i class="iconfont iconangle-left"></i>任务列表 </span> </template> </CtrlPanel> </div> </template> <script> import CtrlPanel from "@/components/CtrlPanel.vue"; export default { mixins: [baseMixin], components: { CtrlPanel }, }; </script> 2、子组件: <template> <dl class="ctrl-panel"> <slot name="title" v-if="hideTitle !== true" v-bind:class="classObject"></slot> <slot name="content"></slot> </dl> </template> <script> export default { name: "CtrlPanel", props: { splitLine: { type: Boolean, default: false }, hideTitle: { type: Boolean, default: false } }, computed: { classObject: function() { return { "split-line": true}; } }, }; </script>
本文分享自微信公众号 - iOS开发by三掌柜(sanzhanggui777),作者:三掌柜666
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2020-10-10
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句