首页 文章

带插槽的动态组件

提问于
浏览
2

如何在父组件中使用动态组件的命名槽?

滑块组件采用动态幻灯片组件数组:

<slider :slides="slides" />

每张幻灯片都有一个名为的插槽,其中包含滑块使用的内容:

<template>
<div class="slide">
  <div slot="main">Slide 1 Main</div>
  <div slot="meta">Slide 1 Meta</div>
</div>
</template>

滑块现在应该使用这些插槽,如下所示:

<template>
<div class="slider">
  <div class="slider__slide" v-for="slide in slides">
    <component :is="slide">
      <div class="slider__slide__main">
        <slot name="main" /><!-- show content from child's slot "main" -->
      </div>
      <div class="slider__slide__meta">
        <slot name="meta" /><!-- show content from child's slot "meta" -->
      </div>
    </component>
  </div>
</div>
</template>

但是 <component> 忽略了它的内部内容,因此忽略了插槽 .

例:
https://codepen.io/anon/pen/WZjENK?editors=1010

如果这是不可能的,还有另一种方法来创建一个从幻灯片组件中获取HTML内容而不关心其内容的滑块吗?

1 回答

  • 2

    通过将main / meta部分拆分为自己的组件,您可以相对轻松地使用渲染功能将它们分割成您想要的部分 .

    console.clear()
    
    const slide1Meta = {
      template:`<div>Slide 1 Meta</div>` 
    }
    const slide1Main = {
      template: `<div>Slide 1 Main</div>`
    }
    const slide2Meta = {
      template:`<div>Slide 2 Meta</div>` 
    }
    const slide2Main = {
      template: `<div>Slide 2 Main</div>`
    }
    
    Vue.component('slider', {
      props: {
        slides: {
          type: Array,
          required: true
        }    
      },
      render(h){
        let children = this.slides.map(slide => {
          let main = h('div', {class: "slider__slide__main"}, [h(slide.main)])
          let meta = h('div', {class: "slider_slide_meta"}, [h(slide.meta)])
          return h('div', {class: "slider__slide"}, [main, meta])
        })
        return h('div', {class: "slider"}, children)
      }
    });
    
    
    new Vue({
      el: '#app',
      data: {
        slides: [
          {meta: slide1Meta, main: slide1Main}, 
          {meta: slide1Meta, main: slide2Main}
        ]
      }
    });
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>
    <div id="app">
      <slider :slides="slides" />
    </div>
    
    <script type="text/x-template" id="slide1-template">
      <div class="slide">
        <div slot="main">Slide 1 Main</div>
        <div slot="meta">Slide 1 Meta</div>
      </div>
    </script>
    
    <script type="text/x-template" id="slide2-template">
      <div class="slide">
        <div slot="main">Slide 2 Main</div>
        <div slot="meta">Slide 2 Meta</div>
      </div>
    </script>
    

相关问题