# Запрет на изменение

Общий принцип такой же, запретить изменения можно с помощью Proxy, как мы делали с примитивом. Но с небольшим отличием, Vue должен иметь возможность установить свойство __proto__.

# Класс








 
 
 
 
 


 





 






class ReadonlyArray {
  _arr = [0, 1, 2];

  get arr() {
    return new Proxy(this._arr, {
      set(obj, prop, value) {
        // Даем возможность vue установить `__proto__` для реактивности
        if (prop === '__proto__') {
          obj[prop] = value;

          return true;
        }
        
        // В остальных случаях ошибка
        throw new Error('This value is readonly');
      }
    })
  }

  addElement() {
    this._arr.push(3); // Works!
  }
}

const instance = new ReadonlyArray();

export default instance;

# Компонент


























 








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

    <div><b>Значение arr:</b> {{ arr }}</div>
    <button @click="addElement">Добавить элемент через класс</button><br />
    <button @click="tryToChange">Добавить элемент через компонент</button><br />
    <div>{{ error }}</div>
  </div>
</template>

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

export default {
  data() {
    return {
      arr: ReadonlyArray.arr,
      addElement: ReadonlyArray.addElement.bind(ReadonlyArray),
      error: null,
    };
  },
  methods: {
    tryToChange() {
      try {
        this.arr.push('fromComponent'); // Ошибка!
      } catch(e) {
        this.error = e;
      }
    }
  }
}
</script>

# Результат

ReadonlyArrayOne
Значение arr: [ 0, 1, 2 ]


ReadonlyArrayTwo
Значение arr: [ 0, 1, 2 ]
Обновлено: 12/12/2022, 3:53:53 PM