Vuejs: массив v-model в нескольких входах
У меня есть поле ввода текста с прикрепленной v-моделью, и каждый раз, когда кто-то нажимает кнопку "Добавить", в DOM добавляется другой входной текст с той же самой v-моделью. Я думал, что тогда получу массив значений v-модели, но он получит только значение первого входа v-модели:
<div id="app">
<div id="references">
<input v-model="references" type="text">
</div>
<button @click="addReference">Add</button>
</div>
HTML, который я добавляю в dom, запускается методом addReference:
addReference: function(e) {
e.preventDefault();
console.log(this.references);
var inputEl = '<input v-model="references" type="text">';
$('#references').append(inputEl);
}
Это то, что Вуэйс не может сделать? Есть ли другой подход сбора значений из динамических элементов dom с помощью Vuejs?
new Vue({
el: "#app",
data: {
references: "text"
},
methods: {
addReference: function(e) {
e.preventDefault();
console.log(this.references);
var inputEl = '<input v-model="references" type="text">';
$('#references').append(inputEl);
}
}
})
input {
display: block;
margin: 1px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app">
<div id="references">
<input v-model="references" type="text">
</div>
<button @click="addReference">Add</button>
</div>
Ответы
Ответ 1
Ты слишком думаешь о DOM, это чертовски вредная привычка. Vue рекомендует сначала обратиться к этим данным.
Трудно сказать в вашей конкретной ситуации, но я бы, вероятно, использовал v-for
и сделал бы массив finds
, чтобы нажимать на него, когда мне нужно больше.
Вот как я настроил свой экземпляр:
new Vue({
el: '#app',
data: {
finds: []
},
methods: {
addFind: function () {
this.finds.push({ value: '' });
}
}
});
А вот как я настроил свой шаблон:
<div id="app">
<h1>Finds</h1>
<div v-for="(find, index) in finds">
<input v-model="find.value" :key="index">
</div>
<button @click="addFind">
New Find
</button>
</div>
Хотя я бы попробовал использовать что-то кроме index
для key
.
Вот демо из вышеперечисленного: https://jsfiddle.net/crswll/24txy506/9/
Ответ 2
Если вы спрашиваете, как сделать это в vue2 и задать параметры для вставки и удаления, посмотрите js fiddle
.
new Vue({
el: '#app',
data: {
finds: []
},
methods: {
addFind: function () {
this.finds.push({ value: 'def' });
},
deleteFind: function (index) {
console.log(index);
console.log(this.finds);
this.finds.splice(index, 1);
}
}
});
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<div id="app">
<h1>Finds</h1>
<div v-for="(find, index) in finds">
<input v-model="find.value">
<button @click="deleteFind(index)">
delete
</button>
</div>
<button @click="addFind">
New Find
</button>
<pre>{{ $data }}</pre>
</div>
Ответ 3
Вот демонстрация вышеперечисленного:https://jsfiddle.net/sajadweb/mjnyLm0q/11
new Vue({
el: '#app',
data: {
users: [{ name: 'sajadweb',email:'[email protected]' }]
},
methods: {
addUser: function () {
this.users.push({ name: '',email:'' });
},
deleteUser: function (index) {
console.log(index);
console.log(this.finds);
this.users.splice(index, 1);
if(index===0)
this.addUser()
}
}
});
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
<h1>Add user</h1>
<div v-for="(user, index) in users">
<input v-model="user.name">
<input v-model="user.email">
<button @click="deleteUser(index)">
delete
</button>
</div>
<button @click="addUser">
New User
</button>
<pre>{{ $data }}</pre>
</div>