slot 插槽的使用总结

什么是插槽?

vue.js官方文档上介绍:将 slot元素作为承载分发内容的出口。
也就是说,当子组件有一部分内容是根据父组件传递过来的dom进行显示时,可用slot。

三种不同的插槽使用:
1.插槽内容

//子组件child
vue.component('child',{
template:'<div>
            <p>hello</p>
            <slot>**(可在此定义默认内容)**</slot>
         </div>'
    })

//父组件
<div>
    <child>
        <p>world</p>//插入slot的内容
    </child>
</div>

结果显示如下。若是子组件中没有slot,则传入它的任何内容都会被抛弃

hello
world

2.具名插槽
有时候,我们需要多个插槽,于是有了具名插槽,让插槽位置与插入的内容一 一对应

//父组件
<body-container>
  <div slot='header'>
    <!-- 我们希望把页头放这里 -->
  </div>
  <div slot='footer'> 
    <!-- 我们希望把页脚放这里 -->
  </div>
</body-container>

//子组件
<div>
    <slot name='header'></slot>
    <div>context</div>
    <slot name='footer'></slot>
</div>

3.作用域插槽

有的时候你希望提供的组件带有一个可从子组件获取数据可复用的插槽
作用域插槽的关键之处就在于,父组件能接收来自子组件的slot传递过来的参数
在下面这个例子中,子组件是个信息列表模块,item在不同的父组件中获取的state不同,可以使用作用域组件实现

//子组件
<div class="box" v-for="item of list" :key="item.id">
      <div class="box-title">
        <p>
          <span>{{item.deNo}}</span>
          <!--我们为每个item准备了一个插槽,将item对象作为一个插槽的prop传入-->
            <slot class="genre" v-bind:item="item"></slot>
        </p>
        <p>{{item.deDate}}</p>
      </div>
    </div>
//父组件
<div>
    <!--1.作用域插槽必须是template开头和结尾的内容-->
    <!--2.slot-scope="props"声明从子组件传递的数据都放在props里-->
    <!--3.加上v-if="props.item!=undefined"判断,防止取不到item的属性-->
    <template slot-scope="props" v-if="props.item!=undefined">
        <!--告诉子组件模板的信息是以<span>标签的形式-->
                <span class="genre">{{props.item.state}}</span>
    </template>
</div>

Logo

前往低代码交流专区

更多推荐