Vue组件化插槽详解

189 阅读2分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

一、插槽

插槽的意义是把Vue实现的部分内容分发给API,多用于复合组件开发,经常在elementui这样的第三方框架中体现,有时候例如表格不能完全复合我们的开发设计需求,就需要使用插槽来实现。

匿名插槽

就是默认插槽,这个插槽没有命名,用法就是在组件内部定义slot占位符,然后在使用组件的时候把需要展示的内容传入进去,最后在真正渲染的时候会把传入的内容替换slot占位符。

//Button组件
<div>
    <slot></slot>
</div>
//父组件
<Button>hello</Button>

具名插槽

简单来说就是给插槽定义一个名字,并且slot对应的内容都会和组件中的name对应,会把具体内容分发到子组件的指定位置。

例如一个组件中有很多个插槽,每一个插槽都必须要对应一个外部传入的内容,这时就需要用name进行插槽的定义和区分,如果使用没有定义的插槽传入的时候需要使用v-solt:default表示匿名插槽,有名字的插槽就使用参数传入v-slot:name

//Button组件
<div>
 	<slot></slot>
 	<slot name="content"></slot>
</div>
//父组件
<Button>
	<!-- 默认插槽⽤default做参数 -->
	<template v-slot:default>具名插槽</template>
	<!-- 具名插槽⽤插槽名做参数 -->
	<template v-slot:content>内容...</template>
</Button>

作用域插槽

在组件上的属性,分发内容到子组件中的数据,可以在组件元素内使用,也就是在使用插槽的时候传入一个值,而这个值是指定名称插槽上的所有的属性对象命名slotProps,来访问传进来的值,把子组件的值拿出来在父组件作用域中使用。

//Button组件
<div>
 	<slot :foo="foo"></slot>
</div>
//父组件
<Button>
 	<!-- 把v-slot的值指定为作⽤域上下⽂对象 -->
 	<template v-slot:default="slotProps">
 		<div>来⾃⼦组件数据:{{slotProps.foo}}</div>
 	</template>
</Button>

二、举个栗子(冬天的板栗真好吃~)

<el-tree :data="treeData" @node-click="handleNodeClick" icon-class='el-icon-plus'>    <div class="custom-tree-node flex" slot-scope="{ node,data }">        <div class="treeLabel">{{ node.label }}</div>        <div class="treeNum" v-if="data.idx == 1">(<span class="red">{{data.children.length}}</span>)</div>    </div></el-tree>

这是elementui中树形菜单组件,第一级后面有展示子节点的数量,如果完全用框架中的例子就无法实现,所以我们在el-tree下加div实现具体内容,并且加了slot-scope带入参数。

好啦今天过生日,不加班,祝自己生日快乐,哈哈~