我是Vue.js的新手,我已经使用了AngularJS一段时间,我们曾经用角度加载模板,例如,
template: '/sometemplate.html',
controller: 'someCtrl'
我们如何在Vue中做这样的事情,而不是像这样在JavaScript中保存大型HTML模板,
new Vue({
el: '#replace',
template: '<p>replaced</p>'
})
对于小模板来说这没关系,但对于大模板来说这是否实用?
有没有办法加载外部模板HTML或在像Vue中的脚本标记中使用HTML模板?
<script type="x-template" id="template>HTML template goes here</html>
答案 0 :(得分:25)
您只需引用其id
。
{
template: '#some-id'
}
尽管如此,我强烈建议您使用 vueify(如果您使用browserify)或 vue-loader(如果您使用webpack),这样您就可以将您的组件存储在漂亮的小{{ {1}}这样的文件。
此外,Vue的作者写了一篇关于外部模板网址主题的好文章:
答案 1 :(得分:13)
你可以试试这个: https://github.com/FranckFreiburger/http-vue-loader
示例:
new Vue({
components: {
'my-component': httpVueLoader('my-component.vue')
},
...
答案 2 :(得分:11)
David,这是一个很好的例子,但是确保编译DOM的最佳方法是什么?
https://jsfiddle.net/q7xcbuxd/35/
当我模拟异步操作时,如上例所示,它可以工作。但是一旦我加载外部页面&#34;即时#34; Vue抱怨因为DOM还没准备好。
进一步来说:
Uncaught TypeError: Cannot set property 'vue' of undefined
有没有比在页面加载时调用$compile
更好的方法呢?我曾尝试使用$mount
,但这并没有帮助。
<强>更新强> 没关系,我终于想出了怎么做:
Vue.component('async-component', function (resolve, reject) {
vue.$http.get('async-component.html', function(data, status, request){
var parser = new DOMParser();
var doc = parser.parseFromString(data, "text/html");
resolve({
template: doc
});
});
});
在实际模板中,我删除了
<script id="someTemplate" type="text/x-template"></script>
标签,仅包含html。
(此解决方案需要来自https://cdnjs.cloudflare.com/ajax/libs/vue-resource/0.1.10/vue-resource.min.js的http加载程序)
答案 3 :(得分:2)
// template.vue
<template>
<div class="helloworld">
<h1>Hello world</h1>
</div>
</template>
<script>
import src from './src'
export default src
</script>
并在单独的文件中
// src.js
export default {
name: 'helloworld',
props: {},
...
}
然后在组件注册中
import helloworld from './helloworld/template.vue'
new Vue({
components: {
'helloworld': helloworld
},
...})
通过这种方式,您可以充分利用两个方面的优势,而不必强迫自己在字符串中构建模板。
new Vue({
components: {
'helloworld': () => import(/* webpackChunkName: "helloworld" */ './helloworld/template.vue')
},
...})
这将根据浏览器中该页面的请求加载helloworld.js(其中将包含所有组件的代码)。
当然,以上所有条件都假设您使用的是具有import
功能的ES6
答案 4 :(得分:1)
至少有两种方法可以实现您想要的目标,其中有Bill Bills Criswell已经提到过的(x模板),但是我认为值得添加一个示例
像这样定义您的组件
Vue.component('my-checkbox', {
// id of x-template
template: '#my-template'
});
使用x模板添加html文件(id应与您在组件中指定的文件匹配)
<script type="text/x-template" id="my-template">...</script>
另一种方法(我更喜欢这种方法)是使用内联模板
像这样定义模板
Vue.component('my-template', {});
添加带有组件和模板的html文件
<my-template inline-template>place for your html</my-template>
请不要忘记添加inline-template
属性,否则它将无法正常工作
答案 5 :(得分:0)
您可以将此方法与superagent一起使用:
var promise = superagent.get("something.html")
.end(function (error, response) {
if (error) {
console.error("load of something.html failed", error));
return;
}
var parser = new DOMParser()
var doc = parser.parseFromString(response.text, "text/html");
document.body.appendChild(doc.scripts[0]);
});
只需将基于<script>
标记的模板放在服务器上的something.html
内。
如果您使用的是jQuery,.load应该可以使用。
确保在Vue编译有问题的DOM之前完成此操作。或使用$mount手动设置。
答案 6 :(得分:0)
使用browserify捆绑所有内容:
//Home.js
import Vue from 'vue';
var Home = Vue.extend({
template: require('./Home.vue')
});
export default Home;
//Home.vue
<h1>Hello</h1>
// And for your browserify bundle use a transform called stringify
... .transform(stringify(['.html', '.svg', '.vue', '.template', '.tmpl']));
答案 7 :(得分:0)
我已经尝试过http-vue-loader,并且工作正常。 该库易于使用,并具有良好的文档说明和examples
尽管您不能直接从文件中加载模板,但仍可以将html保留在单独的单文件组件中。您甚至可以跳过<script>...</script>
部分。
my-component.vue
<template>
<div class="hello">Hello {{who}}</div>
</template>
index.html
<!doctype html>
<html lang="en">
<head>
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/http-vue-loader"></script>
</head>
<body>
<div id="my-app">
<my-component></my-component>
</div>
<script type="text/javascript">
new Vue({
el: '#my-app',
components: {
'my-component': httpVueLoader('my-component.vue')
}
});
</script>
</body>
</html>
两个文件都应放在同一级别的一个文件夹中