记一个vue插槽传递的小坑

背景

之前一个项目中使用了vant ui组件,自己写了一个component扩展vant的navBar,为vant navBar的三个具名插槽提供一些默认实现,大致代码如下:

<template>
  <van-nav-bar :border="border">
    <template slot="title">
      <slot name="left">title</slot>
    </template>
    <template slot="left">
      <slot name="left">left</slot>
    </template>
    <template slot="right">
      <slot name="right">right</slot>
    </template>
  </van-nav-bar>
</template>

vant有三个具名插槽,分别是title,left和right,封装的component也提供三个同名的插槽,用于传递插槽实现,但是当使用该component的组件不提供插槽实现时,需要为vant的插槽提供一个默认实现。
上面的代码之前运行是OK的,也能实现对应的功能,但是不知道为什么,最近做bug fix时,发现其无法正常工作了,默认实现无法渲染,怀疑是vant版本变更导致的,但是还原到历史版本还是一样的表现,最后只能另想办法解决。

解决

先理解下诉求,就是在引用组件提供了插槽实现时显示实现,未提供时使用默认实现,那就判断一下是否有传入插槽实现就好了呀,根据判断结果执行不同的逻辑。刚好,vue2.6.0之后也提供了插槽实现对象$slots,修改后的代码如下

<template>
  <van-nav-bar :border="border">
    <template slot="title">
      <slot v-if="$slots.title" name="title"/>
      <template v-else>title</template>
    </template>
    <template slot="left">
      <slot v-if="$slots.left" name="left" style="pointer-events:none;"/>
      <template v-else>left</template>
    </template>
    <template slot="right">
      <slot v-if="$slots.right" name="right"/>
      <template v-else>right</template>
    </template>
  </van-nav-bar>
</template>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • vue插槽slot 一、前言 vue官方文档中在"组件基础"内容中提到组件可以通过插槽分发内容,那插槽是怎么使用的...
    追寻1989阅读 3,567评论 0 2
  • 前言 本文是阅读vue文档时的收获和心得,与vue文档大部分不符,阅读vue文档请移步Vue.js 创建一个 Vu...
    极奏阅读 3,788评论 0 1
  • Test Vue.js Slots in Jest 测试Vue.js中的Slots插槽 Learn how to ...
    Revontulet阅读 8,078评论 0 1
  • 【2019-3-4更新】Vue 2.6+修改了部分语法,对插槽的使用有了较多的更新。在本文中笔者在相应位置给出了更...
    果汁凉茶丶阅读 13,478评论 2 36
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,273评论 0 4