uniapp使用HQChart的k线,用webSocket更新数据

项目:不借用HQChart的各种接口数据,即数据后端返回,但是数据格式要和原数据格式一样。

js 复制代码
//k线图
CreateHQChartKLine(){
	var chartHeight=uni.upx2px(this.ChartHeight);
	let hqchartCtrl=this.$refs.HQChartCtrl;
	hqchartCtrl.KLine.Option.Type="历史K线图";
	hqchartCtrl.KLine.Option.Language = uni.getLocale() == 'zh-CN' ? 'CN' : uni.getLocale() == 'zh-HK' ? 'TC' : 'EN'//设置语言
	hqchartCtrl.KLine.Option.DragDownload = {Minute:{Enable:true}}
	hqchartCtrl.KLine.Option.IsApiPeriod=true;
	hqchartCtrl.KLine.Option.Border.Right=1;
	hqchartCtrl.KLine.Option.Border.Left=1;
	hqchartCtrl.KLine.Option.Border.Top=0;
	hqchartCtrl.KLine.Option.Border.Bottom=25;
	hqchartCtrl.KLine.Option.IsCorssOnlyDrawKLine = false
	hqchartCtrl.KLine.Option.CorssCursorTouchEnd = true
	hqchartCtrl.KLine.Option.EnableScrollUpDown = true//手势上下允许滚动页面
	hqchartCtrl.KLine.Option.IsClickShowCorssCursor = false
	hqchartCtrl.KLine.Option.IsFullDraw=true;
	hqchartCtrl.KLine.Option.Windows = [
		{
			Index: "MA",
			Modify: true,
			Change: true,
			IsMainIndex: true,
		},
		{
			Index: "VOL",
			Modify: false,
			Change: false
		}
	]
	hqchartCtrl.KLine.Option.Frame = [
		{
			SplitCount: 4, //最多输出3个分隔线
			IsShowLeftText: false, //不显示左边刻度文字
			IsShowRightText: true, //显示右边刻度文字
		},
		{
			SplitCount: 2, //最多输出3个分隔线
			IsShowLeftText: false, //不显示左边刻度文字
			IsShowRightText: true, //显示右边刻度文字
		}
	]
	hqchartCtrl.KLine.Option.KLine = {
		Right: 0, //复权 0 不复权 1 前复权 2 后复权
		Period: 6, //周期: 0 日线 1 周线 2 月线 3 年线
		PageSize: 50,
		IsShowTooltip: false,//是否显示K线的tooltip信息
	}
	hqchartCtrl.KLine.Option.ExtendChart = [{Name: 'KLineTooltip'}]
	hqchartCtrl.KLine.Option.SplashTitle = ' ';

	let coinPrecision = uni.getStorageSync('coinPrecision')
	//设置保留小数位数
	// #ifdef H5
	// h5在this.DrawMaxMinPrice(26741 - umychart.uniapp.h5.js 2个Number()中)
	// 深度图 FrameSplitXDepth 46569 umychart.uniapp.h5.js Number()
	//this.SplitDefault 44919 umychart.uniapp.h5.js Number()
	HQChart.MARKET_SUFFIX_NAME.GetDefaultDecimal=(symbol)=> { return coinPrecision[this.detailMsg.coin].precision }
	// #endif
	// #ifndef H5
	// app在this.DrawMaxMinPrice(1541 - umychart.chartpaint.wechat.js 2个Number()中)
	//this.SplitDefault 627 umychart.framesplit.wechat.js
	JSCommon.MARKET_SUFFIX_NAME.GetDefaultDecimal=(symbol)=> { return coinPrecision[this.detailMsg.coin].precision }
	// #endif

	hqchartCtrl.NetworkFilter=this.NetworkFilterKLine;//不使用插件接口,数据由后端返回
	hqchartCtrl.SetSize(uni.upx2px(this.ChartWidth),chartHeight);
	hqchartCtrl.OnSize();
	hqchartCtrl.CreateHQChart()
	hqchartCtrl.ChangeKLineIndex(this.kSetList[this.kSetIndex].windowId, this.kSetList[this.kSetIndex].name) //设置主图、MA\BOLL\隐藏
},
NetworkFilterKLine(data, callback){
	data.PreventDefault=true;//阻止插件接口请求
	var hqChartData={code:0, data:[]};
	hqChartData.symbol=this.detailMsg.coin + this.detailMsg.quoteUnit
	hqChartData.name=this.detailMsg.coin + this.detailMsg.quoteUnit
	if(data.Name == 'KLineChartContainer::RequestDragMinuteData'){//拉到最左侧,获取下一页数据
		this.page++
	}
	let a = {
		maxTime:this.page == 1 ? 0 : this.kLinesList[0].time,
		quote_unit:this.detailMsg.quoteUnit,
		pageSize:100,
		interval:this.kList[this.kCurrent].key,
		page:this.page,
		coin:this.detailMsg.coin
	}
	if(data.Name == 'KLineChartContainer::ReqeustHistoryMinuteData' || data.Name == 'KLineChartContainer::RequestDragMinuteData'){
		getKLinesDetail(a).then(res=>{
			if(res.code == 1){
				if(res.data.length != 0){
					this.kLinesList = res.data
					let arr = []
					res.data.forEach((item,index)=>{
						//时间、null、开、高、低、收、量 插件的数据格式,time已经被我改成uview时间格式化形式,如果不想该源代码,就跟着作者大佬的数据结构来
						let objArr = [Number(item.time),null,Number(item.open),Number(item.high),Number(item.low),Number(item.close),Number(item.volume)]
						arr.push(objArr)
					})
					this.kLinesArr = this.page == 1 ? arr : this.kLinesArr.concat(arr)
					hqChartData.data = this.kLinesArr.sort(this.geiSfun())//重新排序
					// #ifdef H5
					callback(hqChartData);
					// #endif
					// #ifndef H5
					callback({data:hqChartData});
					// #endif
				}
			}
		})
	}
	//webSocket - 更新K线
	uni.$on('webSocket', item => {
	  if (!isJSON(item.data.msgContent)){
	    return
	  }
	  if (item.data.msgType==3&&this.kLinesList&&this.kLinesArr){
	    let kObj = JSON.parse(item.data.msgContent)
	    if(kObj.coin == this.detailMsg.coin){
	      	// 时间、null、开、高、低、收、量
	      	let kArr = [Number(kObj.time),null,Number(kObj.open),Number(kObj.high),Number(kObj.low),Number(kObj.close),Number(kObj.volume)]
			let itemIndex = this.kLinesArr.findIndex(item => {
			    return item[0] == Number(kObj.time);
			});
			//查询webSocket的数据是否存在kLinesArr数组中,存在替换,不存在添加
			//因为项目的webSocket有时候会推送时间相同但是其他不同的数据,要查询到该时间所在下标并且替换,不要问为什么,问就是k线就是这么搞的(我也不懂,鶸)
			if(itemIndex == -1){
				this.kLinesArr.push(kArr)
			}else{
				this.kLinesArr[itemIndex] = kArr
			}
	      	let d = {code:0, data:[],ver:2}
	      	d.data = this.kLinesArr.sort(this.geiSfun())
			callback(d)
	    }
	  }
	})
},
geiSfun(){
	return function (a, b) {
		return a[0] - b[0];
	}
},
相关推荐
不爱说话郭德纲2 小时前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
HashTang1 天前
【AI 编程实战】第 12 篇:从 0 到 1 的回顾 - 项目总结与 AI 协作心得
前端·uni-app·ai编程
JunjunZ1 天前
uniapp 文件预览:从文件流到多格式预览的完整实现
前端·uni-app
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
TT_Close2 天前
“啪啪啪”三下键盘,极速拉起你的 uni-app 项目!
vue.js·uni-app·前端工程化
特立独行的猫a2 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x
小扎仙森2 天前
关于阿里云实时语音翻译-Gummy推送WebSocket
websocket·阿里云·云计算
00后整顿职场2 天前
Hbuilderx APP真机无法识别iqoo Z9+手机设备解决方案
uni-app·uniapp真机调试·真机运行
前端小雪的博客.2 天前
【保姆级教程】uniAI 插件高效开发 uni-app 微信小程序(附实战案例)
微信小程序·uni-app·ai编程·uniai
T^T尚2 天前
一个完整的项目怎么打包成为一个app
前端·uni-app