Можно ли создавать семантически вложенные элементы с помощью Vue.js?Истинно вложенные компоненты в Vue.js?
Пример: допустим, что я строю элемент 'accordion'. Аккордеоны состоят из 'рубрика' и '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>
«заголовок» и «контент» не являются общими и должны существовать только в контексте родительского элемента «аккордеон», поэтому я считаю, что они должны быть объявлены в пределах определения родительского компонента.
Я знаю, что для того, чтобы захватить содержание 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>
И на JavaScript Vue ...:
Vue.component('accordion', {
template: '#accordion',
components: {
heading: {
template: '#heading'
},
content: [
template: '#content'
}
}
});
Vue({
el: '#app'
});
К сожалению, это не работает. Я читал официальную документацию несколько раз, а в разделе «Компоненты», когда речь идет о элементах <slot>
, кажется, что мы должны должен быть в состоянии сделать это - но я не могу на жизнь мне работать, как ... на самом деле документы упоминают элемент со структурой, как это:
<app>
<app-header></app-header>
<app-footer></app-footer>
</app>
... но это не дает простые, конкретные примеры того, как это сделать.
Способ передачи информации от родительского элемента к дочернему элементу запутан, и я не смог найти какие-либо учебники в Интернете, которые показывают, как настроить вложенный элемент, подобный этому. Любое руководство будет высоко оценено.
Спасибо за ваше предложение. Существует долгое обсуждение в [GitHub Issue Tracker] (https://github.com/vuejs/vue/issues/2507) для Vue об этой проблеме. Ваше обходное решение можно использовать, но ломает модульность элементов заголовка и контента и создает излишне сложный и запутанный html - как отмечено в обсуждении в трекер-проблеме, что не является идеальным. Надеемся, что эта дискуссия приведет к решению этой проблемы, поэтому будет легче создавать более сложные, вложенные элементы в Vue. –