Вы должны поместить шаблоны в функции, если вы используете единый файловый подход. Посмотрите код ниже для примера. Шаблоны не анализируются должным образом из-за самозакрывающегося синтаксиса и, следовательно, только отображения одного компонента. Когда вы используете строки шаблона, вы можете получить ожидаемое отображение из шаблонов того, как они есть у вас сейчас. Просто поместите их в template:
функции компонента следующим образом:
const Navbar = Vue.component("app-navbar", {
name: "app-navbar",
template:
`
<nav>
<div class="nav-wrapper container">
<a href="#!" class="brand-logo">Logo</a>
<a href="#" data-target="app-sidenav" class="sidenav-trigger">
<i class="material-icons">menu</i>
</a>
<ul class="right hide-on-med-and-down">
<li><a href="#">Sass</a></li>
<li><a href="#">Components</a></li>
<li><a href="#">Javascript</a></li>
<li><a href="#">Mobile</a></li>
</ul>
</div>
</nav>
`,
props: {
targetId: {
type: String,
default: "#app-sidenav"
}
},
mounted() {
this.sidenav = M.Sidenav.init(document.querySelector(this.targetId));
},
});
const Header = Vue.component("app-header", {
name: "app-header",
template:
`
<div class="section no-pad-bot" id="index-banner">
<div class="container">
<br /><br />
<h1 class="header center orange-text">Todos</h1>
<div class="row center">
<h5 class="header col s12 light">
A modern responsive front-end framework based on Material Design
</h5>
</div>
<div class="row center">
<a href="http://materializecss.com/getting-started.html" id="download-button"
class="btn-large waves-effect waves-light orange">Get Started</a>
</div>
<br /><br />
</div>
</div>
`
});
const AppRoot = Vue.component("app-root", {
template:
`
<div>
<!-- Comment out the navbar to see the header. expected behavior is that both ar displayed -->
<app-navbar target-id="#app-sidenav" />
<app-header />
</div>
`,
components: { Navbar, Header },
});
store = new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {}
});
app = new Vue({
el: "#app",
store,
render: h => h(AppRoot)
});
Удалите шаблоны из своего пера кода и добавьте это к JS, чтобы увидеть, как оно работает. В качестве альтернативы вы можете использовать синтаксис закрывающих тегов для своих компонентов, но более удобочитаемым и интуитивно понятным является использование самозакрывающихся тегов и разделение битов отображения на их функции вместо большого двоичного объекта <template></template>
тегов. Просто мое мнение о чистом коде, поэтому не стесняйтесь использовать любой подход по желанию / необходимости.