乐趣区

关于vue.js:vue插槽slot详解

最近被问起是否理解 vue 的插槽(slot),咋一想发现,仿佛很少用到这玩意。所以整顿了下 slot 的一些用法。

slot (父组件 在子组件 <slot> </slot> 处插入内容)
Vue 实现了一套内容散发的 API,将 <slot> 元素作为承载散发内容的进口,这是 vue 文档上的阐明。具体来说,slot 就是能够让你在组件内增加内容的‘空间’。举个例子:

// 子组件:(假如名为:ebutton)

<template>
  <div class= 'button'>
      <button>  </button>
  </div>
</template>

// 父组件:(援用子组件 ebutton)<template>
  <div class= 'app'>
     <ebutton> </ebutton>
  </div>
</template>

咱们晓得,如果间接想要在父组件中的 <ebutton></ebutton> 中增加内容,是不会在页面上渲染的。那么咱们如何使增加的内容可能显示呢?在子组件内增加 slot 即可。

// 子组件:(假如名为:ebutton)
<template>
  <div class= 'button'>
      <button></button>
      <slot></slot>       //slot 能够放在任意地位。(这个地位就是父组件增加内容的显示地位)</div> 
</template>

子组件能够在任意地位增加 slot , 这个地位就是父组件增加内容的显示地位。

编译作用域(父组件 在子组件 <slot> </slot> 处插入 data)
下面咱们理解了,slot 其实就是可能让咱们在父组件中增加内容到子组件的‘空间’。咱们能够增加父组件内任意的 data 值,比方这样:

// 父组件:(援用子组件 ebutton)<template>
  <div class= 'app'>
     <ebutton> {{parent}}</ebutton>
  </div>
</template>

new Vue({
  el:'.app',
  data:{parent:'父组件'}
})

应用数据的语法齐全没有变,然而,咱们是否间接应用子组件内的数据呢?显然不行!!

// 子组件:(假如名为:ebutton)
<template>
  <div class= 'button'>
      <button> </button>
       <slot></slot>
  </div>
</template>

new Vue({
  el:'.button',
  data:{child:'子组件'}
})

// 父组件:(援用子组件 ebutton)<template>
  <div class= 'app'>
     <ebutton> {{child}}</ebutton>
  </div>
</template>

间接传入子组件内的数据是不能够的。因为:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

后备内容 (子组件 <slot> </slot> 设置默认值)
所谓的后背内容,其实就是 slot 的默认值,有时我没有在父组件内增加内容,那么 slot 就会显示默认值,如:

// 子组件:(假如名为:ebutton)
<template>
  <div class= 'button'>
      <button>  </button>
      <slot> 这就是默认值 </slot>
  </div>
</template>

具名插槽(子组件 多个 <slot ></slot> <slot></slot> 对应插入内容)
有时候,兴许子组件内的 slot 不止一个,那么咱们如何在父组件中,准确的在想要的地位,插入对应的内容呢?给插槽命一个名即可,即增加 name 属性。

// 子组件:(假如名为:ebutton)
<template>
  <div class= 'button'>
      <button>  </button>
      <slot name= 'one'> 这就是默认值 1 </slot>
      <slot name='two'> 这就是默认值 2 </slot>
      <slot name='three'> 这就是默认值 3 </slot>
  </div>
</template>
父组件通过 v -slot : name 的形式增加内容:// 父组件:(援用子组件 ebutton)<template>
  <div class= 'app'>
     <ebutton> 
        <template v-slot:one> 这是插入到 one 插槽的内容 </template>
        <template v-slot:two> 这是插入到 two 插槽的内容 </template>
        <template v-slot:three> 这是插入到 three 插槽的内容 </template>
     </ebutton>
  </div>
</template>

当然 vue 为了不便,书写 v-slot:one 的模式时,能够简写为 #one

作用域插槽 (父组件 在子组件 <slot> </slot> 处应用子组件 data)
通过 slot 咱们能够在父组件为子组件增加内容,通过给 slot 命名的形式,咱们能够增加不止一个地位的内容。然而咱们增加的数据都是父组件内的。下面咱们说过不能间接应用子组件内的数据,然而咱们是否有其余的办法,让咱们可能应用子组件的数据呢?其实咱们也能够应用 v -slot 的形式:

// 子组件:(假如名为:ebutton)
<template>
  <div class= 'button'>
      <button>  </button>
      <slot name= 'one' :value1='child1'> 这就是默认值 1 </slot>    // 绑定 child1 的数据
      <slot :value2='child2'> 这就是默认值 2 </slot>  // 绑定 child2 的数据,这里我没有命名 slot
  </div>           
</template>

new Vue({
  el:'.button',
  data:{
    child1:'数据 1',
    child2:'数据 2'
  }
})

// 父组件:(援用子组件 ebutton)<template>
  <div class= 'app'>
     <ebutton> 

        // 通过 v -slot 的语法 将插槽 one 的值赋值给 slotonevalue 
        <template v-slot:one = 'slotonevalue'>  
           {{slotonevalue.value1}}
        </template>

        // 同上,因为子组件没有给 slot 命名,默认值就为 default
        <template v-slot:default = 'slottwovalue'> 
           {{slottwovalue.value2}}
        </template>

     </ebutton>
  </div>
</template>

总结来说就是:

首先在子组件的 slot 上动静绑定一个值 (:key=’value’)
而后在父组件通过 v -slot : name =‘values’的形式将这个值赋值给 values
最初通过 {{values.key}} 的形式获取数据

退出移动版