vue中slot的用法

406 阅读2分钟

写在前面

slot插槽在vue的开发中是比较基础又比较常用的,使用插槽语法可以使语法变得更加简洁。

什么是slot插槽

说白了就是父组件想在子组件里插入内容,这个内容怎么放放在哪就是由slot插槽来负责分发的。

slot的使用

  • 普通用法->匿名插槽
<!-- 父组件-->
<template>
 <div id="parent">
   <children>
     <p>我是插槽内容</p>
   </children>
 </div>
</template>
<!--子组件 -->
<template>
 <div id="childern">
   <h2>我是子组件</h2>
   <span><slot></slot></span>
 </div>
</template>

运行结果

上述代码就是父组件传入内容对应的显示到子组件slot的插槽中,当然子组件的插槽中可以有自己的内容,当父组件没有传递值给子组件时,会默认显示子组件slot中的内容。也可以把子组件slot中的内容理解为默认值。

  • 具名插槽 如果想规定父组件插入内容的显示位置,就要用到具名插槽的name属性,给每一插槽定义一个专属的名字。
<!--父组件 -->
<template>
 <div id="parent">
   <children>
     <h1 slot="header">我是头部</h1>
     <h2 slot="content">我是内容</h2>
     <h3 slot="footer">我是底部</h3>
   </children>
 </div>
</template>
<!-- 子组件-->
<template>
 <div id="childern">
   <span><slot name="header"></slot></span>
   <span><slot name="content"></slot></span>
   <span><slot name="footer"></slot></span>
   <span><slot name="default">我是默认内容</slot></span>
 </div>
</template>

运行结果

上述代码我们看到父组件的内容通过name属性对应的插入到了子组件中,而没有接收到传递值得子组件slot插槽就直接显示了默认值。

  • 作用域插槽 简单来说,前两种插槽的内容和样式皆由父组件决定,也就是说显示什么内容和怎样显示都由父组件决定;但是第三种插槽就不同了,作用域插槽的样式由父组件决定,内容却由子组件控制。简单来说:前两种插槽不能绑定数据,作用域插槽是一个带绑定数据的插槽。
<!-- 父组件 -->
<template>
 <div id="parent">
   <children>
     <template slot="zhang" slot-scope="user">
       <!-- 需要使用 template 包裹 -->
       <div v-for="item in user" :key="item.name">
         <p>{{ item }}</p>
       </div>
     </template>
   </children>
 </div>
</template>
<!-- 子组件-->
<template>
 <div id="childern">
   <span><slot name="header" :user="user"></slot></span>
   <span><slot name="content"></slot></span>
   <span><slot name="footer"></slot></span>
   <span><slot name="default">我是默认内容</slot></span>
 </div>
</template>

运行结果