# Массив с объектами

Если мы хотим полностью заменить один из объектов, как

arr[0] = { }

То это не сработает, также как когда мы обсуждали изменение элемента напрямую. В таком случае нужно использовать конструкцию Vue.set.

А вот в случае, если вы просто хотите изменить свойство, как

arr[0].a = ''

То это сработает. Изменение по ссылке тоже работает, как

const elem = arr[0];
elem.a = '';

# Класс










 



 



 
 






import Vue from 'vue';

class ArrWithObjects {
  arr = [
    { id: 1, a: 'test', b: 'test' },
    { id: 2, a: 'test', b: 'test' }
  ];

  rewriteFirstElem() {
    Vue.set(this.arr, 0, { id: 1, a: 'anotherTest', b: 'test' });
  }

  changePropOfSecond() {
    this.arr[1].a = 'anotherTest'; // Works!
  }

  changeByLink() {
    const elem = this.arr[0];
    elem.a = 'changed by link';
  }
}

const instance = new ArrWithObjects();

export default instance;

# Компонент





 
 
 





















<template>
  <div class="component-block">
    <span class="name">ArrWithObjectsOne</span>

    <div v-for="el in arr" :key="el.id">
      {{ el.a }} {{ el.b }}
    </div>
    <button @click="rewriteFirstElem">Перезаписать первый элемент</button><br />
    <button @click="changePropOfSecond">Изменить свойство второго</button><br />
    <button @click="changeByLink">Изменить по ссылке</button>
  </div>
</template>

<script>
import ArrWithObjects from '@example-services/ArrWithObjects';

export default {
  data() {
    return {
      arr: ArrWithObjects.arr,
      rewriteFirstElem: ArrWithObjects.rewriteFirstElem.bind(ArrWithObjects),
      changePropOfSecond: ArrWithObjects.changePropOfSecond.bind(ArrWithObjects),
      changeByLink: ArrWithObjects.changeByLink.bind(ArrWithObjects),
    };
  },
};
</script>

# Результат

ArrWithObjectsOne
test test
test test


ArrWithObjectsTwo
test test
test test
Обновлено: 12/12/2022, 3:53:53 PM