Вложенные изменения в Vue: как их остерегаться

Вложенные изменения в Vue: как их остерегаться

9 мая 2022 г.

Vue — это реактивный язык, то есть когда данные изменяются, мы можем автоматически отображать их в HTML. Чтобы помочь нам в этом, мы можем использовать наблюдатели в vue, чтобы следить за изменением данных, а затем делать что-то, чтобы HTML или отправить сообщение пользователю об этом.


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


Отслеживание изменений вложенных данных в Vue


Чтобы немного разобраться в этом вопросе, нам нужно понять, как работают наблюдатели в Vue. Vue отслеживает только поверхностные изменения. Например, ниже мы отслеживаем изменения в count и console.log эти изменения:


```html


<скрипт>


экспорт по умолчанию {


данные() {


возврат {


количество: 1


смотреть: {


количество (данные) {


console.log(данные);



<шаблон>


{{ количество }}


<кнопка @click="++this.count">


Нажми на меня




Каждый раз, когда пользователь нажимает на кнопку, мы ++this.count, и наш наблюдатель отслеживает любые изменения в count. Затем «консоль» регистрирует данные, чтобы мы могли видеть новое значение счетчика. Это означает, что каждый раз, когда нажимается кнопка, значение count отображается в журнале консоли.


Однако поверхностные изменения означают, что Vue проверяет только изменения в значении этого свойства. Если у нас есть данные более чем на один уровень глубины, Vue не будет проверять наличие обновлений. Например, обновление count.number ниже не вызовет срабатывания нашего наблюдателя для count, поскольку Vue просто не проверяет никаких изменений глубже, чем count:


```javascript


данные() {


возврат {


считать: {


номер 1,


тип: 'число'


смотреть: {


// Это не срабатывает, когда count.number!


количество (данные) {


console.log(данные);


Вместо этого нам нужно конкретно указать, какой элемент изменяется. Мы можем продолжать следить за изменениями в count.number выше, изменив наш наблюдатель, чтобы он следил за count.number:


```javascript


данные() {


возврат {


считать: {


номер 1,


тип: 'число'


смотреть: {


// Это срабатывает при изменении count.number!


"count.number": функция (данные) {


console.log(данные);


Используя описанный выше метод, мы можем легко проверить изменения в свойствах внутри свойств, чтобы мы могли активировать соответствующие наблюдатели, но это может привести к путанице. Если мы хотим просто следить за любыми изменениями count, нам нужно использовать свойство deep.


Использование свойства deep


Свойство deep может быть добавлено к любому наблюдателю, и оно заставляет Vue отслеживать любые изменения в определенном свойстве данных. Это означает, что мы должны написать наш наблюдатель немного по-другому:


```javascript


данные() {


возврат {


считать: {


номер 1,


тип: 'число'


смотреть: {


считать: {


обработчик (данные) {


console.log(данные);


глубоко: правда


Теперь всякий раз, когда изменяется какое-либо свойство внутри count, срабатывает наблюдатель count. Когда мы на этот раз console.log(data), весь объект count будет зарегистрирован в консоли, то есть { number: 1, type: 'number' }.


Это намного проще, чем нацеливание на конкретные свойства внутри свойств, но это дорого. Поскольку Vue каждый раз должен просматривать каждое свойство, это может вызвать серьезные проблемы с производительностью для очень больших объектов. Таким образом, используйте это только в том случае, если у вас есть известный объект небольшого размера. В других ситуациях придерживайтесь целевых свойств, таких как count.number.


Первоначально опубликовано [здесь] (https://fjolt.com/article/vue-how-to-watch-for-nested-changes)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE