Я использую v-for
для отображения списка на основе массива объектов.
<ul>
<li v-for="category, i in categories"
:class="{active: category.active}"
@click="changeCategory(i)">
<a>{{ category.service_type_name }}</a>
</li>
</ul>
При щелчке по элементу списка changeCategory(index)
запускается:
changeCategory(index) {
this.categories.forEach((c, i) => {
c.active = (i != index)? false : true
})
}
Таким образом, атрибут active
элементов списка, по которым щелкнули клики, получает значение true
, а все остальные - false
, а элемент списка получает добавленный к нему класс .active
(из-за строки :class="{active: category.active}"
в шаблоне.
Однако модель DOM не обновляется, чтобы отображать это изменение.
Есть ли способ автоматически обновлять DOM, когда происходит это изменение, без использования this.$forceUpdate()
в функции changeCategory(index)
?
edit: изменено map
на forEach
, DOM по-прежнему не обновляется.
изменить: я использую компоненты vue-class с машинописным текстом
import Vue from 'app/vueExt'
import { Component } from 'vue-property-decorator'
import * as Template from './services.vue'
@Component({
mixins: [Template]
})
export default class Services extends Vue {
categories = []
created() {
this.api.getServiceSetupCatagories().then((res) => {
this.categories = res.categories
this.categories.forEach((c, i) => {
// adding active property to the object
// active = true if i = 0, false otherwise
c.active = (i)? false : true
})
})
}
changeCategory(index) {
this.categories.forEach((c, i) => {
c.active = (i != index)? false : true
})
}
}
map
не изменяет ваш массив, он возвращает новый массив. Поэтому vue не обнаруживает никаких изменений, и ваш dom не обновляется. Попробуйте вместо этого использоватьforEach
. - person Eric Guan   schedule 01.05.2017forEach
, и событие дошло до использования циклаfor
для изменения свойстваactive
, но это не дало результата. Когда яconsole.log
элемент, он показывает правильноеactive
значение, но DOM не обновляется. - person wrahim   schedule 01.05.2017map
вместоforEach
, и он тоже работает, как задумано. Я не уверен, почему в моем случае DOM не обновляется. - person wrahim   schedule 01.05.2017active
? - person Bert   schedule 01.05.2017active
не существует наcategory
до тех пор, пока не будет вызван методchangeCategory
, тогда вы попадаете в предостережение в Vue и должны использоватьVue.set(c, "active", i != index ? false : true)
. vuejs.org/v2/guide/reactivity.html#Change-Detection- Предостережения - person Bert   schedule 01.05.2017created()
). По-прежнему никакого эффекта. - person wrahim   schedule 01.05.2017