react+antv g2折线图定时器刷新数据

使用changeData 实时更新数据
需求:定时刷新接口,获取最新数据,并且渲染到 g2折线图中,每次只展示最新的20个数据。
那么我就直接上代码啦(主要代码)!
父组件中:

state={
	lineData :[]
}
 componentDidMount() {
    this.initData()
 }
 initData = () => {
        const { lineData } = this.state;
        let url = `${dataUrl}/storage/xxx`;
        //写一个自己的方法调用接口(这里我用的自己项目中的,具体就不写出来了,只要能拿到结果就行)
        axiosFn.commonGe(url).then(res => {
            if (res.data.status === 200) {
                const { writeRate, readRate } = res.data.data
                let sumNum = (readRate + writeRate).toFixed(2)
                let write = {
                    time: moment(new Date()).format("HH:mm:ss"),
                    type: '写',
                    number: writeRate
                }
                let read = {
                    time: moment(new Date()).format("HH:mm:ss"),
                    type: '读',
                    number: readRate
                }
                let sum = {
                    time: moment(new Date()).format("HH:mm:ss"),
                    type: '总',
                    number: Number(sumNum)
                }
                let data = [...lineData, write, read, sum];
                //每个分类超过20条数据就取最新的20条数据
                let new_lineData = data.length > 60 ? data.slice(-60) : data;
                this.setState({
                    lineData: new_lineData,
                    writeAndRead: {
                        writeRate,
                        readRate
                    },
                },()=>{
                    setTimeout(() => {
                        this.initData();
                    }, 1000 * 1)//1秒调用一次接口(也要刷新折线图)
                })
               
           
            } else {
                this.setState({
                    lineData: [],
                    writeAndRead: {
                        writeRate: 0,
                        readRate: 0
                    }
                })
            }
        })
    }

同时,引用子组件,并且传值

<LineChart  data={this.state.lineData} />

子组件(LineChart组件)

import React, { Component } from 'react'
import { Chart } from '@antv/g2';

export class LineChart extends Component {
    constructor(props) {
        super(props);
        this.state = {
            chart: null
        };
    }
    componentDidMount() {
        const { data } = this.props;
        let chart = new Chart({
            container: 'throughputLine',
            autoFit: true,
            height: 270,
            padding: [10, 50, 30, 80]
        });
        chart.data(data);
        chart.scale({
            number: {
                nice: true,
            },

        });
        chart.legend(false);
        chart.tooltip({
            showCrosshairs: true,
            shared: true,
        });

        chart.axis('number', {
            label: {
                formatter: (val) => {
                    return val + 'MBps';
                },
            },

        });
        chart
            .line()
            .position('time*number')
            .color('type', (val) => {
                let color = '#2D72D0'
                if (val === '写') {
                    color = '#E5B72E'
                } else if (val === '总') {
                    color = '#62B33E'
                }
                return color;
            })
            .shape('smooth');

        chart
            .point()
            .position('time*number')
            .color('type', (val) => {
                let color = '#2D72D0'
                if (val === '写') {
                    color = '#E5B72E'
                } else if (val === '总') {
                    color = '#62B33E'
                }
                return color;
            })

            .shape('circle');
        chart.render();
        this.setState({
            chart: chart
        })
    }
    componentWillReceiveProps(nextProps){
        const { data } = nextProps;
        const { chart } = this.state;
        chart !== null && chart.changeData(data);
    }

    render() {
        return (
            <div id='throughputLine'></div>
        )
    }
}
export default LineChart

效果如图:每秒添加一个数据,刷新一次,并且很丝滑~~
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值