Проп-часы запущены без изменений

В моем компоненте у меня есть реквизит X, который я назначаю данным Y на созданном хуке, поэтому я могу мирно мутировать Y. Оба являются массивами.

Тем временем я поставил часы на X, чтобы я мог обновить Y, если реквизит изменится.

Как ни странно, мой оператор watch запускается каждый раз, когда я использую такие методы, как Y.sort()

Выглядит так (очень упрощенно):

props: {
    X: Array
},
data: function() {
    return {
        Y: []
    }
},
methods: {
    someFunc() {
        this.Y.sort() // Triggers X's watch
    }
},
watch: {
    X (newVal) {
        this.Y = newVal;
    }
},
created: function() {
    this.Y = this.X;
}

Почему ?

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Все функции массива не изменяют исходный массив.

Кроме sort ;)

И поскольку sort изменяет положение элементов в вашем массиве, срабатывает наблюдатель.

Ну тогда это многое объясняет. Спасибо за понимание!

Pierre Burton 13.02.2019 08:58
Ответ принят как подходящий

Делая this.Y = this.X;, вы ссылаетесь на X через Y, и любое изменение, влияющее на Y, повлияет и на X, поэтому, чтобы избежать этой ситуации, используйте одно из следующих решений:

 this.Y = this.X.slice();

или

Object.assign(this.Y,this.X)

Пример JS:

let a = [44, 23, 16, 5, 52, 36]
console.info(a) //print the original a
let b = a;

b.sort((c, d) => {
  return c - d
});

console.info(a) //a is sorted however we do not call a.sort(...) method

Другие вопросы по теме