我试图在vue中向下滚动新出现的元素:
我有两个数组的聊天消息:
data() {
return {
activeChats: [],
openedChats: [],
maxOpened: math.round(window.innerWidth / 300),
}
}
当我收到新消息并且对话不在活动和打开的数组中时,我将两者添加到屏幕上,因为我在两个数组上都使用了v-for
。
这一切正常,但是当出现新的聊天时,我不确定如何在div上向下滚动,我尝试使用裁判,但没有运气:
<div class="chat" v-for="chat in openedChats" ref="chat-{chat.id}"></div>
甚至只是打开一个聊天就进行聊天测试。
成功之后,在axios then()
里面,我说:
this.$refs.chat['-'+response.data.id].scrollTo(9999999,99999999);
or
this.$refs.chat['-'+response.data.id].scrollTop = 99999999;
or
this.$refs.chat.scrollTo(9999999,99999999);
or
this.$refs.chat.scrollTop = 99999999;
两者都不起作用...
有什么帮助吗? :D
可以在没有附加库的情况下完成此操作,我不需要动画就可以出现在元素的底部...
谢谢
答案 0 :(得分:1)
请参见以下示例:
https://jsfiddle.net/eywraw8t/430100/
使用“ watch”(https://vuejs.org/v2/guide/computed.html)来检测消息数组中的更改(从ajax或仅是示例中的一个按钮)。
根据邮件的索引设置ID(或者您可以根据需要使用ref)。
然后滚动到数组中的最后一个元素(通过array.length
获取最后一个)。
new Vue({
el: "#app",
data: {
messages: [
{ id: 1, text: 'message' },
],
},
watch:
{
messages: function() {
let id = this.messages.length;
//takes a bit for dom to actually update
setTimeout(function() {
document.getElementById('message-' + id).scrollIntoView();
}, 100);
},
},
methods: {
addMessage: function(){
let id = this.messages.length + 1;
this.messages.push({ id: id, text: 'message'});
}
}
})
<div id="app">
<button v-on:click="addMessage()" style="position:fixed">
Add message
</button>
<div class="message" v-for="message in messages" :id="'message-' + message.id">
{{message.text}} {{ message.id}}
</div>
</div>