Vue не может изменить атрибут во вложенном v-for

Я получаю массив объектов и добавляю к нему атрибут clicked=false, чтобы позже можно было добавить или удалить класс, используя vue bind и значение этого атрибута.

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

Я использую метод щелчка для каждого элемента списка, чтобы изменить атрибут clicked, но он никогда не меняется.

Как я могу это сделать?

Объект имеет такую ​​структуру

grouped:{
  typeA: [
   {
    clicked: false,
    text: "a1",
    type: "typeA"
   }, 
   {
    clicked: false,
    text: "a2",
    type: "typeA"
   }
  ],
  typeB: [
   {
    clicked: false,
    text: "b1",
    type: "typeB"
   }
  ]
}

А затем для рендеринга по типу делаю

  <div v-for="(group, type) in grouped" :key="type">
    <b>{{type}}</b>
    <div  v-for="(item, index) in group" :key="index" @click="eventItemClick(item)" >
      {{item.text}}   {{item.clicked}}
    </div>
  </div> 

все, что делает метод eventItemClick, это

      eventItemClick(item){    
        item.clicked = !item.clicked;
      },
           

Я создал простой пример скрипта js, который демонстрирует. Просто не забудьте нажать кнопку group, чтобы сгруппировать массив и отобразить список.

Спасибо


person codebot    schedule 11.12.2020    source источник


Ответы (1)


Вы столкнулись с предупреждением о реактивности, потому что пытаетесь использовать свойства данных, которые не существуют во время рендеринга.

Используйте Vue.set при установке этих свойств:

this.todos.forEach(e => { 
   this.$set(e, 'clicked', false);  // `Vue.set` in a module
});
person Dan    schedule 11.12.2020
comment
Привет и спасибо за ответ. Я получаю ReferenceError: Vue is not defined Что мне здесь не хватает? Спасибо - person codebot; 14.12.2020
comment
Привет, Vue должен быть определен в вашей скрипке, так как вы используете new Vue. Но я отредактировал, чтобы показать вам синтаксис компонентов set - person Dan; 14.12.2020
comment
Спасибо за исправление. Сейчас ошибок нет, но все равно не работает. Может, стоит использовать какой-нибудь прием в eventItemClick? Спасибо - person codebot; 14.12.2020
comment
Вот ваша скрипка с моим интегрированным ответом: jsfiddle.net/sh0ber/6nq73w51 (обратите внимание, что он работает как с этим редактированием и оригиналом) Так что я не уверен, что вы имеете в виду - person Dan; 14.12.2020