在重复内容区域添加 <slot>
Adding <slot> in repeating content region
我有一个菜单组件,简单地说,它接受一个带有一系列选项的道具,并在菜单中为每个选项呈现一个项目。我希望能够根据用例自定义每个菜单项内的标记,因此我在菜单项元素内使用了占位符。
您可以在 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 后,我看到在同一渲染树中发现错误 "Duplicate presence of slot "default" - 这可能会导致渲染错误。"
这在 v2 中是可行的还是有其他方法可以实现同样的目的?
看来您需要 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/
我有一个菜单组件,简单地说,它接受一个带有一系列选项的道具,并在菜单中为每个选项呈现一个项目。我希望能够根据用例自定义每个菜单项内的标记,因此我在菜单项元素内使用了占位符。
您可以在 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 后,我看到在同一渲染树中发现错误 "Duplicate presence of slot "default" - 这可能会导致渲染错误。"
这在 v2 中是可行的还是有其他方法可以实现同样的目的?
看来您需要 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/