什么是构建嵌套组件系统的好方法?见所需代码和主要问题(“如何.”)如下所示:
tab.vue (子组件)
<template>
<slot></slot>
</template>
<script>
export default {
name: 'Tab',
props: ['title']
}
</script>tabs.vue (容器组件)
<template>
<div class="tabs-switchers">
<b
v-for="(o, i) in items"
:key="`tab-button-${i}`"
>
{{ o.componentInstance.props.title }}
</b>
</div>
<div class="tabs-contents">
<div class="tabs-contents-item"
v-for="(o, i) in items"
:key="`tab-item-${i}`"
>
<!-- HOW TO RENDER TAB CONTENT HERE??? -->
</div>
</div>
</template>
<script>
export default {
name: 'Tabs',
computed () {
items () {
return this.$slots.default
}
}
}
</script>page.vue (带有使用示例的组件)
<template>
<tabs>
<tab title="tab 1"><p>Tab #1 content</p></tab>
<tab title="tab 2"><p>Tab #2 content</p></tab>
<tab title="tab 3"><p>Tab #3 content</p></tab>
</tabs>
</template>发布于 2019-02-05 08:16:30
解决方案的关键是使用组件的呈现函数( https://v2.vuejs.org/v2/guide/render-function.html )来实现一些定制。示例:
export default {
name: 'Tabs',
render: function (createElement) {
const buttons = []
const tabs = []
const children = this.$slots.default // shortcut
for (let i = 0; i < children.length; i++) {
buttons.push(createElement(
'button',
children[i].componentOptions.propsData.title
))
tabs.push(createElement(
'div',
{
class: i === 0 ? 'active tab' : 'tab',
attrs: {
id: `tab-${i}`
}
},
children[i].componentOptions.children
))
}
const buttonsContainer = createElement('div', { class: 'buttons' }, buttons)
const tabsContainer = createElement('div', tabs)
const root = createElement('div', { class: 'tabs' }, [buttonsContainer, tabsContainer])
return root
}
}我不确定VNode API (children[i].componentOptions.propsData.title -这是正确的方法吗?)但它有效,这是解决问题的正确方法,我确信。
干杯!
发布于 2019-02-01 09:18:30
您不应该需要v-for来呈现slot内容。
Vue.component('Tabs', {
template: `
<div class="tab-container">
<slot></slot>
</div>
`
})
Vue.component('Tab', {
template: `
<div class="tab">
<strong>{{title}}</strong>
<slot></slot>
</div>
`,
props: ['title']
})
new Vue().$mount('#app');<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<tabs>
<tab title="tab 1">
<p>Tab #1 content</p>
</tab>
<tab title="tab 2">
<p>Tab #2 content</p>
</tab>
<tab title="tab 3">
<p>Tab #3 content</p>
</tab>
</tabs>
</div>
https://stackoverflow.com/questions/54475900
复制相似问题