美文网首页
记一个vue插槽传递的小坑

记一个vue插槽传递的小坑

作者: fanxcv | 来源:发表于2021-09-30 20:34 被阅读0次

    背景

    之前一个项目中使用了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插槽传递的小坑

          本文链接:https://www.haomeiwen.com/subject/nxzenltx.html