前端大屏数据实时更新

文章探讨了三种前端实时获取数据的方法:1)使用setInterval定时轮询,但可能造成性能问题;2)websocket需要后端配合且协议复杂;3)Server-SentEvents(SSE)是一种轻量级的推送方式,支持断线重连且易于实现。并给出了SSE的客户端和服务端实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 方案一:

在页面中使用 setInterval 每隔几秒去获取一下数据。伪代码如下:

created() {
    this.getLatestData()
},
destroyed(){
    clearInterval(this.timerId)
}
methods: {
 getLatestData() {
     this.timerId = setInterval(async() => {
        const res = await getLatestDataApi()
        const { data } = res
        this.list = data
      }, 1000 * 5)
    }
}

一般不建议这样使用,因为会给页面造成性能问题。

2. 方案二:

使用 websocket
如果使用 websocket 纯前端无法独立完成,需要后台 配合提供相应的接口。

3. 方案三:

使用SSE(Server-Sent Events), 纯前端无法独立完成,需要后台 配合提供相应的接口。

SSE优点

  • SSE 使用 HTTP 协议,现有的服务器软件都支持。WebSocket 是一个独立协议。
  • SSE 属于轻量级,使用简单;WebSocket 协议相对复杂。
  • SSE 默认支持断线重连,WebSocket 需要自己实现。
  • SSE 一般只用来传送文本,二进制数据需要编码后传送,WebSocket 默认支持传送二进制数据。
  • SSE 支持自定义发送的消息类型。

实现代码如下:

客户端:

created(){
    this.getDataList()
},
methods: {
   getDataList() {
      var _this = this
      // 使用node来启一个服务
      const source = new EventSource('http://localhost:9528/getlist')
      // readyState
      // 0 可能是第一次链接,也可能是断开链接了又重新链接,客户端和服务器正在链接,还没有链接上
      // 1 客户端和服务器链接上了,就可以接受服务器数据
      // 2 彻底断开链接并且不在重连
      console.log('source==>', source)
      console.log(EventSource.CONNECTING) // 0
      console.log(EventSource.OPEN) // 1
      console.log(EventSource.CLOSED) // 2

      // open事件是 客户端和服务器链接上触发
      source.onopen = function(event) {
        console.log('onopen===>', event)
      }
      // message 事件 是服务器向客户度发送消息时触发
      source.onmessage = function(event) {
        console.log('onmessage===>', event)
        // 服务端发送的数据 event.data
        _this.orderList = JSON.parse(event.data)
      }
      // 是服务器和客户端 链接出错时触发
      source.onerror = function(event) {
        console.log('onerror===>', event)
      }
    }
}

服务端:

使用node简单的启动一个服务:

mockData.js

// const orderData = [
//   {
//     date: '2022-9-27',
//     order: 50,
//     returnOrder: 2
//   },
//   {
//     date: '2022-9-27',
//     order: 50,
//     returnOrder: 2
//   }
// ]

// console.log(orderData)

 function getOrderList() {
  const orderData = []
  for (let i = 1; i <= 30; i++) {
    orderData.push({
      date: `2022-09-${i > 9 ? i : '0' + i}`,
      order: randomLowerBUpper(50, 100),
      returnOrder: randomLowerBUpper(5, 10)
    })
  }
  return orderData
}

function randomLowerBUpper(lower, upper) {
  const choice = upper - lower + 1
  return Math.floor(Math.random() * choice + lower)
}

module.exports = getOrderList

index.js

const http = require('http');
const getOrderList = require('./mockData.js')

const server = http.createServer((req,res)=>{
  const url = req.url
  console.log(url);
  // 发送 data 由 message组成 \n\n
  // mesage id,data,retry,event
  // data:数据
  if(url=="/getlist"){
    res.writeHead(200, {
      "Content-Type":"text/event-stream",
      "Cache-Control":"no-cache",
      "Connection":"keep-alive",
      "Access-Control-Allow-Origin": '*', // 解决跨域
    });
    res.write("retry: 10000\n");
    interval = setInterval(function () {
      res.write("data: " + JSON.stringify(getOrderList()) + "\n\n");
    }, 1000*5);

    req.connection.addListener("close", function () {
      clearInterval(interval);
    }, false);
  }
  // res.end()
})

server.listen(9528,()=>{
  console.log("服务已启动。。。端口9528");
})

参考文章

### 实现前端页面数据实时更新的技术方案 #### 技术栈选择 为了实现高效稳定的前端项目中的数据实时刷新与展示,推荐采用Vue.js作为核心框架[^2]。该框架具有良好的双向绑定机制以及组件化开发模式,非常适合构建交互性强的应用程序。 对于图表绘制部分,则可以选用Echarts库来完成复杂多样的图形呈现工作。所有ECharts图表均基于`common/echart/index.vue`封装好的组件创建而成,并已内置对数据变化及幕尺寸调整的支持功能,确保视图层能及时响应底层逻辑变动并作出相应修改。 #### 数据传输方式 考虑到传统轮询方式存在资源浪费等问题,在此建议引入WebSocket协议用于建立持久连接通道。一旦服务器端检测到任何新的事件触发或是状态迁移情况发生时,即可立即经由此管道向客户端推送最新信息而不必等待下一次查询请求的到来;与此同时,Spring Boot平台下的WebSocket集成十分简便——只需简单继承自定义处理器类并覆盖其中若干抽象方法便足以满足基本需求[^4]。 具体来说: - **服务端**:利用Java编写后台接口负责处理业务流程并向指定会话对象广播变更通知; - **客户端**:借助JavaScript API操作DOM节点接收来自网络的消息体内容进而驱动UI层面的变化过程。 ```javascript // 前端 WebSocket 连接初始化代码片段 const socket = new WebSocket('ws://localhost:8080/websocket'); socket.onmessage = function(event) { const data = JSON.parse(event.data); // 更新 ECharts 图表实例的数据集 myChart.setOption({ series: [{ data: data.seriesData, }] }); }; ``` 此外,针对频繁发生的布局结构调整动作还特别加入了防抖动优化措施以减少不必要的重绘次数从而提升整体性能表现水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值