テンプレート内でidを使用しているため、テンプレートで複数呼び出したら、idが重複してしまい、警告されてしまいました...。
しかし、テンプレートの中身を弄ると、影響範囲も広く、面倒なため、idを振りなおすように記述することにしました。
現状サンプル(問題の状態)
var mainTemplate = {
template: '#main-template',
}
var vm = new Vue({
el: "#app",
components: {
'main-template': mainTemplate,
},
});
<div id="app">
<main-template id="sample1">サンプル1</main-template>
<main-template id="sample2">サンプル2</main-template>
</div>
<script type="text/x-template" id="main-template">
<div id="test">
<slot></slot>
</div>
</script>
このままでは以下のようなタグが生成され、「test」というIDが重複してしまいます。
<div id="sample">
サンプル1
</div>
<div id="sample">
サンプル2
</div>
改善後
var mainTemplate = {
template: '#main-template',
}
var vm = new Vue({
el: "#app",
components: {
'main-template': mainTemplate,
},
mounted: function(){
var allTag = document.getElementById('sample2').getElementsByTagName('*');
for (var i = 0; allTag.length > i; i++){
if(allTag[i].id != ''){
allTag[i].id += '2';
}
}
}
});
<div id="app">
<main-template id="sample1">サンプル1</main-template>
<main-template id="sample2">サンプル2</main-template>
</div>
<script type="text/x-template" id="main-template">
<div id="test">
<slot></slot>
</div>
</script>
mountedの処理を追加しました。
これは、タグ生成前に実行される処理です。
ここでは、sample2というidを渡したテンプレート内に存在するすべてのIDの後ろに「2」を追加します。
これでIDが被らなくなりました。
ただ、このやり方だと、テンプレート内のタグをすべて取得し、for文で回し、idを書き換えるため、処理が重たくなり、あまり良い方法ではないかもしれません。
他に、
・v-bindを使用し、「:id="'sample' + num"」のようにする
・vue-uidプラグインを使用する
という方法もあります。
しかし、前者の場合、書き方が悪かったのかうまく動作ができなかったです。