vue插槽,分分钟理解

1、默认插槽,父组件调用子组件得时候,没有传值,默认显示插槽里面得值。如果父组件传值了,那就显示父组件得内容

父组件:
<template>
    <div>
      <span class="bold">默认插槽:子组件标签里没写东西,默认显示</span>
      <slotCom></slotCom>
      <slotCom>不默认 &nbsp;&nbsp;&nbsp;</slotCom>
    </div>
</template>

子组件:
<template>
  <div>
      <slot>默认</slot>
  </div>
</template>

渲染结果

2、具名插槽:具体修改某一个插槽的内容

具名插槽可以用#代替v-slot

父组件:
<template>
    <div>
      <span class="bold">具名插槽:具体修改某一项</span>
      <slotCom>
        <template v-slot:header>header</template>
      </slotCom>
       =
      <slotCom>
        <template #header>header</template>
      </slotCom>
    </div>
</template>

子组件:
<template>
  <div>
      <slot>默认</slot>
      <slot name="header">头部</slot>
  </div>
</template>

渲染结果:

3、作用域插槽:父组件显示子组件的值

子组件用v-bind传给出去,父组件用v-slot接收

如果子组件只v-bind一个值,父组件就用v-slot:default="啥啥啥"或者直接v-slot="啥啥啥" ,如下所示:

父组件:
<template>
    <div>
      <span class="bold">作用域插槽:父组件显示子组件的值,并且子组件只传一个值</span>
      <slotCom>
        <template v-slot:default="slotProps">{{slotProps.userData.firstName}} &nbsp;&nbsp;&nbsp;</template>
      </slotCom>
      = 
      <slotCom>
        <template v-slot="slotProps">{{slotProps.userData.firstName}} &nbsp;&nbsp;&nbsp;</template>
      </slotCom>
    </div>
</template>

子组件:
<template>
  <div>
      <slot v-bind:userData="user">
        {{ user.firstName}}
      </slot>
  </div>
</template>

<script>

export default {
  data(){
    return {
        user:{
          firstName: 'gerace',
          lastName: 'haLi',
        },
        hobby:{
          fruit: "apple",
          color: "blue"
        }
    }
  }
}
</script>

如果子组件传多个值:

父组件:
<template>
    <div>
      <span class="bold">作用域插槽:父组件显示子组件的值,并且子组件只传多个值</span>
普通方式:
      <slotCom>
        <template v-slot:header="slotProps">
          {{ slotProps.userData.firstName }}-{{slotProps.hobbyDataa.fruit}}
        </template>
        <template v-slot:footer="slotProps">
          {{ slotProps.hobbyData.fruit }}
        </template>
      </slotCom>
      =
解构插槽prop:
      <slotCom>
        <template v-slot:header="{userData}">
          {{ userData.firstName }}
        </template>
        <template v-slot:footer="{hobbyData}">
          {{ hobbyData.fruit }}
        </template>
      </slotCom>
      =
作用域插槽,只有当解构插槽prop的时候,v-slot也可以用#代替
      <slotCom>
        <template #header="{userData}">
          {{ userData.firstName }}
        </template>
        <template #footer="{hobbyData}">
          {{ hobbyData.fruit }}
        </template>
      </slotCom>
    </div>
</template>

子组件:
<template>
  <div>
      <slot v-bind:userData="user" v-bind:hobbyDataa="hobby" name="header">
        {{ user.firstName }}
      </slot>
      <slot v-bind:hobbyData="hobby" name="footer">
        {{ hobby.fruit }}
      </slot>
  </div>
</template>

<script>

export default {
  data(){
    return {
        user:{
          firstName: 'gerace',
          lastName: 'haLi',
        },
        hobby:{
          fruit: "apple",
          color: "blue"
        }
    }
  }
}
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值