公司项目主要是做股票及期货行情展示及交易,h5相应的做了一些功能---可以看行情图及模拟交易,实盘交易存在一定的风险,老板希望做自己的产品,这样h5就尴尬了,不过没关系,项目里还是有一定技术含量的---①设计到很多合约品种,场景多及复杂②设计一些功能模块的同时,后台没以前牛气了,这次需要他们的积极配合了(很感谢他们,主要是一些接口的配合),③涉及到大量的数据传输及缓存,④react组件与多组件配合使用(react+router+webpack+highstock+mobx)。下面图片可以说明上述几点问题:

废话不多说,问题如下:

一,官网的react-app脚手架 不支持ES7@装饰器 ,数据层需要用extendObservable 封装。需要用到数据的地方用inject包装获取下,代码如下(颜色字体):

//实时交易状态管理组件
import {extendObservable,observable, action} from 'mobx';// 官网的create_app 不支持es7的@装饰器 用extendObservable代替。
import UrlP from 'api/api';
import HttpP from "mixin/httpPub";
const Store = function(){
extendObservable(this, {//this指的就是 mobx Store
contractName:observable(""),//合约名字
/*历史订单*/
historyOrder:action(function(){
HttpP.NN_historyOrderP({data}).then(
(res)=>{
if(!res.result){
alert(res.message);
}else{
console.log(res)
if (res.result) {
。。。。。
}
}
}
);
}),
})
}
const traderStore = new Store();
export default traderStore;

 上面是全局数据层,下面是获取数据dom层。

 

// 策略页面
import React, { Component } from 'react';
import './index.css';
import pubFn from "mixin/pubFn.js";//公共函数
import {Link,withRouter} from "react-router-dom";
import {observer,inject} from 'mobx-react';//mobx管里页面 可以inject为父级传过来的props
const DifOrderList = inject("traderStore")(observer(class DifOrderList extends Component {
constructor(props) {
super(props);
this.state = { };
}
componentDidMount () { }
/*点击切换持仓 历史 */
typeClick (event) {/*请求订单历史数据*/this.props.traderStore.historyOrder();
}
render() {//列表的数量 来判断 合计dom 定位的位置
let style = {
top:1.06*arrL+"rem",
left:"0",
}
return (
<div className="difOrderList">
<ul className = "clearfix difOrderListTop">
{
this.state.arrTypeChange.map(
(Hname,index) =>
<li className = {Hname.clName} onClick = {this.typeClick.bind(this)} data-type = {Hname.type} key = {index}>{Hname.html}</li>
)
}
</ul>
<ul className = "clearfix difOrderListPro">
{
this.state.listA.map(
(Hname,index) =>
<li className = "fl" style = {this.state.styleH} key = {index}>{Hname}</li>
)
}
</ul>
</div>
);
}
}));
export default withRouter(DifOrderList);

二,数据缓存如何去做?

 合约列表在每次点击后,二次点击不需要再去后台请求历史数据,一是因为数据量大,二是因为不断请求大量数据,给后台增加好多压力,这样就不得不要求前端在数据层上做一下缓存,首先想到的就是localstorage。但是不同合约有不同分时图,不同k线图,所以数据储存是一个相当棘手的问题。

function FArr() {//三维数组

    for (var i = 0; i < 4; i++) {
publicArr.push([]);
}
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 8; j++) {
publicArr[i].push([]);
}
}
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 8; j++) {
for (var p = 0; p < 6; p++) {
publicArr[i][j].push([]);
}
}
}
}  

 想来想去,用了一个三维数组在本地存储数据,即:合约 k线类型 k线数据。但是在存储的时候,其实用的是合约信息作为属性来切换数组下标的以此存储不同的数据及对应不同的名称:  

  // 三维数组创建参数
  var publicArr = [];
  var M1 = 0,
  M3 = 1,
  M5 = 2,
  M15 = 3,
  M30 = 4,
  H1 = 5,
  D1 = 6,
  M50 = 7;
  var CL = 0,
  GC = 1,
  FDAX = 2,
  HSI = 3;
  var OP = 0,
  HI = 1,
  LO = 2,
  CLO = 3,
  VOL = 4,
  Time = 5;

  根据点击的合约,判断对应的下标。

  publicArr[typeName][cNewNum][CLO].push(data.close);
  publicArr[typeName][cNewNum][OP].push(data.open);
  publicArr[typeName][cNewNum][HI].push(data.high);
  publicArr[typeName][cNewNum][LO].push(data.low);
  publicArr[typeName][cNewNum][Time].push(data.time);
  publicArr[typeName][cNewNum][VOL].push(data.volume);

  但是那么多合约总不能用户点击一个存储一个,往往这里需要跟后台配合,根据用户习惯及产品需求,前端根据后台字段来判断要不要缓存此数据。

三,不合理写法:不要在render里直接把全局的数据拿来进行渲染(粉色字体),应该按蓝色字体进行修改,

  

render() {
  let ask = this.props.liveStore.handicapNavListObj.ask;
  let bid = this.props.liveStore.handicapNavListObj.bid;
 
    return (
<div className="futuresChangeNum clearfix">
<div className = "changeNumTop clearfix">
<div className = "fl clearfix changeNumTopLeft">
<div className = "clearfix changeNumTopLeftTop">
<i className = "fl"></i>
<input className = "fl" value={this.props.liveStore.handicapNavListObj.key.contractKey} type="text" onChange = {this.contractNameChange.bind(this)}/>
<b className = "fl"></b>
</div>
<div className = "clearfix changeNumTopLeftBot">
<div className = "fl clearfix changeNumTopLeftBotLeft">
<p className = "fl">手数</p>
<h4 className = "fl">{this.state.num}</h4>
</div>
<div className = "fl clearfix changeNumTopLeftBotRight">
<p className = "fl">价格</p>
<h4 className = "fl">{this.state.traderPricetype}</h4>
</div>
</div>
</div>
<div className = "fl changeNumTopRight">
<ul>
<li className = "clearfix">
<span className = "fl">新</span>
<h3 className = "fl">{this.props.liveStore.handicapNavListObj.lastPrice}</h3>
<strong className = "fl">{this.props.liveStore.handicapNavListObj.volume}</strong>
</li>
<li className = "clearfix" >
<span className = "fl">卖</span>
<h3 className = "fl">{bid}</h3>
<strong className = "fl">{this.props.liveStore.handicapNavListObj.bidSize}</strong>
</li>
<li className = "clearfix">
<span className = "fl">买</span>
<h3 className = "fl">{ask}</h3>
<strong className = "fl">{this.props.liveStore.handicapNavListObj.askSize}</strong>
</li>
</ul>
</div>
</div>
</div>
);
}

  四,在项目里好多地方需要切换画图,不管横屏简单展示还是竖屏技术指标数据展示,都需要第三方插件highstock拿来画图,也就是需要把此插件接口暴露在全局,把highstock封装了一个函数,用extendObservable给暴露在了全局

  

//第三方画图插件  highstock
import Highcharts from 'highcharts/highstock';
import {extendObservable,observable, action, computed, useStrict} from 'mobx';// 官网的create_app 不支持es7的@装饰器 用extendObservable代替。
var linecolor = "#000"; //x y轴线或刻度线的颜色值
var linecolor1 = "#2f84cc"; //k线图的颜色
var bgcolor = "#20212a"; //表格背景的颜色
Highcharts.setOptions({
global: { //设置为中国时间
useUTC: false
},
lang:{
rangeSelectorZoom:""
}
});
const ChartHcStore = function(){
extendObservable(this, {//this指的就是 mobox Store
chartsetK:observable({}),
isClickHc:action(function(id,time,data,weekflg,mk){
this.chartsetK = new Highcharts.StockChart(id, {
chart: { },
tooltip:weekflg == 'MK' ? { }, //数据提示框。
credits: { // 网站标识
enabled: false //去版权
},
navigator: { // 底部导航内容
enabled: false
},
scrollbar: {
enabled: false
},
}),
})
}
const chartHcStore = new ChartHcStore();
export default chartHcStore;

  五,k线展示时间问题:股票后台过来的数据由于时间存在不连续问题,导致前端在画图的时候 出现不连续,不均匀的k线图,为了使x轴连续性前端根据请求来的数据个数,自行往数据数组里添加连续的时间,但是就会存在用户在查看每条k线的时候,时间不正确,所以在tooltip里面,再把正确的时间给显示出来即可。

  


  data5MVoluem.push({
    x: time + i * 60000,//自行定义的时间 是连续的
    y: self.socket.volumDataAll[i],
    color: oo > cc ? "#70edab" : "red",//判断颜色
    trueTime: pubFn.getTime(tt)//数据真正的时间 是展示给用户看的  
  });

formatter: function() { //回调函数将格式化提示框中的文本。
var points = this.points;
// console.log(points)
if (points.length>=2) {
var t = new Date(points[1].point.options.trueTime);
var m = t.getMonth(); // 获取月份(0-11,0代表1月,用的时候记得加上1)
var d = t.getDate(); // 获取日(1-31)
var h = t.getHours(); // 获取小时数(0-23)
var mi = t.getMinutes(); // 获取分钟数(0-59)
var tStr = m+"/"+d+" "+h+":"+mi;
}
if (points[0].point.open != undefined) {
var s = '<div style=""><b style="color:#ccc">T:</b><span style="color:green;">'+tStr+'<span></div>'+
'<div style=""><b style="color:#ccc">最高:</b><span style="color:green;">'+points[0].point.high+'<span></div>'+
'<div style=""><b style="color:#ccc">最低:</b><span style="color:green;">'+points[0].point.low+'<span></div>'+
'<div style=""><b style="color:#ccc">开盘:</b><span style="color:green;">'+points[0].point.open+'<span></div>'+
'<div style=""><b style="color:#ccc">收盘:</b><span style="color:green;">'+points[0].point.close+'<span></div>';
}
return s;
}

   先写这么多吧,如今国家金融领域在开放,不免以后会有大量的期货在中国可以交易(昨天原油期上市了)有兴趣的朋友可以一起探讨,也希望js在这块领域做出自己的东西,而不再被那么轻视。谢谢。

react做股票、期货交易遇到的问题(不完全是react)及解决方法。的更多相关文章

  1. 使用nginx做反代时遇到413 Request Entity Too Large的解决方法

    在使用nginx做反向代理的时候,被反代的系统在上传文件的时候遇到413 错误 :Request Entity Too Large 原因是nginx限制了上传文件的大小,在nginx中可以配置最大允许 ...

  2. 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>

    Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...

  3. 《React Native 精解与实战》书籍连载「React Native 源码学习方法及其他资源」

    此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React Native 源码学习方法及其他资源. 最后的章节给大家介绍 React Native ...

  4. 《React Native 精解与实战》书籍连载「React Native 底层原理」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  5. .net 做工作流时,生成项目后工具箱里有关工作流的东西不显示解决方法

    在做工作流模块时,遇到一个比较棘手的问题,那就是生成项目后工具箱里有关工作流的东西不显示,这个问题令人百思不得其解,经过查阅英文网站,终于找到解决方法: 把项目中的建模项目移除掉,再重新生成,奇迹出现 ...

  6. React—Native开发之 Could not connect to development server(Android)解决方法

    作为初学者昨天还好好能跑的项目今天就会遇到突然爆红出错是经常的事,让我们来看下是什么错吧 先来翻译: 连接不到开发的服务器. 请按照以下的步骤来修复此问题: 确保包服务器在运行确保你的设备或者模拟器连 ...

  7. 《React Native 精解与实战》书籍连载「React 与 React Native 简介」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  8. React 开发常见报错解决方法

    1. 使用 redux 的异步 action 时浏览器报错: Error: Actions must be plain objects. Use custom middleware for async ...

  9. 记录vue用 html5+做移动APP 用barcode做扫一扫功能时安卓 的bug(黑屏、错位等等)和解决方法

    最近做项目时,要用到扫一扫二维码的功能,在html5+里面有提供barcode功能,于是照过来用了, 写的代码如下 : 扫码页面: <style lang="less" sc ...

随机推荐

  1. gRPC官方文档(概览)

    文章来自gRPC 官方文档中文版 概览 开始 欢迎进入 gRPC 的开发文档,gRPC 一开始由 google 开发,是一款语言中立.平台中立.开源的远程过程调用(RPC)系统. 本文档通过快速概述和 ...

  2. 2019-RHCE-红帽题库(稳定)

    rhce7 考题2台服务器设置yum源[aa]name=aabaesurl=ftp://server.rhce.cc/dvdenabled=1gpgcheck=0 cd /etc/yum.repos. ...

  3. 算法提高 合并石子(DP)

    问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入格式 输入第一行包含一个 ...

  4. 洛谷P3674 小清新人渣的本愿(莫队)

    传送门 由乃tql…… 然后抄了一波zcy大佬的题解 我们考虑把询问给离线,用莫队做 然后用bitset维护,每一位代表每一个数字是否存在,记为$now1$ 然后再记录一个$now1$的反串$now2 ...

  5. phaser小游戏框架学习(一)

    这两天由于项目的需要,所以简单学了一下phaser框架. 官网:http://phaser.io/ 还有一个phaser小站,是中文的网站,但是内容不如英文文档全,大家也可以去看这个网站,需要查阅AP ...

  6. Tarjan缩点+LCA【洛谷P2416】 泡芙

    P2416 泡芙 题目描述 火星猫经过一番努力终于到达了冥王星.他发现冥王星有 N 座城市,M 条无向边.火星猫准备出发去找冥王兔,他听说有若干泡芙掉落在一些边上,他准备采集一些去送给冥王兔.但是火星 ...

  7. 昂达v981平板刷机教程连接

    http://tieba.baidu.com/p/3721193574 http://www.ondabbs.cn/forum.php?mod=viewthread&tid=65393 htt ...

  8. [ZJOI2009]狼和羊的故事 BZOJ1412

    题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈 ...

  9. php字符串截取中文出现乱码解决

    在截取中文字符串时使用substr()容易出现乱码 可以使用mb_substr()用法与substr类似,但是比substr多了一个参数,第四个参数指定网页编码

  10. css3 matrix 矩阵

    2D矩阵变换 matrix(1,0,0,1,0,0) 对应 matrix (a,b,c,d,e,f) 其中,x, y表示转换元素的所有坐标(变量)了, 3*3矩阵每一行的第1个值与后面1*3的第1个值 ...