【发布时间】:2020-02-10 16:07:12
【问题描述】:
我正在尝试使用 HTML 正文中的 template 元素创建 Vue 元素。在我尝试将其中两个一起使用之前,它工作得很好。
<template id="root-template">
<div>
<app-navbar targetId="#app-sidenav" />
<app-header />
</div>
</template>
由于某种原因,注释掉app-navbar 会导致显示app-header,但是如果显示app-navbar,则根本不会显示app-header!这个完全把我难住了。
const Navbar = Vue.component("app-navbar", {
name: "app-navbar",
template: "#navbar-template",
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: "#header-template"
});
const AppRoot = Vue.component("app-root", {
template: "#root-template",
components: {
Navbar,
Header
},
});
const store = new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {}
});
const app = new Vue({
el: "#app",
store,
render: h => h(AppRoot)
});
<script src="https://unpkg.com/vuex@3.1.2/dist/vuex.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel="stylesheet" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons&type=.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<ul class="sidenav" id="app-sidenav">
<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 id="app" />
<template id="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>
</template>
<template id="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>
</template>
<template id="root-template">
<div>
<app-navbar target-id="#app-sidenav" />
<app-header />
</div>
</template>
我还把它变成了Pen。谁能告诉我为什么会这样?
【问题讨论】:
-
也许可以尝试使用 VUE cli 来构建标准的 VUE 设置而不是这种语法。另外,您是否正确导入了组件?我在正常 VUE 设置中的数据中看不到这一点。
-
@CoderLee 我需要使用单个文件设置。组件在主脚本中就地创建和组装——无需 CLI。
-
为什么需要单一文件设置?这是一种非典型的方法,但解释为什么会更容易提供帮助。
-
因为该设备上已经有许多功能和文件,并且不需要通过将多个捆绑的应用程序安装到已经复杂的文件夹层次结构上来进一步复杂化其源代码。
-
在下面查看我的答案,它没有正确读取您的模板,导致它只评估一个组件。简单的解决方法是将模板放在组件函数中。希望有帮助
标签: javascript html css vue.js materialize