react中的echarts数据更新问题

文章讲述了在使用Echarts时遇到的问题,即如何根据用户选择动态渲染不同数据。作者最初通过创建多个实例来实现,但发现这不是高效的方法。后来,作者尝试使用一个实例并用setOption更新配置,但遇到了数据污染问题。解决方案在于setOption的noMerge参数,将其设为true可以避免旧数据残留,实现预期效果。
摘要由CSDN通过智能技术生成

本文记录我使用echarts踩的坑,问题主要还是对echarts文档不熟悉,因为公司项目不方便展示,我用一个小demo做演示。

需求:点击选项或下拉框,要求echarts根据选项渲染不同的数据。

需求效果如下

 

 第一次实现这样的效果,我是通过创建两个实例,通过下拉框的value控制实例的隐藏,从而实现这样的效果。


    const charts1 = useRef();
    const charts2 = useRef();
    const [value,setValue] = useState('1')
    const option1 ={...};
    const option2 ={...};
    useEffect(()=>{
        if(value=='1'){
            const chart1=echarts.init(charts1.current);
            chart1.setOption(option1)
        }else {
            const chart2=echarts.init(charts2.current);
            chart2.setOption(option2)
        }

    },[value])

    return (
        <div className="App" style={{paddingTop:300}}>
            <div style={{width:'100%',height:300}}>
                <Select style={{width:150}} value={value} onSelect={(value)=>{setValue(value)}}>
                    <Option value={'1'}>图一</Option>
                    <Option value={'2'}>图二</Option>
                </Select>
                {value=='1'?<div ref={charts1} style={{width:'100%',height:'100%'}}></div>:null}
                {value=='2'?<div ref={charts2} style={{width:'100%',height:'100%'}}></div>:null}
            </div>
        </div>
    );

上面的写法是一种解决办法,但是如果选项很多的话,不可能每一个都创建一个实例,所以上面的方法很鸡肋;然后我又想了一种方法,echarts的布局是不变的,那么我们是否可以只创建一个实例,只在这个实例上更新不同的echarts配置项。


   useEffect(()=>{
        const chart1=echarts.init(charts1.current);
        if(value=='1'){
            chart1.setOption(option1)
        }else{
            chart1.setOption(option2)
        }
    },[value])

    return (
        <div className="App" style={{paddingTop:300}}>
            <div style={{width:'100%',height:300}}>
                <Select style={{width:150}} value={value} onSelect={(value)=>{setValue(value)}}>
                    <Option value={'1'}>图一</Option>
                    <Option value={'2'}>图二</Option>
                </Select>
                <div ref={charts1} style={{width:'100%',height:'100%'}}></div>
            </div>
        </div>
    );

我将代码修改成只有一个实例, 通过setOption更新对应的echarts数据,但是出现了一下效果

 原本的option1有两条数据,option2只有一条数据,所以切换选项时,应该是两条数据变成一条数据,可结果却是图一的一条数据保留了下来,污染了图二,这个问题如果解决呢?

如果对官方文档很熟悉,其实这里的解决办法就很简单,可我是个菜鸡,找了很久才知道,如果新的配置项中包含原来不存在的数据系列或数据点,它们会被添加到图表中。而如果新的配置项中包含了和原来相同数据系列和数据点的设置,那么它们会被替换成新的设置。但是,如果新的配置项没有包含原先的数据系列或数据点,它们不会被自动删除。因此,原来的数据依然存在于图表中并且可见。

简单解释就是新的配置项有原来存在的数据系列,就会替换原来的数据系列,新的配置项没有原来的数据系列,就会将原来的数据系列合并到新的数据系列。

echarts官方文档中解释了setOption,其中第二个参数noMerge表示是否不跟之前设置的option进行合并,默认是false,如果设置为true,则表示会删除上一个option,然后根据新的option创建新的组件。

将第二个参数设置为true,就可以实现我们预期的效果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值