如何通过Socket向Trading Vue.js的DataCube添加数据并实时更新图表?
Trading Vue.js 实时数据更新(Socket 实现)
基础代码回顾
<template> <trading-vue :data="dc" :extensions="ext"/> </template> <script> import TradingVue from 'trading-vue-js' import XP from 'tvjs-xp' import { DataCube } from 'trading-vue-js' export default { name: 'app', components: { TradingVue }, data() { return { ext: Object.values(XP), dc: new DataCube({ // 初始化K线数据结构:[时间戳, 开盘价, 最高价, 最低价, 收盘价, 成交量] ohlcv: [ [1620000000000, 50, 60, 45, 55, 1000] ] }) } } } </script>
问题1:通过Socket向DataCube添加新数据
核心是建立Socket连接,在消息回调中调用DataCube的append方法添加符合格式的新数据,步骤如下:
- 在组件
mounted钩子中创建Socket连接(以WebSocket为例) - 监听Socket的
message事件,解析收到的实时数据 - 调用
dc.append(序列名称, 新数据)完成添加
实现代码示例
<script> // ... 导入部分不变 export default { // ... 其他配置不变 mounted() { // 替换为你的实时数据Socket地址 const socket = new WebSocket('ws://your-realtime-server.com') socket.onmessage = (event) => { // 解析Socket返回的单条K线数据,格式需与初始化的ohlcv一致 const newKline = JSON.parse(event.data) // 向ohlcv序列添加新数据 this.dc.append('ohlcv', newKline) } // 可选:处理连接关闭、错误 socket.onclose = () => console.log('Socket连接关闭') socket.onerror = (err) => console.error('Socket错误:', err) } } </script>
问题2:监听实时数据实现图表实时更新
Trading Vue.js的DataCube自带响应式特性,修改数据后图表会自动更新。需区分两种常见场景处理:
场景1:添加新的已闭合K线
直接用append方法添加完整K线数据:
// 新的完整K线数据 const newClosedKline = [1620003600000, 55, 65, 52, 60, 1200] this.dc.append('ohlcv', newClosedKline)
场景2:更新当前未闭合的实时K线
用updateLast方法刷新最后一条K线的最新状态(比如实时价格、成交量):
// 当前K线的最新数据 const updatedCurrentKline = [1620003600000, 55, 68, 52, 63, 1500] this.dc.updateLast('ohlcv', updatedCurrentKline)
完整综合实现
<script> // ... 导入部分不变 export default { name: 'app', components: { TradingVue }, data() { return { ext: Object.values(XP), dc: new DataCube({ ohlcv: [ [1620000000000, 50, 60, 45, 55, 1000], [1620003600000, 55, 65, 52, 60, 1200] ] }), socket: null } }, mounted() { this.initSocket() }, beforeUnmount() { // 组件销毁前关闭Socket,避免内存泄漏 this.socket?.close() }, methods: { initSocket() { this.socket = new WebSocket('ws://your-realtime-server.com') this.socket.onopen = () => { console.log('Socket连接成功') // 可选:向服务器发送订阅请求 this.socket.send(JSON.stringify({ action: 'subscribe', symbol: 'BTC/USDT' })) } this.socket.onmessage = (event) => { const data = JSON.parse(event.data) // 根据后端返回的类型区分处理 if (data.type === 'new') { this.dc.append('ohlcv', data.kline) } else if (data.type === 'update') { this.dc.updateLast('ohlcv', data.kline) } } } } } </script>
关键注意事项
- 确保Socket返回的数据格式与DataCube中对应序列的格式完全匹配
- 自定义指标序列(如折线图数据)的更新逻辑与K线完全一致,只需替换序列名称
- 组件销毁时必须关闭Socket连接,避免无用连接占用资源
内容的提问来源于stack exchange,提问作者omurozbek
相关产品推荐
相关产品推荐

