【发布时间】:2019-07-14 12:43:27
【问题描述】:
我正在制作一个基本的聊天组件,它将消息从 firebase 加载到 div 中。
- 目标是在
relevantMessages更改时自动滚动到 div 的底部,如果当前滚动位置已经接近 底部。
我尝试通过向relevantMessages 添加一个调用'scrollToBottom' `方法的观察者来做到这一点。
问题是:观察者“relevantMessages”的回调错误:
“TypeError:无法读取未定义的属性'scrollTop'”
HTML:
<template>
<div class="all">
<div class="chat-header">
...
</div>
<div class="messages-area" id="messages-area-id" ref="messagesAreaRef">
<div
v-for="(thing, index) in relevantMessages"
:key="index"
class="message-row"
>
<div class="message">
<span>{{thing.content}}</span>
<span>{{thing.timeStamp}}</span>
</div>
</div>
</div>
<div class="input-area">
...
</div>
</template>
JS:
<script>
import firebase from "firebase";
export default {
data() {
return {
relevantMessages: Object,
partnerObj: null
};
},
computed: {
...
},
props: {
...
},
mounted: function() {
this.getMessages();
this.getPartner();
},
watch: {
relevantMessages: function() {
this.scrollToBottom();
}
},
methods: {
getMessages: function() {
var that = this;
firebase
.database()
.ref("/messages/" + that.conversationUID)
.on("value", function(messages) {
var result = messages.val();
that.relevantMessages = result;
});
console.log("getting posts");
},
sendMessage: function() {
...
},
scrollToBottom: function() {
var messagesArea = this.$refs.messagesAreaRef;
// var messagesArea = document.getElementById("messages-area-id");
var currentScrollPos = messagesArea.scrollTop;
// console.log(currentScrollPos);
var totalDivHeight = messagesArea.scrollHeight;
if (currentScrollPos <= totalDivHeight - 100) {
messagesArea.scrollTop(totalDivHeight);
}
}
}
};
错误本身:
vue.runtime.esm.js?2b0e:619 [Vue 警告]:观察者“relevantMessages”的回调错误:“TypeError:无法读取未定义的属性 'scrollTop'”
TypeError: 无法读取未定义的属性“scrollTop”
【问题讨论】:
-
它与
document.getElementById("messages-area-id")一起使用了吗? -
你试过检查 this.$refs 的值吗?
-
@Dadboz 不,它也不起作用。我可以通过引用 div 的 ID 毫无问题地更改 CSS,所以它肯定在那里找到它,所以我不明白为什么它不工作
-
@cppstudy 当我控制台记录 ref 和 getElementById 时,它们都正确地控制台记录