Probably I missed something in the docs, but I've noticed that updated hook is not called when component's root element is wrapped in a transition. But it works as expected in Vue 2. Here's 2 simple examples.
Vue 2:
Vue.component('test-component', {
template: `
<transition name="fade" appear>
<div>
<button @click="counter++">Add</button>
<div class="wraper" style="width: 100px;">
<div>Counter: {{counter}}</div>
</div>
</div>
</transition>`,
data() {
return {
counter: 0
}
},
updated() {
console.log("updated")
}
});
const app = new Vue({
el: '#app'
});
.fade-enter-active,
.fade-leave-active {
transition: opacity 1s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<test-component></test-component>
</div>
Vue 3:
const app = Vue.createApp({});
app.component('test-component', {
template: `
<transition name="fade" appear>
<div>
<button @click="counter++">Add</button>
<div class="wraper" style="width: 100px;">
<div>Counter: {{counter}}</div>
</div>
</div>
</transition>`,
data() {
return {
counter: 0,
}
},
updated() {
console.log("updated")
}
})
app.mount('#app');
.fade-enter-active,
.fade-leave-active {
transition: opacity 1s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
<test-component></test-component>
</div>
Vue 3 (without transition):
const app = Vue.createApp({});
app.component('test-component', {
template: `
<div>
<button @click="counter++">Add</button>
<div class="wraper" style="width: 100px;">
<div>Counter: {{counter}}</div>
</div>
</div>
`,
data() {
return {
counter: 0,
}
},
updated() {
console.log("updated")
}
})
app.mount('#app');
.fade-enter-active,
.fade-leave-active {
transition: opacity 1s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
<test-component></test-component>
</div>
Can someone explain me why is this occurring? Thanks.