Last updated
Last updated
Vue оборачивает у наблюдаемого массива методы внесения изменений, чтобы они вызывали обновления представления. Оборачиваются следующие методы:
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
Методы внесения изменений изменяют оригинальный массив, на котором они вызываются. Существуют и неизменяющие методы, такие как filter()
, concat()
и slice()
, они не вносят изменений в изначальный массив, а всегда возвращают новый массив. При работе с неизменяющими методами можно просто заменять старый массив на новый:
Можно предположить, что Vue придётся выбросить существующий DOM и заново отрисовать список целиком, но, к счастью, это не так. Во Vue есть умные эвристики для максимизации переиспользования элементов DOM, поэтому замена одного массива другим, в случае совпадения части элементов этих массивов, будет очень эффективной операцией.
Из-за ограничений JavaScript, Vue не способен отследить следующие изменения в массиве:
Прямую установку элемента по индексу: vm.items[indexOfItem] = newValue
Явное изменение длины массива: vm.items.length = newLength
Например:
Решить первую проблему можно двумя способами, оба дадут эффект аналогичный vm.items[indexOfItem] = newValue
, плюс запустят реактивные обновления состояния приложения:
Можно использовать метод экземпляра vm.$set
, который является псевдонимом для глобального Vue.set
:
Для решения второй проблемы можно использовать splice
: