私はVue.jsを初めて使用します。AngularJSをしばらく使用し、angularで次のようなテンプレートをロードしました。
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>
id
を参照するだけで、スクリプトタグテンプレートを使用できます。
{
template: '#some-id'
}
ただし、使用することを強くお勧めします vueify (browserifyを使用する場合)または vue-loader (webpackを使用する場合)ので、このような素敵な小さな.vue
ファイルにコンポーネントを保存できます。
また、Vueの著者は、外部テンプレートURLのトピックに関する素敵な投稿を書いています。
これを試すことができます: https://github.com/FranckFreiburger/http-vue-loader
例:
new Vue({
components: {
'my-component': httpVueLoader('my-component.vue')
},
...
David、これはいい例ですが、DOMがコンパイルされていることを確認する最良の方法は何ですか?
https://jsfiddle.net/q7xcbuxd/35/
上記の例のように非同期操作をシミュレートすると、動作します。しかし、「オンザフライ」で外部ページをロードするとすぐに、DOMの準備ができていないため、Vueが文句を言います。より具体的に:Uncaught TypeError: Cannot set property 'vue' of undefined
ページがロードされたときに$compile
を呼び出すよりも、これを行う良い方法はありますか? $mount
で試しましたが、それは役に立ちませんでした。
UPDATE:気にしないで、私は最終的にそれを行う方法を見つけました:
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ローダーが必要です。
// 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を使用していることを前提としています
http-vue-loader を試しましたが、うまくいきます。このライブラリは使いやすく、優れたドキュメントと examples を備えています。
Filedからテンプレートを直接ロードすることはできませんが、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>
両方のファイルを同じレベルの1つのフォルダーに配置する必要があります
スーパーエージェントでこのアプローチを使用できます。
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 が機能するはずです。
問題のDOMがVueによってコンパイルされる前に、これが完了することを確認してください。または、 $ mount を使用して、手動で設定します。
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']));