使用slot-scope复制vue中slot内容

电玩女神 2023-06-04 12:59 95阅读 0赞

有时候我们的vue组件需要复制使用者传递的内容。

比如我们工程里面的轮播组件需要使用复制的slot来达到循环滚动的效果

使用者关注轮播内容的静态效果,组件负责让其滚动起来

  1. 组件:
  2. <div class="horse-lamp">
  3. <div class="lamp">
  4. <slot name="lamps"></slot>
  5. </div>
  6. <div class="lamp">
  7. <slot name="lamps"></slot>
  8. </div>
  9. </div>
  10. 使用者:
  11. <CarouselWidget>
  12. <div slot="lamps">123</div>
  13. </CarouselWidget>

这种实现方式对于初始化的数据是没问题的,但是不支持slot内容的动态绑定,这是因为

  • vnode在vue中是唯一的
  • 一个vnode只会和一个dom节点绑定

因此当组件使用者在声明节点时,因为只声明了一个div,后台只生成了1个vnode,最终虽然产生了2个div,但是vnode只和后面1个dom绑定了,当vnode修改时也只会修改1个dom

解法:slot-scope
使用slot-scope数据产生的每个slot都会产生一个新的vnode

  1. 组件:
  2. <div class="horse-lamp">
  3. <div class="lamp">
  4. <slot name="lamps" :arr="arr"></slot>
  5. </div>
  6. <div class="lamp">
  7. <slot name="lamps" :arr="arr"></slot>
  8. </div>
  9. </div>
  10. 使用者:
  11. <CarouselWidget :arr="info.column">
  12. <template scope="slotProps" slot="lamps">
  13. <component v-for="(item, index) in slotProps.arr"
  14. :key="info.id"
  15. :is="templates[item.type]"
  16. :item="item"
  17. ></component>
  18. </template>
  19. </CarouselWidget>

这种情况下component内容有改动,那么组件内容2个slot都会同步更新

项目使用的vue版本是2.4.2,更高级的vue的slot-scope语法可能不太一样

原文地址:https://segmentfault.com/a/1190000016747615

更多专业前端知识,请上 【猿2048】www.mk2048.com

发表评论

表情:
评论列表 (有 0 条评论,95人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue项目slot使用

    vue中的插槽————slot 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和

    相关 Vue_使用插槽(slot

    当父组件向子组件传值的时候,有时候,父组件传的并不是单纯的数值、字符串,有可能是带标签(DOM)的数据,那么如何传值呢? 如果我们像正常父向子传值那样操作。 <sl

    相关 vue.js-使用slot插槽分发内容

    最初在 <slot> 标签中的任何内容都被视为备用内容。备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容。 一、单个插槽 子