最近接到一个需求,在满足规则下,实现类似这种展示效果,其实就是用图形反映数据(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实现根据数据动态更新图形/类似进度实时变化效果的更多相关文章

  1. d3.js 之关联数据:data操作符

    数据可视化 在可视化工作中,一个基本出发点是将不同的数值映射到不同的可视化 元素的属性上,使其表现出各自不同的视觉特征. 比如:以数组中的每一个值为直径分别创建一个圆,我们得到三个圆: 在d3中,可视 ...

  2. 初探原生js根据json数据动态创建table

    初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...

  3. Js多国时间动态更新

    Js多国时间动态更新 点击下载

  4. Android零基础入门第44节:ListView数据动态更新

    原文:Android零基础入门第44节:ListView数据动态更新 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是 ...

  5. Android零基础入门第67节:RecyclerView数据动态更新

    列表的数据往往会跟随业务逻辑不断刷新,所呈现出来的数据需要动态更新,那么RecyclerView是如何动态更新数据的呢? 之前在学习ListView的时候如果数据改变,需要调用notifyDataSe ...

  6. MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新

    MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新 关键代码: //发送数据通知 //from txwtech@163.com LRESULT CCommSampleDlg::O ...

  7. js将json数据动态生成表格

    今天开发中遇到需要展示动态数据的问题, 具体要求是后端传来的json字符串,要在前端页面以table表格的形式展示, 其实没啥难的,就是拼接table标签,纯属体力活,于是自己写了个呆萌,保存起来,以 ...

  8. highChart数据动态更新

    highChart官网上通过ajax加载数据的例子 上面是第一次生成图表的时候使用 我想动态更新,在已经生成的图表上动态更新 chartBS.series[0].setData(sugarListDa ...

  9. ngx-echarts 图表数据动态更新

    使用echarts绘制图表时,初次赋值数据正常展示,重新获取数据之后,图表没有跟着动态刷新.解决的办法是: html文件 <div echarts [options]="chartOp ...

随机推荐

  1. 【使用篇二】SpringBoot使用JdbcTemplate操作数据库(12)

    Spring对数据库的操作在jdbc上面做了深层次的封装,提供了JdbcTemplate模板. 在SpringBoot使用JdbcTemplate很简单: 引入数据库驱动包(mysql或oracle) ...

  2. Sql Server 判断表是否存在方法总结

    #使用场景: 1.在创建表之前,需要先判断该表是否已经存在: 2.在删除表之前,需要先判断该表是否已经存在: #方法总结: 1.判断实体表是否存在的方法: 1).方法一: * from sysObje ...

  3. 曾Python培训讲师-2年Python开发无包装简历-20191217-可公开

    目录 个人介绍 技能介绍 项目经历 自我评价 简历非完整版,需要完整版看下述信息,禁止任何一切私人用途.转发 我生日是27号,那就27元一份,有需求的来购买!只会涨价不会降价,大概卖10份涨1元:曾P ...

  4. 洛谷 P2657 (数位DP)

    ### 洛谷 P2657 题目链接 ### 题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件: 1.两个相邻数位上的数的差值至少为 2 . 2.不包含前导零. 很简单的数 ...

  5. EJB学习

    EJB:企业级JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件. EJB主要有三种Bean: Session Beans: 会在单个特 ...

  6. 制作windows安装包的工具

    https://nsis.sourceforge.io/Download https://www.installaware.com/ https://www.advancedinstaller.com ...

  7. Go template高级用法、深入详解、手册、指南、剖析

    入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <m ...

  8. css 行内水平均等排布方式

    <div class="justify"> <span>测试1</span> <span>测试2</span> < ...

  9. oracle 利用序列与触发器实现列自增

    实现步骤:先创建序列,后创建触发器 1.创建序列 create sequence 序列名 increment start maxvalue ; 2.创建触发器 create or replace tr ...

  10. Vue中computed和watch的区别

    在vue中computed和watch的真正区别是:computed产生于它的依赖,而watch产生于它的依赖的变化.只要依赖存在,我们就能访问到其对应的computed属性:但只有依赖发生了改变,我 ...