Ваш наблюдатель будет реагировать только на мутации массива напрямую (например, добавление или удаление элемента из него). Чтобы наблюдать за изменениями элементов в массиве, вам также необходимо использовать глубокий наблюдатель.
Кроме того, всякий раз, когда вы зацикливаетесь на массиве и удаляете элементы из массива одновременно, вы должны выполнять итерацию в в обратном порядке, в противном случае вы пропустите некоторые элементы.
watch: {
getErrors: {
deep: true,
handler(newErrors) {
for (let i = newErrors.length - 1; i >= 0; i--) {
if (!newErrors[i].error) {
newErrors.splice(i, 1)
}
}
}
}
}
Обратите внимание, что это может вызвать еще один вызов обработчику, поскольку вы изменяете объект, который вы наблюдаете.
EDIT
Спасибо за codeandbox .
Эта проблема связана с <v-snackbar>
, не обновляющим модель. Я не совсем уверен, как реализован <v-snackbar>
, но кажется, что когда компонент используется повторно, его таймаут отменяется, и он не генерирует событие input
. Некоторые компоненты повторно используются в результате одновременного добавления и удаления нескольких ошибок.
Вам необходимо правильно назначить каждому <v-snackbar>
один и тот же объект error
. Прямо сейчас у вас есть ключ по индексу в массиве, но это изменится, когда элементы будут удалены из массива. Таким образом, мы должны придумать свой собственный уникальный идентификатор для каждого объекта ошибки.
Вот выдержка из изменений кода, которые необходимо внести:
// Define this at file-level
let nextKey = 1
mutations: {
setError: (state, message) => {
state.errors.push({
key: nextKey++,
error: true,
message,
})
}
}
<v-snackbar
v-for="error in getErrors"
:key="error.key"
>