On gists
nextTick
Vue.js
component.vue
Raw
#
<!--
https://chafikgharbi.com/vuejs-nexttick/
https://codepen.io/chafikgharbi/pen/WNGarPG
-->
<template>
<div id="app">
<div ref="box" class="box">
<div v-for="(message, key) in messages" :key="key">{{message.body}}</div>
...
</div>
<button v-on:click="addMessage">Add message</button>
</div>
</template>
<style>
.box {
height: 100px;
width: 300px;
overflow: scroll;
border: 1px solid #000
}
</style>
<script>
export default {
name: "App",
data: () => {
return {
messages: [
{ body: "Message 1" },
{ body: "Message 2" },
{ body: "Message 3" },
{ body: "Message 4" },
{ body: "Message 5" }
]
};
},
methods: {
async addMessage() {
// Add message
this.messages.push({ body: `Message ${this.messages.length+1}`})
// Scroll bottom
this.$refs.box.scrollTop = this.$refs.box.scrollHeight
},
async addMessage() {
// Add message
this.messages.push({ body: `Message ${this.messages.length+1}`})
// Wait for DOM to update
await this.$nextTick()
// Scroll bottom
this.$refs.box.scrollTop = this.$refs.box.scrollHeight
},
async addMessage() {
// Add message
this.messages.push({ body: `Message ${this.messages.length+1}`})
// Wait for DOM to updaten then scroll down
this.$nextTick(() => {
this.$refs.box.scrollTop = this.$refs.box.scrollHeight
})
}
}
};
</script>