你会用vue的插槽吗?

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

vue的插槽我之前虽然在项目中用过,但是由于其语法的多样性,导致我其实一直对它的使用方式似懂非懂,这段时间我就重新好好研究了下它的使用,所以就准备借这篇文章好好聊聊它,需要注意的是,本篇文章是基于vue2来展开的,废话不多说,开搞!

ppx2.jpg

什么是插槽

简单来说,插槽就是用于 分发组件标签内部的内容

对于插槽的支持,vue是比react做的更好的,因为react里只有通过 this.props.children 来访问插槽内容,而无法更精细化地去区分

vue对于插槽的支持可谓是非常强大了,下面就来看看是如何使用的

inte.jpg

插槽的使用

在我看来,vue里的插槽大致分为三类

  • 默认插槽
  • 具名插槽
  • 作用域插槽

下面依次讲解下它们

qidai.jpeg

默认插槽

当我们只是简单地将插槽内容嵌入标签时,里面的所有内容就归 默认插槽 管理,比如说下面的 Your Profile 文本,当然插槽内容可以是任何形式

parent:
    <navigation-link>
      Your Profile
    </navigation-link>


child:
    <a  
    class="nav-link"  
    >  
        <slot></slot>  
    </a>

具名插槽

默认插槽其实感觉就跟react的 this.props.children 类似,对插槽内容进行统一处理,没有做精细化区分

因此就诞生了具名插槽,它可以让我们手动地去控制不同插槽内容的去处,从而能精细化处理,它主要借助如下两点实现的:

  • 在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称
  • <slot> 元素有一个特殊的 attribute:name,这个 attribute 可以用来定义额外的插槽

具体使用如下

parent:
    <base-layout>  
        <template v-slot:header>  
            <h1>Here might be a page title</h1>  
        </template>  

        <p>A paragraph for the main content.</p>  
        <p>And another one.</p>  

        <template v-slot:footer>  
            <p>Here's some contact info</p>  
        </template>  
    </base-layout>

child:
    <div class="container">  
        <header>  
            <slot name="header"></slot>  
        </header>  
        <main>  
            <slot></slot>  
        </main>  
        <footer>  
            <slot name="footer"></slot>  
        </footer>  
    </div>

作用域插槽

默认情况下,插槽内部访问的值是 父组件的,如果我们想让插槽访问 子组件 的值,那么就需要用上 作用域插槽,使用它需要两个步骤

  • slot 标签传递 props
  • 通过 v-slot命令的值 来获取传递的props

具体用法如下

parent:
    <current-user>  
        <template v-slot:default="slotProps">  
            {{ slotProps.user.firstName }}  
        </template>  
    </current-user>
    
child:
    <span>  
        <slot v-bind:user="user">  
            {{ user.lastName }}  
        </slot>  
    </span>

结语

vue提供的插槽功能比react强大太多了,但需要我们记忆的东西也就更多了,所以不断学习的自驱力对于我们非常重要,一起加油吧!