#vue.js
#vue.js
Вопрос:
Я хочу добавить еще несколько элементов, которые реагируют на обработчик щелчков во время выполнения (т. Е. после того, как экземпляр Vue уже инициализирован). Добавление в DOM через v-html
в конечном итоге работает, но новые v-on
атрибуты остаются необработанными, поэтому эти кнопки не функционируют.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title />
<script src="https://code.jquery.com/jquery-3.3.1.slim.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script><![CDATA[
$(async () => {
new Vue({
data: { x: null },
el: '#v',
methods: {
even_number: function() {
console.log('yep, it worked');
},
start: function() {
let x = '';
let i = 0;
while (i < 20) {
let num = Math.floor(Math.random() * 100);
if (num % 2) {
x = num ' ';
} else {
x = `<button type="button" v-on="{click: even_number}">${ num }</button>` ' ';
}
i ;
}
this.x = x;
}
}
});
});
]]></script>
</head>
<body>
<dialog open="open" id="v">
<button type="button" v-on="{click: start}">get this started</button>
<pre><code v-html="x" /></pre>
</dialog>
</body>
</html>
Комментарии:
1. Самым простым способом было бы использовать ваш цикл while для заполнения массива данных, которые вы хотите отобразить, и сделать все остальное в шаблоне. Вот идея: jsfiddle.net/3q0k8may/1 но, возможно, ваша проблема сложнее, чем ваш пример.
Ответ №1:
Использование v-html
ограничивает вас необработанным HTML. Директивы Vue не будут обработаны так, как вы надеетесь. Из документов:
Обратите внимание, что вы не можете использовать v-html для создания частичных элементов шаблона, поскольку Vue не является механизмом создания шаблонов на основе строк. Вместо этого компоненты предпочтительнее в качестве основной единицы для повторного использования пользовательского интерфейса и композиции.
Возможно, вы могли бы поместить часть логики start
в шаблон и создать кнопку, которая будет отображаться условно. Видишь https://jsfiddle.net/ebbishop/f59ky7gj / для примера.