【问题标题】:Adding <slot> in repeating content region在重复内容区域中添加 <slot>
【发布时间】:2017-06-10 12:58:35
【问题描述】:

我有一个菜单组件,简单地说,它接收一个带有一系列选项的道具,并在菜单中为每个选项呈现一个项目。我希望能够根据用例自定义每个菜单项中的标记,因此我在菜单项元素中使用了占位符。

您可以在 fiddle 中看到一个示例。

const Menu = {
    template: `
        <ul>
            <li v-for="item in options" :class="item.colour">
            <slot></slot>
            <span class="label">{{item.name}}</span>
          </li>
        </ul>
    `,
    data: () => {
        return {
            options: [
                { name: 'one', colour: 'red' },
                { name: 'two', colour: 'green' },
                { name: 'three', colour: 'blue' },
                { name: 'four', colour: 'yellow' }
            ]
       };
    }
};


const app = new Vue({
    components: {
        custommenu: Menu,
      },
    template: `<custommenu><span class="colour"></span></custommenu>`
});

app.$mount('#app');

这在 Vue.JS 的 v1 上运行良好,但在升级到 v2 后,我看到错误“在同一渲染树中发现插槽“默认”重复存在 - 这可能会导致渲染错误。”

这是在 v2 中可能实现的,还是有其他方法可以实现相同的目标?

【问题讨论】:

    标签: vue.js vuejs2


    【解决方案1】:

    看起来您需要scoped slot,因此您需要将slot 内容包装在具有scope 属性的模板中:

    <custommenu>
      <template scope="colour">
        <span class="colour"></span>
      </template>
    </custommenu>
    

    然后您需要将其添加到组件模板中的插槽中:

    <ul>
      <li v-for="item in options" :class="item.colour">
        <slot colour></slot>
        <span class="label">{{item.name}}</span>
      </li>
    </ul>
    

    这是更新后的 JSFiddle:https://jsfiddle.net/kLge4wun/

    【讨论】:

    • 太棒了,谢谢 - 它运作良好。我应该在文档中发现作用域插槽!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多