【发布时间】:2016-07-21 21:52:03
【问题描述】:
是否可以使用 Vue.js 创建语义嵌套的元素?
示例:假设我正在构建一个 'accordion' 元素。 Accordions 由 'heading' 和 'content' 部分组成。通过单击标题可以将内容切换进出视图。像这样的元素的最终 html 是这样的:
<div class="accordion">
<div class="heading">
My Accordion
</div>
<div class="content">
Accordions are fun! Loren ipsum dolor sit amet.
This can be extensive text, include pictures, etc.
</div>
</div>
我希望能够使用这样的语法在我的 html 中创建这样的元素:
<accordion>
<heading>My Accordion</heading>
<content>
Accordions are fun! Loren ipsum dolor sit amet.
This can be extensive text, include pictures, etc.
</content>
</accordion>
'heading' 和 'content' 元素不是通用的,应该只存在于父 'accordion' 元素的上下文中,所以我认为它们应该在父组件的定义中声明 .
我知道为了捕获一个元素的innerHTML内容,我们必须使用<slot>元素,所以我尝试使用以下模板:
<template id="heading">
<div class="heading">
<slot></slot>
</div>
</template>
<template id="content">
<div class="content">
<slot></slot>
</div>
</template>
<template id="accordion">
<div class="accordion">
<heading></heading>
<content></content>
</div>
</template>
<div id="app">
<accordion>
<heading>My Accordion</heading>
<content>
Accordions are fun. Lorem ipsum dolor sit amet.
I could add a lot more text here, or other elements.
</content>
</accordion>
</div>
还有 Vue javascript...:
Vue.component('accordion', {
template: '#accordion',
components: {
heading: {
template: '#heading'
},
content: [
template: '#content'
}
}
});
Vue({
el: '#app'
});
不幸的是,它不起作用。我已经多次阅读官方文档,并且在 'Components' 部分中,当它谈到 <slot> 元素时,似乎表明我们应该能够做到这一点 - 但我一生都无法弄清楚如何......文档实际上提到了一个具有这样结构的元素:
<app>
<app-header></app-header>
<app-footer></app-footer>
</app>
...但它没有给出如何做的简单、具体的例子。
信息从父元素传递到子元素的方式令人困惑,我一直无法在网上找到任何教程来展示如何设置这样的嵌套元素。任何指导将不胜感激。
【问题讨论】:
标签: javascript components custom-component vue.js