slot 与 v-slot 具名插槽的使用

272 阅读2分钟

当一个组件内部需要传入2处及以上外部标签的情况下 , 需要使用插槽来解决.

格式为:
<slot></solt>
<slot name='abc'></solt>
当有多个居民插槽 , 而slot标签内部不添加name属性时 , 引入默认为第一个插槽的内容 .

父组件用<template> </template>的内容去填挖出的坑 , 类似于父传子 .

使用的<template name="abc"> </template>指定对应插槽中的内容 .

//将父组件的内容插到子组件中

App.vue 父组件

  <template>
    <div>
      <template v-slot:abc>   //2.用<template>设定内容 , 用v-slot指定需要插入的槽(abc)
        <div>                
          <span>t</span>      //3.组件中<template>使用没有次数限制,<template>里面还可以继续加<template>
          <span>w</span>      //4.传进插槽的值可以是一个标签,图片,也可以是一个大盒子,第内容没有太多限制.
          <span>o</span>      
        </div>
      </template>
    </div>
  </template>
      

      
MyCom 子组件
     <template>
       <div>
         <slot name="abc">具名的插槽,two,默认内容</slot>  // 1.在子组件挖个槽,指名 abc
       </div>          //5.内容展示,可以在父组件中多写几个template,分别对应插槽,可以达到页面盒子切换效果
     </template>       //子组件可以挖不限制次数的槽,需要指定名称,否则默认添加父组件第一个<template>内容

父组件使用 v-slot 可以简化成 # ,效果是一样的 , 相同类型的有 v-bind 简写为 : , v-on 简写为 @ ,如.

  <template v-slot:abc>
    <div>
    </div>
  </template>
  
  简写为
  <template #abc>
    <div>
    </div>
  </template>

作用域插槽

依旧是父组件向子组件传递数据 , 但父组件多了返回值属性 . 并可以将值处理后重新插入子组件的槽中 .

//将父组件的内容插到子组件中

App.vue 父组件

  <template>
    <div>
      <template v-slot:abc="scope">   //2.<template>用v-slot填坑,scope用来接收子组件中的自定义属性 
        <div>                         //scope接收的值为对象{a:1,b:2,c:3}            
          <span>{{scope.a}}</span>    //内容分别是1,2,3,这些重新插入了子组件的槽中,如此形成了闭环值传递
          <span>{{scope.b}}</span>     
          <span>{{scope.c}}</span>      
        </div>
      </template>
    </div>
  </template>
      

      
MyCom 子组件
     <template>
       <div>
         <slot name="abc" :a='1' :b='2' c='3'></slot>  // 1.挖槽,设置自定义内容
       </div>         
     </template>       //子组件可以挖不限制次数的槽,需要指定名称,否则默认添加父组件第一个<template>内容

以上就是插槽的基本使用功能 , 相比于子传父 父传子更加灵活 , 特别是对新增了需求又不想改变原有状态 , 插槽是个不错的选择