vue之slot应用

1,017 阅读2分钟

匿名插槽

插槽:slot

slot在组件模板中占好位置,当用到该组件的时候,组件里面的内容就会替换组件模板中slot位置

优点:让用户可以更好的扩展组件,更好的复用组件以及做一些定制化的处理。

插槽的使用

1. 匿名插槽

    //slot_container.vue
   <div class='slot_container'>
      <header>
          <slot></slot>
      </header>
  </div>
  //father.vue
   <slotContainer>
        <template v-slot>
           <span>这是首页</span>
        </template>
   </slotContainer>
   
   //  等价于
    <div class='slot_container'>
      <header>
          <span>这是首页</span>
      </header>
    </div>

匿名插槽在子组件中定义创建一个slot,父组件内template中的内容就可以嵌在子组件内显示出来。

2. 具名插槽

     //slot_container.vue
   <div class='slot_container'>
      <div>
          <slot name="header"></slot>
          <slot></slot>
          <slot name='footer'></slot>
      </div>
  </div>
  
  //father.vue
   <slotContainer>
        <template v-slot:header>
            <span>这是header</span>
        </template>
        <template v-slot>
            <span>这是main</span>
        </template>
        <template v-slot:footer>
            <span>这是footer</span>
        </template>
   </slotContainer>
   
   
    //  等价于
    <div class='slot_container'>
      <div>
          <span>这是header</span>
          <span>这是main</span>
          <span>这是footer</span>
      </div>
    </div>

具名插槽在子组件中定义创建一个slot并添加name属性,我们在父组件中就可以通过template上的指令v-slot找到对应名字的插槽,将内容放到对应的插槽中。

3. 作用域插槽

有时让插槽内容能够访问子组件中才有的数据是很有用的。

     //slot_container.vue
   <div class='slot_container'>
      <footer>
          <slot name='footer'  :footerMsg='footerMsg'></slot>
      </footer>
  </div>
  
  setup(props) {
    let footerMsg= ref('底部文字~')
    return {
        footerMsg
    }
  },
  
  //father.vue
   <slotContainer>
       //将插槽 prop 的对象命名为 `slotProps`
       <template v-slot:footer="slotScope">
           <span> {{ slotScope.footerMsg }} </span>
       </template>
   </slotContainer>
   
   
    //  等价于
    <div class='slot_container'>
        <span>底部文字~</span>
    </div>

如果子组件传过来的是对象,我们可以用解构来接收数据

    //v-slot:footer = "{msg}"  // 可以直接使用msg

或者进行重命名

    //v-slot:footer = "{msg: todo}"  // 可以直接使用todo

甚至是可以在传值propundefined时候,预先设置值,

    //v-slot:footer = "{msg='something'}"  //初始值为something

4. 具名插槽的缩写

v-slot 指令的缩写为 #

上面具名插槽的代码可以改成

     //slot_container.vue
   <div class='slot_container'>
      <div>
          <slot name="header"></slot>
          <slot></slot>
          <slot name='footer'></slot>
      </div>
  </div>
  
  //father.vue
   <slotContainer>
        //缩写为  `#`
        <template #header>
            <span>这是header</span>
        </template>
        <template v-slot>
            <span>这是main</span>
        </template>
        <template #footer>
            <span>这是footer</span>
        </template>
   </slotContainer>
   
   
    //  等价于
    <div class='slot_container'>
      <div>
          <span>这是header</span>
          <span>这是main</span>
          <span>这是footer</span>
      </div>
    </div>

当然了插槽也是可以进行动态赋值的

v-slot:[slotName]

这里的slotName是一个变量可以动态赋值,在不同的情况下赋值展示不同的插槽内容。

以上就是对插槽的理解。