Открываем
документацию, читаем:
Обратите внимание: когда изменяете (а не заменяете) объект или массив, старое и новое значения при вызове коллбэка будут совпадать, так как они ссылаются на один и тот же объект или массив. Vue не сохраняет копии объекта на момент, предшествовавший изменениям.
Хотите иметь доступ к старому значению - следите не за всем объектом, а только за нужным свойством:
watch: {
'obj.propName'(newValue, oldValue) {
...
},
},
Если же надо следить за многими свойствами сразу, и создавать отдельный наблюдатель под каждое не хотите... Ну, вон там выше, в цитате из документации, прозрачно намекается, что делать - вместо изменения свойства заменяйте объект целиком на новый. Т.е., было
obj.propName = value
, а будет
obj = { ...obj, propName: value }
. Ну а дальше можно уже сравнивать свойства в старом и новом объектах, чтобы найти, какое конкретно было изменено.