优化思路:
把websocket接收到的数据用一个数组存起来,达到一定长度再统一渲染,可根据推送数据的速度适当调解数组长度限制,如果一段时间内改数组长度打不要渲染条件,就用定时器之间渲染
data() {
return {
tempDataWsList: [], // 存放临时ws数据数组
list: [], // 页面上的列表
listCopy: [], // 深拷贝的初始化列表数据,用于统一渲染
}
}
methods: {
...
// websocket接收数据的方法
onMessage(data) {
if (data.data) {
// 将Json字符串转译
const dataWs = JSON.parse(data.data);
// 将转译后的数据推入临时ws数据数组中
this.tempDataWsList.push(dataWs);
// 有ws数据就关闭定时器
clearTimeout(this.wsTimeout);
// 做缓存渲染,将ws接收到的数据放到数组,满10个就统一渲染
if (this.tempDataWsList.length == 10) {
this.handleList();
} else {
// 如果最后一个接收后1秒钟内不能满足10个,则直接渲染
this.wsTimeout = setTimeout(() => {
this.handleList();
}, 1000);
}
}
},
// 操作数据渲染
handleList() {
// 循环临时ws数据数组
this.tempDataWsList.forEach(temp => {
// 循环深拷贝的初始化列表数据
this.listCopy.forEach(item => {
// 循环判断列表对应ws数据id,修改深拷贝列表上的值
item.pointDetails.forEach(item1 => {
if (item1.id == temp.detailsId) {
item1.value = temp.realVal;
}
});
});
});
// 清空临时ws数据数组
this.tempDataWsList = [];
// 将修改的列表数据赋值给页面渲染
this.list = this.listCopy;
}
}