Vue官方文档解读系列(三):slot作用域插槽

344 阅读2分钟

前言

本文主要根据官方文档中的 slot 作用域插槽一栏,阅读后加上自己的一些理解和例子的补充。因为在参阅Vue官方文档时,有一些内容作者没有加上例子配合解释(可能觉得太简单了),所以有些含糊不清,初学者不是很能理解,所以写了这个系列。在自己的理解上加上一些例子,希望能帮助你更好的理解。

应用场景

假设我们有这样一个全局组件:

Vue.component('current-user',{
  data:function(){
    return {
      user:{
        name:'张三',
        age:22
      }
    }
  },
  template:`
    <span>
    <slot>{{user.name}}</slot>
    </span>
   `
})

如果我们简单的调用没有任何额外的业务需求,这个自然就足够了,如下直接使用就会打印出在组件插槽中设置的备用内容 user.name :

<div id="demo">
  <current-user></current-user>
</div>

但是如果我们想在引用该组件时,改变它的备用内容,比如改成 user.age ,那么直接在调用时修改这样就可以?如下:

<div id="demo">
  <current-user>{{user.age}}</current-user>
</div>

先来看官方文档给的一条规则:

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

看完这条规则我们应该知道上面的那段代码当然不行,很显然会报错,因为在父级是无法直接访问到子组件里的变量 user 的。当然vue作者也想到了这一点,并给出了解决方法:作用域插槽。且看下文。

作用域插槽

实现这个方法需要两步:

  • 首先在子组件里把需要访问的变量绑定到插槽的一个属性上( v-bind )。如下先把 user 变量绑定给了 slotuser 属性。
Vue.component('current-user',{
  data:function(){
    return {
      user:{
        name:'张三',
        age:22
      }
    }
  },
  template:`
    <span>
    <slot :user="user">{{user.name}}</slot>
    </span>
   `
})
  • 在父级调用该组件时使用带值的 v-slot 来定义我们提供的插槽 prop 的名字,如下:
<div id="demo">
  <current-user v-slot="parentUser">{{parentUser.user.age}}</current-user>
</div>

至此我们就可以在父级作用域去访问组件内的变量了!