前端/h5/React D3.js实现根据数据动态更新图形/类似进度实时变化效果
最近接到一个需求,在满足规则下,实现类似这种展示效果,其实就是用图形反映数据(NK,一种干扰值)
运行后,它其实是不断在动的,每格都可能显示灰色或者彩色
这里一共是10个格子,每格代表一个范围边界,说明如下
规则:颜色条設定,共十格 N = 1 - 10,边界值 max value = 2^(N/2) 并取小数点第一位进行四舍五入,得到一组边界值:1/2/3/4/6/8/11/16/23/32,最后一格沒有上限=24~无限大
即是說,数值等于或大于24,到无限大,属于第十級(格)。另外,达到的格显示彩色,未达到的显示灰色
这里要解决2个问题
1.绘制图形
2.动态更新
技术栈:React+d3 v4
<svg className="barChart1" ></svg>
1.绘制图形
print = () => { const colors = [
'#eeeeee',
'#eeeeee',
'#eeeeee',
'#eeeeee',
'#eeeeee',
'#eeeeee',
'#eeeeee',
'#eeeeee',
'#eeeeee',
'#eeeeee',
] // 定义svg图形宽高,以及柱状图间距
const svgWidth = 7 * colors.length
const svgHeight = 20
const barPadding = 2 // 通过图形计算每个柱状宽度
const barWidth = (svgWidth / colors.length) const svg = d3.select('.barChart1')
.attr('width', svgWidth)
.attr('height', svgHeight) const barChart = svg.selectAll('rect')
.data(colors) // 绑定数组
.enter() // 指定选择集的enter部分
.append('rect') // 添加足够数量的矩形 .attr('y', d => 0) // d为数据集每一项的值, 取y坐标
.attr('height', 20) // 设定高度
.attr('width', barWidth - barPadding) // 设定宽度
.attr('transform', (d, i) => {
const translate = [barWidth * i, 0];
return `translate(${translate})`
}) // 实际是计算每一项值的x坐标
.style('fill', (d, i) => d)
}
2.动态更新
update = nkNum => { const colors = [
'#40cc80',
'#40cc80',
'#40cc80',
'#40cc80',
'#FFFF00',
'#FFFF00',
'#FFFF00',
'#f64b5d',
'#f64b5d',
'#f64b5d',
] console.log(nkNum, "nkNum") // NK顏色橫條設定,共十格 N = 1-10,max value = 2^(N/2) round to first digit,1/2/3/4/6/8/11/16/23/32,最後一格沒有上限=24~無限
// 即是說,數值等於或大於24,到無限大,屬第十級
// 没达到的,用#eeeeee表示,达到的用彩色表示 colors.map((t, i) => {
if (nkNum < Math.round(Math.pow(2, (i + 1) / 2))) {
colors[i] = '#eeeeee'
}
})
const svg = d3.select('.barChart1') const barChart = svg
.selectAll('rect')
.data(colors)
.style('fill', (d, i) => d)
}
值得注意的是,这里我巧妙的利用了循环的索引来计算那一组数 1/2/3/4/6/8/11/16/23/32
Math.round(Math.pow(2, (i + 1) / 2)
3.调用
componentDidMount() {
this.print();
}
componentDidUpdate(prevProps, prevState) {
const {
home: { nkNum },
} = this.props; const {
home: { nkNum: nkNumOld },
} = prevProps; if (nkNum !== nkNumOld) {
this.update(nkNum);
}
}
前端/h5/React D3.js实现根据数据动态更新图形/类似进度实时变化效果的更多相关文章
- d3.js 之关联数据:data操作符
数据可视化 在可视化工作中,一个基本出发点是将不同的数值映射到不同的可视化 元素的属性上,使其表现出各自不同的视觉特征. 比如:以数组中的每一个值为直径分别创建一个圆,我们得到三个圆: 在d3中,可视 ...
- 初探原生js根据json数据动态创建table
初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...
- Js多国时间动态更新
Js多国时间动态更新 点击下载
- Android零基础入门第44节:ListView数据动态更新
原文:Android零基础入门第44节:ListView数据动态更新 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是 ...
- Android零基础入门第67节:RecyclerView数据动态更新
列表的数据往往会跟随业务逻辑不断刷新,所呈现出来的数据需要动态更新,那么RecyclerView是如何动态更新数据的呢? 之前在学习ListView的时候如果数据改变,需要调用notifyDataSe ...
- MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新
MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新 关键代码: //发送数据通知 //from txwtech@163.com LRESULT CCommSampleDlg::O ...
- js将json数据动态生成表格
今天开发中遇到需要展示动态数据的问题, 具体要求是后端传来的json字符串,要在前端页面以table表格的形式展示, 其实没啥难的,就是拼接table标签,纯属体力活,于是自己写了个呆萌,保存起来,以 ...
- highChart数据动态更新
highChart官网上通过ajax加载数据的例子 上面是第一次生成图表的时候使用 我想动态更新,在已经生成的图表上动态更新 chartBS.series[0].setData(sugarListDa ...
- ngx-echarts 图表数据动态更新
使用echarts绘制图表时,初次赋值数据正常展示,重新获取数据之后,图表没有跟着动态刷新.解决的办法是: html文件 <div echarts [options]="chartOp ...
随机推荐
- Java连载47-多态基础语法、作用
一.多态的语法 1.两个类之间没有继承关系的,使用多态是不能编译的. 2.无论向上还是向上转型,都需要有继承关系. 3.什么时候需要向下转型? 当调用的方法或者属性是子类型特有的,在父类型中不存在,就 ...
- Google工作法
本文转自:https://www.yuque.com/heqingbao/msfy2c/zg56gm 这几天去上海参加Google开发者大会,利用空闲时间读了一本快餐书,书名叫<Google工作 ...
- spring的事件机制实战
理论 在分布式场景下,实现同步转异步的方式有三种方式: 1.异步线程池执行:比如借助@Asyn注解,放到spring自带的线程池中去执行: 2.放到消息队列中,在消费者的代码中异步的消费,执行相关的逻 ...
- CAT 监控搭建
简介 CAT 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务. 已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统 ...
- IIS 上部署 ASP.NET Core 应用程序
1.下载 .Net Core Runtime 和 Hosting Bundle 下载地址:https://dotnet.microsoft.com/download/dotnet-core 分别下载 ...
- Python 自定义元类的两种写法
有关元类是什么大家自己搜索了解,我这里写一下实现元类的两种写法 # 自定义元类 #继承type class LowercaseMeta(type): ''' 修改类的属性名称为小写的元类 ''' # ...
- Add a Class from the Business Class Library 从业务类库添加类 (XPO)
In this lesson, you will learn how to use business classes from the Business Class Library as is. Fo ...
- ping、网络抖动与丢包
基本概念: ping: PING指一个数据包从用户的设备发送到测速点,然后再立即从测速点返回用户设备的来回时间.也就是俗称的“网络延迟” 一般以毫秒(ms)计算 一般PING在0~100ms都 ...
- JS常用标签
1.由来 JavaScript的出现就是为了解决,不需要将所有的表单数据全部提交到服务器. 2.添加 加载Js代码的三种方式: 第一种:<script></script>标签里 ...
- Python工具库分享
漏洞及渗透练习平台: WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.co ...