Vue - how to pass down slots inside wrapper component?

前端 未结 2 2007
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-04 08:36

So I\'ve created a simple wrapper component with template like:


   
<         


        
相关标签:
2条回答
  • 2020-12-04 09:02

    Vue 3

    Same as the Vue 2.6 example below except:

    • $listeners has been merged into $attrs so v-on="$listeners" is no longer necessary. See the migration guide.
    • $scopedSlots is now just $slots. See migration guide.

    Vue 2.6 (v-slot syntax)

    All ordinary slots will be added to scoped slots, so you only need to do this:

    <wrapper>
      <b-table v-bind="$attrs" v-on="$listeners">
        <template v-for="(_, slot) of $scopedSlots" v-slot:[slot]="scope"><slot :name="slot" v-bind="scope"/></template>
      </b-table>
    </wrapper>
    

    Vue 2.5

    See Paul's answer.


    Original answer

    You need to specify the slots like this:

    <wrapper>
      <b-table v-bind="$attrs" v-on="$listeners">
        <!-- Pass on the default slot -->
        <slot/>
    
        <!-- Pass on any named slots -->
        <slot name="foo" slot="foo"/>
        <slot name="bar" slot="bar"/>
    
        <!-- Pass on any scoped slots -->
        <template slot="baz" slot-scope="scope"><slot name="baz" v-bind="scope"/></template>
      </b-table>
    </wrapper>
    

    Render function

    render(h) {
      const children = Object.keys(this.$slots).map(slot => h('template', { slot }, this.$slots[slot]))
      return h('wrapper', [
        h('b-table', {
          attrs: this.$attrs,
          on: this.$listeners,
          scopedSlots: this.$scopedSlots,
        }, children)
      ])
    }
    

    You probably also want to set inheritAttrs to false on the component.

    0 讨论(0)
  • 2020-12-04 09:18

    I have been automating the passing of any (and all) slots using v-for, as shown below. The nice thing with this method is that you don't need to know which slots have to be passed on, including the default slot. Any slots passed to the wrapper will be passed on.

    <wrapper>
      <b-table v-bind="$attrs" v-on="$listeners">
    
        <!-- Pass on all named slots -->
        <slot v-for="slot in Object.keys($slots)" :name="slot" :slot="slot"/>
    
        <!-- Pass on all scoped slots -->
        <template v-for="slot in Object.keys($scopedSlots)" :slot="slot" slot-scope="scope"><slot :name="slot" v-bind="scope"/></template>
    
      </b-table>
    </wrapper>
    
    0 讨论(0)
提交回复
热议问题