В моем компоненте у меня есть реквизит 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;
}Почему ?
Я уже посмотрел на свое приложение со всех точек зрения. Ни в шаблоне, ни в других методах нет ничего, что могло бы обновить реквизит от родителя.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Все функции массива не изменяют исходный массив.
Кроме sort ;)
И поскольку sort изменяет положение элементов в вашем массиве, срабатывает наблюдатель.
Делая 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
Ну тогда это многое объясняет. Спасибо за понимание!