Vue проблема двустороннего связывания данных - PullRequest
0 голосов
/ 27 февраля 2020

Мой собственный компонент vue отправляет http-запрос на получение массива объектов, затем я сохраняю ответ в свойстве data, и это нормально. Теперь я хочу привязать этот массив к v-модели, но когда пользователь что-то введет, мой массив тоже будет изменен. Я хочу сохранить массив на потом и сделать его недоступным для редактирования, я просто хочу связать его значение с v-моделью, а не с ссылкой на мой массив. Моя цель - позволить пользователю сбросить значение v-модели в массив, полученный от API. Я надеюсь, что вы поняли, и вы сможете мне помочь.

<draggable v-model="myArray">
   <div v-for="element in myArray" :key="element.id">{{element.name}}</div>
</draggable>
<button @click="addElement">New</button>
data() {
   return {
       myArray: [],
       array: []
   }
},
methods: {
   addElement() {
      myArray.push({id:1, name:'something'});
   },
   getData() {
      axios(...)
      .then(res => {
         this.array = response.data;
      });
   }
   setData() {
      this.myArray = this.array;
   }
}

Теперь, если пользователь добавит новый элемент в myArray, он также будет вставлен в array

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Данные должны быть клонированы:

new Vue({
  template: '<div>List1:<ul><li v-for="i in array1" :key="i.id">{{i.name}}</li></ul>List2:<ul><li v-for="i in array2" :key="i.id">{{i.name}}</li></ul><button @click="add">Add</button></div>',
  data: {
    array1: [{id:1, name:'Item1'},{id:2, name:'Item2'}],
    array2: []
  },
  created() {
    // clone array
    this.array2 = this.array1.map(i => Object.assign({},i))
  },
  methods: {
    add() {
      this.array1.push({id:this.array1.length+1, name:'Item'+(this.array1.length+1)})
      this.array1[0].name = 'Item1/' + this.array1.length
    }
  }
}).$mount('div')
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div></div>

Если это более сложный массив объектов, то необходимо использовать какой-то тип глубокого клона.

1 голос
/ 27 февраля 2020

Я решил аналогичную проблему, используя синтаксический анализ JSON, чтобы установить связь между массивом, который будет скопирован, и c с массивом, который будет создан. Попробуйте следующее:

data() {
   return {
       myArray: [],
       array: []
   }
},
methods: {
   addElement() {
      myArray.push({id:1, name:'something'});
   },
   getData() {
      axios(...)
      .then(res => {
         this.array = response.data;
      });
   }
   setData() {
      this.myArray = JSON.parse(JSON.stringify(this.array)); // Here goes the trick
   }
}

Таким образом, каждое изменение пользователем массива v-модели не будет отражено в myArray, поскольку setData () вызывается хотя бы один раз перед взаимодействием с пользователем.

Надеюсь, он вам подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...