繁体   English   中英

Vue.js 渲染多个插槽

[英]Vue.js render multiple slots

我有以下应用程序:

<template>
    <component :is="layout">
        <router-view :layout.sync="layout"/>
    </component>
</template>

<script>
    import LayoutBlank from './LayoutBlank'

    export default {
        name: 'app',
        data() {
            return {
                layout: LayoutBlank,
            };
        },
    }
</script>
<script>
    import LayoutBlankTemplate from './LayoutBlankTemplate'

    export default {
        name: 'LayoutBlank',
        created() {
            this.$parent.$emit('update:layout', LayoutBlankTemplate);
        },
        render() {
            return this.$slots.default[0];
        },
    }
</script>
<template>
    <div>
        <slot></slot>
    </div>
</template>

<script>
    export default {
        name: 'LayoutBlankTemplate',
    }
</script>
<template>
    <layout-blank>
        Test content
    </layout-blank>
</template>

<script>
    import LayoutBlank from './LayoutBlank';
    export default {
        name: 'BlankTest',
        components: {LayoutBlank},
    }
</script>

一切正常。 但现在我想在 LayoutBlankTemplate 中再添加一个插槽:

<template>
    <div>
        <slot></slot>
        <slot name="second"></slot>
    </div>
</template>

<script>
    export default {
        name: 'LayoutBlankTemplate',
    }
</script>

并在 BlankTest 中使用它:

<template>
    <layout-blank>
        <template #default>Test content</template>
        <template #second>Second test content</template>
    </layout-blank>
</template>

<script>
    import LayoutBlank from './LayoutBlank';
    export default {
        name: 'BlankTest',
        components: {LayoutBlank},
    }
</script>

该代码仅呈现默认插槽内容。 问题是我正在使用return this.$slots.default[0]; 在仅呈现默认插槽内容的 LayoutBlank 组件中。

我找不到如何在 LayoutBlank::render() 方法中渲染所有插槽的方法。 我知道我可以使用 this.$slots 或 this.$scopedSlots 获取插槽列表,但我找不到如何将它们传递给 LayoutBlankTemplate 以使它们呈现的方法。

我相信您可以将插槽放入您创建的元素中。 渲染函数文档中(简要地)提到了这一点。

这可能不是您想要的布局,但例如,

<script>
import LayoutBlankTemplate from './LayoutBlankTemplate'

export default {
  name: 'LayoutBlank',
  created() {
    this.$parent.$emit('update:layout', LayoutBlankTemplate);
  },
  render(createElement, context) {
    return createElement('div', {}, [
      createElement('div', {}, this.$slots.default),
      createElement('div', {}, this.$slots.second)
    ])
  },
}
</script>

当您使用属性中的名称使组件创建任意数量的插槽标签时:

 <template> <slot name="first"></slot> <slot name="second"></slot> </template> <script> export default { name: 'MyComponent', } </script>

这是如何在组件中使用插槽:

 <MyComponent> <template v-slot:first> <p>I write content in my first slot</p> </template> <template v-slot:second> <p>I write content in my second slot</p> </template> </MyComponent> <script> import MyComponent from '@/components/MyComponent.vue' export default { components: { MyComponent } } </script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM