Если вы хотите, чтобы клик изменил isActive
из todo
, то вы должны сохранить его (и прочитать) там:
<li v-for="todo in todos"
:class="{ completed: todo.isActive }"
@click="$set(todo, 'isActive', !todo.isActive)">
{{ todo.task }}
</li>
data: {
message: 'List of things to do today',
todos: [
{ task: 'Have breakfast'},
{ task: 'Go to the gym'},
{ task: 'Study Vuejs'}
],
}
Вам не нужно isActive
в исходном состоянии todo
, которое охватывается с помощью $set
.
Рабочая скрипка: https://jsfiddle.net/iStyx/508bn4se/
Объяснение использования $set
:
Изначально объект todo
не имеет свойства isActive
, поэтому добавление или изменение его впоследствии не будет реактивным.Конечно, вы можете добавить isActive: false
ко всем вашим todo
объектам, но это довольно грязно и небрежно.Другой способ - использовать метод Vue.$set
(может вызываться из экземпляров Vue с помощью this.$set
), который следует использовать для добавления новых свойств к реактивному объекту (он также делает их реактивными).Выдержка из документа:
Добавляет свойство к реактивному объекту, гарантируя, что новое свойство также является реактивным, поэтому инициирует просмотр обновлений.Это необходимо использовать для добавления новых свойств к реактивным объектам, поскольку Vue не может обнаружить обычные добавления свойств
Полезная ссылка для чтения: Vue.js → Реактивность в глубине