javascript - VueJS 数据返回数组不与模板反应
问题描述
我正在使用 VueJS 和 socket.io 为管理员和客户制作一个聊天系统。当客户端连接到服务器并输入名称时,它应该在管理员聊天中添加一个带有客户端名称的新行。当他们断开连接时,它应该从管理员聊天列表中删除。但这不起作用。我必须强制重新加载页面,然后聊天就消失了。
模板:
<div class="chats" id="chat" v-if="chats.length >= 1">
<div class="chat" v-for="chat in chats">
<b>{{ chat.clientName }}</b>
<p>ID: {{ chat.clientID }}</p>
<div class="jens-button">
<img src="/icons/chat-bubble.svg">
</div>
</div>
</div>
<div class="chats" v-else>
<div class="chat">
<b>There are no chats avaiable.</b>
</div>
</div>
数据:
data() {
return {
chats: [],
}
},
method() {
socket.on('update clients', (clients) => {
console.log(clients);
this.chats = [];
if(clients.length >= 1) {
this.chats = clients;
} else {
this.chats = [];
}
});
}
出了什么问题?如果有人找到答案,您能否也给我一个解释为什么它不起作用?谢谢!
解决方案
你现在得到它的方式不是在 Vue中声明方法的有效方式。这样你socket.on
就永远不会被宣布。请利用mounted()
. 您可以在此处阅读有关组件生命周期的更多信息。
一个准系统示例如下。还要确保在:key
您的v-for
.
<div class="chats" id="chat" v-if="chats.length >= 1">
<div class="chat" v-for="chat in chats" :key="chat.clientID">
data() {
return {
chats: [],
}
},
mounted() {
socket.on('update clients', (clients) => {
// You could also declare a dedicated method for this instead of doing it inline
console.log(clients);
if(clients.length >= 1) {
this.chats = clients;
} else {
this.chats = [];
}
});
}
推荐阅读
- elasticsearch - 如何使用已删除的字段进行指纹识别?
- django - 如何使用 Django 为获取参数定义默认值?
- spring-boot - 如何查询存储在redis中的对象?SpringBoot
- c++ - 在 Array/Vector 容器中存储虚拟函数
- java - 无法使用 Android Nested DataBinding 传递可绘制值
- string - 如何在 Haskell 中列出开始/结束索引?
- google-cloud-platform - DNS 转发在 VPC 中不起作用,该 VPC 与另一个拥有所有网络以访问 VPN 资源的 vpc 对等
- python - Python矩阵 - 找出距离每所房子最多K的空单元格的数量
- css - 将本地字体转换为 Google 字体 CDN
- c++ - 当输入为 EOF 时,std::cin.get(c) 如何设置 c?