Что означает, что данные не являются реактивными?

В Vue 2 вы создаете объект и делаете его реактивным с помощью функции `reactive`, используя массив `templatesArr`. Затем, для каждого шаблона вы фильтруете массив устройств и добавляете в объект шаблона как устройства, так и поле `settings`, которое изначально пустое. Когда вы получаете этот объект в компоненте через пропс, вы пытаетесь заполнить поле `settings` значениями для чекбоксов. Однако, значения чекбоксов не обновляются до тех пор, пока вы не обновите шаблон в редакторе. 

Какова основная причина, по которой значения чекбоксов не обновляются в реальном времени?
  • 8 сентября 2024 г. 18:02
Ответы на вопрос 2
Основная причина, по которой значения чекбоксов в вашем примере не обновляются в реальном времени, заключается в том, что объект, содержащий эти значения, не является реактивным. В Vue 2 реактивность реализуется с помощью системы отслеживания изменений, которая автоматически обновляет представление при изменении наблюдаемых данных. Однако, если данные были добавлены или изменены после создания реактивного объекта, Vue может не распознать эти изменения.

Вот несколько ключевых моментов, которые могут объяснить вашу ситуацию более подробно:

1. **Необъявленные свойства**: Если вы добавляете новое свойство (например, `settings`) в уже существующий объект, Vue не сможет отслеживать его изменения, если это свойство не было объявлено заранее. Решение — использовать метод `Vue.set` для добавления реактивных свойств в уже реактивные объекты.

2. **Реактивные объекты и массивы**: Vue 2 делает реактивными объекты только на момент их объявления. Если вы просто изменяете значение уже существующего реактивного объекта, Vue будет его отслеживать. Но если вы добавляете вложенные объекты или массивы, согласуйте с Vue, чтобы они были инициализированы корректно.

3. **Пропсы**: Когда вы передаете объект через пропсы, это может привести к тому, что эффект реактивности может быть нарушен, особенно если вы пытаетесь непосредственно изменять переданные данные. Пропсы должны использоваться для передачи данных "вниз" от родительского компонента к дочернему, а не для изменения в дочернем компоненте.

4. **Методы обновления**: Если у вас есть определенные методы для обновления значений чекбоксов, убедитесь, что они корректны. Проверьте, что изменения перезаписывают значения в реактивной структуре должным образом.

В общем, чтобы значения чекбоксов обновлялись в реальном времени, убедитесь, что объекты и их свойства инициализированы как реактивные с использованием подходящих методов Vue для их создания и изменения.
В vue 2 добавленые после создания ключи объектов не реактивы из-за технических ограничений. (Раньше это большими буквами в доках писалось). 
Надо использовать this.$set \ Vue.set при добавлении нового ключа.

В твоём случае можно переделать так:
const templates = reactive(keyBy(templatesArr, 'id'))
for (let templateId in templates) {
  const devices = devicesArr.filter(device => device.templateId === templateId)
  Vue.set(templates[templateId], 'devices', devices);
  Vue.set(templates[templateId], 'settings', {});
}

// либо просто так:
const templates = keyBy(templatesArr, 'id');
for (let templateId in templates) {
  const devices = devicesArr.filter(device => device.templateId === templateId)
  Object.assign(templates[templateId], { devices }, {settings: {}})
}
reactive(templates);


P.S. не помню чтоб в vue 2 было reactive , вместо него был Vue.observable . Но может добавили, хз, лень смотреть.:)
Похожие вопросы