onUpdated — это один из жизненных циклов композиционного
API во Vue 3, вызывающийся после того, как компонент и его шаблон были
обновлены в результате изменения реактивных данных. Тестирование
поведения, связанного с этим хуком, позволяет убедиться, что логика,
завязанная на обновления DOM, работает корректно.
onUpdatedonUpdated вызывается каждый раз после обновления
DOM, которое произошло вследствие изменения реактивного
состояния. Важно понимать:
Для тестирования используется библиотека Vue Test Utils (VTU) в сочетании с Jest или Vitest. Основные шаги:
import { mount } from '@vue/test-utils'
import { nextTick, defineComponent, ref, onUpdated } from 'vue'
onUpdated:const TestComponent = defineComponent({
setup() {
const count = ref(0)
const updatedCalls = ref(0)
onUpdated(() => {
updatedCalls.value += 1
})
const increment = () => {
count.value += 1
}
return { count, updatedCalls, increment }
},
template: `
<div>
<span class="count">{{ count }}</span>
<span class="updates">{{ updatedCalls }}</span>
<button @click="increment">Increment</button>
</div>
`
})
count — реактивное состояние, изменение которого
вызывает обновление.updatedCalls — счётчик вызовов onUpdated,
который используется для проверки работы хука.test('initial state', () => {
const wrapper = mount(TestComponent)
expect(wrapper.find('.count').text()).toBe('0')
expect(wrapper.find('.updates').text()).toBe('0')
})
onUpdated после изменения
состояния:test('onUpdated is called after state change', async () => {
const wrapper = mount(TestComponent)
await wrapper.find('button').trigger('click')
await nextTick() // Ждем следующего рендера
expect(wrapper.find('.count').text()).toBe('1')
expect(wrapper.find('.updates').text()).toBe('1')
})
Ключевые моменты:
await nextTick() необходим для ожидания завершения
обновления DOM.updatedCalls отражает точное количество вызовов
onUpdated.test('onUpdated is called multiple times', async () => {
const wrapper = mount(TestComponent)
await wrapper.find('button').trigger('click')
await nextTick()
await wrapper.find('button').trigger('click')
await nextTick()
expect(wrapper.find('.count').text()).toBe('2')
expect(wrapper.find('.updates').text()).toBe('2')
})
onUpdated часто используется для операций с DOM,
например, изменение стилей:
const DomComponent = defineComponent({
setup() {
const text = ref('Hello')
const highlight = ref(false)
onUpdated(() => {
if (highlight.value) {
document.querySelector('#message').classList.add('highlight')
}
})
const toggleHighlight = () => {
highlight.value = !highlight.value
}
return { text, highlight, toggleHighlight }
},
template: `
<div>
<p id="message">{{ text }}</p>
<button @click="toggleHighlight">Toggle Highlight</button>
</div>
`
})
Тестирование DOM-эффектов:
test('onUpdated applies class after state change', async () => {
const wrapper = mount(DomComponent)
const button = wrapper.find('button')
await button.trigger('click')
await nextTick()
expect(wrapper.find('#message').classes()).toContain('highlight')
})
onUpdatednextTick() после любого
изменения реактивного состояния.nextTick.await nextTick() после
каждого изменения.v-for и условным рендерингом важно
проверять, что обновления DOM отражают именно актуальные элементы.onUpdated, можно использовать моки и
спаи для проверки вызовов методов.onUpdated позволяет тестировать точку, когда компонент
полностью обновлён. Комбинация Vue Test Utils и nextTick
делает это надёжным и предсказуемым процессом, позволяя уверенно
проверять реактивные обновления и побочные эффекты на DOM.