Есть разметка:
<div id="consturctor">
<cb-top-line>
<cb-step class="cb-step--current" id="cb-step1" number="1" title="Изображение">
</cb-step>
<cb-step id="cb-step2" number="2" title="Рама">
</cb-step>
<cb-step id="cb-step3" number="3" title="Заголовок">
</cb-step>
<cb-step id="cb-step4" number="4" title="Цвет отпечатков">
</cb-step>
</cb-top-line>
</div>
Вот сами компоненты:
Vue.component('cb-top-line', {
template: '<div class="cb-top-line"></div>'
})
Vue.component('cb-step', {
props: ['number', 'title'],
template: '<div class="cb-step"> \
<p> \
<span>{{ number }}</span> \
{{ title }}\
</p> \
</div>'
})
let vm = new Vue({
el: '#constructor'
})
В результате отображается пустой cb-top-line, без cb-step внутри.
Все рендерится. Вы в index написали разметку, vue находит элемент cb-top-line, он знает что это component. В результате он берет разметку которую вы написали в этом компоненте и вставляет ее. У вас написано
template: '<div class="cb-top-line"></div>'
Вот он и отображается пустой cb-top-line. Для вызова другого компонента, напишите вызов этого компонента в компоненте cb-top-line.
Вот так это должно работать.
Vue.component('cb-top-line', {
template: '\
<div class="cb-top-line">\
<cb-step class="cb-step--current" id="cb-step1" number="1" title="Изображение">\
</cb-step>\
<cb-step id="cb-step2" number="2" title="Рама">\
</cb-step>\
<cb-step id="cb-step3" number="3" title="Заголовок">\
</cb-step>\
<cb-step id="cb-step4" number="4" title="Цвет отпечатков">\
</cb-step>\
</div>\
'
})
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники