Подтвердить что ты не робот

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>
4b9b3361

Ответ 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>