Как динамически создать новый div с помощью v-for в Vue.js?
Я хочу создать div динамически на основе числа элементов, присутствующих в массиве. Div содержат html-элемент, созданный ProgressBar.JS.
Это Vue.код js
import ProgressBar from 'progressbar.js'
var bar;
export default {
data() {
return {
fitness: ['Run', 'Cycle'],
val: 0.65
}
},
mounted(){
this.showProgressBar(this.val);
},
created: function() {
},
methods:{
showProgressBar: function(val){
new ProgressBar.Circle('#container',{
trailColor: 'gainsboro',
trailWidth: 20,
color: 'teal',
strokeWidth: 20
}).animate(val);
}
}
}<div class="content" v-for="fitness in fitness">
<span>{{ fitness }}</span>
<div id="container"></div>
</div>Поскольку идентификатор связан только с одним div, я не могу выполнить новый ProgressBar.Объект Circle, который создаст еще один div. Существует ли способ динамического создания нового div с различным идентификатором a внутри v-для каждого нового ProgressBar.круг есть казнен? Может кто - нибудь помочь мне здесь?
2 ответов:
Одним из решений может быть присвоение уникальных идентификаторов каждому контейнеру div и создание индикаторов выполнения для каждого из них.
Попробуйте код ниже -
import ProgressBar from 'progressbar.js' var bar; export default { data() { return { fitness: ['Dietary Intake', 'Exercise'], val: [0.65, 9] } }, mounted() { this.showProgressBar(); }, created: function() { }, methods: { showProgressBar: function() { this.fitness.forEach((f, i) => { new ProgressBar.Circle('#container-' + i, { trailColor: 'gainsboro', trailWidth: 20, color: 'teal', strokeWidth: 20 }).animate(this.val[i]); }); } } }<div class="content" v-for="(f, index) in fitness"> <span>{{ f }}</span> <div v-bind:id="`container-${index}`"></div> </div>Update - val может быть массивом. И на его значения можно ссылаться из функции
showProgressBar.Я предполагаю, что длина массивов
fitnessиvalодинакова.Update 2 - Пояснение.
Так что в основном есть 2 главная здесь есть вопросы, которые надо решать.
1. Генерация нескольких
containerдивовНам нужно создать несколько
containerдивов, поскольку их будет несколькоProgressBars. Но нам нужно различать их, поэтому мы создаем уникальный идентификатор для каждого из них. Вот что делает следующий код.<div class="content" v-for="(f, index) in fitness"> <span>{{ f }}</span> <div v-bind:id="`container-${index}`"></div> </div>Поскольку индексные номера уникальны. При добавлении их в "контейнер" генерируются уникальные идентификаторы. Смотрите Отображение Списка
2. Генерировать несколько
ProgressBarsкогда компонент монтирует.Это проще мы просто создаем новые
ProgressBarдля каждого значения "пригодности".this.fitness.forEach((f, i) => { new ProgressBar.Circle('#container-' + i, { trailColor: 'gainsboro', trailWidth: 20, color: 'teal', strokeWidth: 20 }).animate(this.val[i]);Refer - массив forEach
Вот многоразовый компонент, который обертывает
progressbar.js.<template> <div class="container"><div ref="bar"></div></div> </template> <script> import ProgressBar from "progressbar.js" export default { props:["options", "val"], mounted(){ new ProgressBar.Circle(this.$refs.bar, this.options).animate(this.val) } } </script> <style> .container{ width:100px; height: 100px } </style>Вот как это используется в шаблоне:
<div v-for="fit in fitness" class="fitness"> <div>{{fit.name}}</div> <progress-bar :val="fit.val" :options="options"></progress-bar> </div>Рабочий Пример .
Comments