h5 数字变化_前端/h5 D3.js实现根据数据动态更新图形/类似进度实时变化效果

本文介绍了如何在React应用中使用D3.js库创建一个根据数据动态更新的图形,该图形以颜色条的形式展示数字变化,类似于进度实时变化效果。文章详细讲解了如何绘制图形、动态更新以及实现细节,如计算颜色条的边界值和利用循环索引映射数据。
摘要由CSDN通过智能技术生成

最近接到一个需求,在满足规则下,实现类似这种展示效果,其实就是用图形反映数据(NK,一种干扰值)

20191217151943379049.png

20191217151943450341.png

运行后,它其实是不断在动的,每格都可能显示灰色或者彩色

这里一共是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

1.绘制图形

print = () =>{

const colors=[‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,‘#eeeeee‘,

]//定义svg图形宽高,以及柱状图间距

const svgWidth = 7 *colors.length

const svgHeight= 20const 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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值