Удаление элемента из объекта также удаляет элемент из другого аналогичного объекта

#javascript #vue.js

Вопрос:

У меня есть два объекта, содержащих одни и те же данные, я хочу удалить элемент из одного из объектов (и сохранить другой с исходными данными для других целей), однако, когда я использую метод сращивания для одного из объектов, затрагиваются оба, поэтому я теряю свой элемент в обоих объектах.

 <button @click="deleteData(0)" />

export default {
    data() {
        return {
            arrayA: [],
            arrayB: []
        }
    },
    methods: {
        async initData() {
            const { data: response } = await this.$store.dispatch("getData", { id: this.$route.params.id })

            this.arrayA = response
            this.arrayB = response
        },

        deleteData(indexOfItem) {
            console.log("arrayA amp; arrayB before splice: ", this.arrayA, this.arrayB);
            // arrayA amp; arrayB before splice : [{...}, {...}], [{...}, {...}]

            this.arrayA.splice(indexOfItem, 1);

            console.log("arrayA amp; arrayB after splice :", this.arrayA, this.arrayB);
            // arrayA amp; arrayB after splice :  [{...}], [{...}]
        }
    }
}
 

Ответ №1:

Из-за реактивности vue.js изменения на одном объекте вызывают изменения на всем остальном , что было объявлено со ссылкой.

Пример: Если у вас есть objectA с вашими данными и объявлением objectB = objectA , все изменения objectA повлияют objectB .

Решение: Если вам действительно нужны objectB те же данные, но без ссылки objectA , вы можете сделать это так:

 objectB = JSON.parse(JSON.stringify(objectA));
 

Обратите внимание, что objectB это решение не может реагировать на изменения objectA .


ИЗМЕНИТЬ: Пояснение к вашему коду

Как вы указали, следующий код:

 data() {
  return { 
    a: [],
    b: [] 
  }
  }, 
methods: { 
  getData() { 
    const response = (request to retrieve the data...); 
    this.a = response.data; 
    this.b = response.data; 
  } 
}
 

И то, и другое, a и b являются реактивными. У обоих один и тот же источник данных. Таким образом, изменение содержимого a или b означает изменение источника данных, и при этом оба имеют одинаковое измененное содержимое.

Согласно моему подходу, вы бы сделали это так:

 data() {
  return { 
    a: [],
    b: [] 
  }
  }, 
methods: { 
  getData() { 
    const response = (request to retrieve the data...); 
    this.a = response.data; 
    this.b = JSON.parse(JSON.stringify(this.a)); 
  } 
}