在vue.js中保留DOM更新上的滚动位置

时间:2019-02-19 11:38:13

标签: javascript html vue.js

我有一个聊天应用程序,该应用程序加载最近的聊天消息并将其存储在messages数组中。以前的聊天记录将滚动加载,并将被添加到messages数组的开头。载入历史记录时,我需要保留滚动位置

//chat.vue
<div ref="chatHistory" @scroll="fetchHistory">
    <div v-for="item in messages" :key="item.id">
        <span>{{item.body}}</span>              
    </div>
</div>

fetchHistory方法中,我将旧消息添加到messages数组的开头

fetchHistory(){
    if(this.$refs.messageHistory.scrollTop == 0){
        var vm = this
        this.currentPage.prevPage().then(paginator => {
            vm.messages.unshift(...paginator.messages)
        });
    }
}

1 个答案:

答案 0 :(得分:1)

nextTick()函数中从最终高度减去初始高度并更新滚动位置

fetchHistory(){
    if(this.$refs.messageHistory.scrollTop == 0){
        var initialHeight = this.$refs.messageHistory.scrollHeight
        var vm = this
        this.currentPage.prevPage().then(paginator => {
            vm.messages.unshift(...paginator.messages)
            vm.$nextTick(() => {
              vm.$refs.messageHistory.scrollTop = vm.$refs.messageHistory.scrollHeight - initialHeight
            })
        });
    }
}