echarts的初始化和销毁dispose

简介: echarts的初始化和销毁dispose

容器节点被销毁以及被重建时


假设页面中存在多个标签页,


每个标签页都包含一些图表。


当选中一个标签页的时候,其他标签页的内容在 DOM 中被移除了。


这样,当用户再选中这些标签页的时候,就会发现图表“不见”了。


本质上,这是由于图表的容器节点被移除导致的。


即使之后该节点被重新添加,图表所在的节点也已经不存在了。


正确的做法是,


在图表容器被销毁之后,


调用 echartsInstance.dispose 销毁实例,


在图表容器重新被添加后再次调用 echarts.init 初始化。


从上面这一句话,我们可以得出一个结论:


那就是有些时候我们在移除容器的时候,echarts可能展示不出来


那么解决的办法是:


调用 echartsInstance.dispose 销毁实例,


echartsInstance.dispose的使用


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>第一个 ECharts 实例</title>
    <!-- 引入 echarts.js -->
    <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main" style="width: 800px;height:400px; background: pink;"></div>
    <div onclick="showHander()" class="zahsnhi">展示实例</div>
    <div onclick="desHander()" class="xiaohui">销毁实例</div>
    <script type="text/javascript">
        // 初始化echarts
        function xuanranInt() {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main'));
            let index = 0;
            var colorList = ['#73DDFF', '#73ACFF', '#FDD56A', '#FDB36A', '#FD866A', '#9E87FF', '#58D5FF'];
            var data = [{
                'name': '热点网格',
                'value': 5600
            }, {
                'name': '大气污染',
                'value': 3600
            }, {
                'name': '水质超标',
                'value': 1500
            }, {
                'name': '在线超标',
                'value': 2000
            }, {
                'name': '未知',
                'value': 899
            }, {
                'name': '系统对接',
                'value': 4000
            }]
            option = {
                title: {
                    text: 'PieChart',
                    x: 'center',
                    y: 'center',
                    textStyle: {
                        fontSize: 20
                    }
                },
                tooltip: {
                    trigger: 'item'
                },
                legend: {
                    type: 'scroll',
                    orient: 'vertical',
                    right: '5%',
                    top: 'center',
                    selectedMode: true,
                    icon: 'pin',
                    formatter: function (name) {
                        let title = ''
                        var total = 0;
                        var target;
                        var index;
                        for (var i = 0, l = data.length; i < l; i++) {
                            if (data[i].name == name) {
                                target = data[i].value;
                                title = data[i].label
                                index = i < 6 ? i : 5
                            }
                        }
                        return `  ${name}   ${index}  ${target}个`
                    }
                },
                label: { //去除饼图的指示折线label
                    normal: {
                        show: false,
                        position: 'inside',
                        formatter: "{b}:{d}%"
                    },
                },
                series: [{
                    type: 'pie',
                    center: ['50%', '50%'],
                    radius: ['50%', '70%'],
                    clockwise: true,
                    avoidLabelOverlap: true,
                    hoverOffset: 30,
                    emphasis: {
                        itemStyle: {
                            borderColor: '#f3f3f3',
                            borderWidth: 10
                        }
                    },
                    itemStyle: {
                        normal: {
                            borderColor: "#FFFFFF",
                            borderWidth: 1,
                            label: {
                                show: false,
                            },
                            labelLine: {
                                show: false
                            }
                        }
                    },
                    data: data,
                }]
            };
            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        }
        // 调用
        xuanranInt();
        // 重新渲染echarts
        function showHander() {
            xuanranInt();
        }
        // 销毁实例
        function desHander() {
            var myChart = echarts.init(document.getElementById('main'));
            // 销毁实例,销毁后实例无法再被使用。
            // 在什么情况下需要调用该函数进行销毁当前的实例呢?
            // 官方给的说明:在图表容器被销毁之后,调用 echartsInstance.dispose 销毁实例,
            myChart.dispose();
        }
    </script>
</body>
</html>


效果图


1425695-20211008223114223-1743146172.gif


echartsInstance.clear的使用


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>第一个 ECharts 实例</title>
    <!-- 引入 echarts.js -->
    <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main" style="width: 800px;height:400px; background: pink;"></div>
    <div onclick="showHander()">展示实例</div>
    <div onclick="desHander()">销毁实例</div>
    <div onclick="qingkong()">清空当前实例</div>
    <script type="text/javascript">
    // 初始化echarts
    function xuanranInt(){
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));
        let index = 0;
        var colorList = ['#73DDFF', '#73ACFF', '#FDD56A', '#FDB36A', '#FD866A', '#9E87FF', '#58D5FF'];
        var data = [{
            'name': '热点网格',
            'value': 5600
        }, {
            'name': '大气污染',
            'value': 3600
        }, {
            'name': '水质超标',
            'value': 1500
        }, {
            'name': '在线超标',
            'value': 2000
        }, {
            'name': '未知',
            'value': 899
        }, {
            'name': '系统对接',
            'value': 4000
        }]
        option = {
            title: {
                text: 'PieChart',
                x: 'center',
                y: 'center',
                textStyle: {
                    fontSize: 20
                }
            },
            tooltip: {
                trigger: 'item'
            },
            legend: {
                type: 'scroll',
                orient: 'vertical',
                right: '5%',
                top: 'center',
                selectedMode: true,
                icon: 'pin',
                formatter: function (name) {
                    let title = ''
                    var total = 0;
                    var target;
                    var index;
                    for (var i = 0, l = data.length; i < l; i++) {
                        if (data[i].name == name) {
                            target = data[i].value;
                            title = data[i].label
                            index = i < 6 ? i : 5
                        }
                    }
                    return `  ${name}   ${index}  ${target}个`
                }
            },
            label: { //去除饼图的指示折线label
                normal: {
                    show: false,
                    position: 'inside',
                    formatter: "{b}:{d}%"
                },
            },
            series: [{
                type: 'pie',
                center: ['50%', '50%'],
                radius: ['50%', '70%'],
                clockwise: true,
                avoidLabelOverlap: true,
                hoverOffset: 30,
                emphasis: {
                    itemStyle: {
                        borderColor: '#f3f3f3',
                        borderWidth: 10
                    }
                },
                itemStyle: {
                    normal: {
                        borderColor: "#FFFFFF",
                        borderWidth: 1,
                        label: {
                            show: false,
                        },
                        labelLine: {
                            show: false
                        }
                    }
                },
                data: data,
            }]
        };
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    }
    // 调用
    xuanranInt();
    // 重新渲染echarts
    function showHander(){
        xuanranInt();
    }
    // 销毁实例
    function desHander(){
        var myChart = echarts.init(document.getElementById('main'));
        // 销毁实例,销毁后实例无法再被使用。
        // 在什么情况下需要调用该函数进行销毁当前的实例呢?
        // 官方给的说明:在图表容器被销毁之后,调用 echartsInstance.dispose 销毁实例,
        myChart.dispose();
    }
    // 清空当前实例
    function qingkong(){
        // 清空当前实例,会移除实例中所有的组件和图表。
        var myChart = echarts.init(document.getElementById('main'));
        myChart.clear() 
    }
    </script>
</body>
</html>


1425695-20211008223422376-1309850751.gif


clear和dispose的区别在哪里呢?


学过vue的同学都知道,v-show和v-if


其实clear类似于v-show


dispose类似于v-if


他们的区别就是这样

相关文章
|
11月前
|
JavaScript 容器
Echarts初始化容器的DOM写法
Echarts初始化容器的DOM写法
103 0
|
JavaScript
handsontable 和 echarts都定义了require方法,初始化时冲突了,怎么办?
echarts初始化时报这个错误. require.config is not a function  方案一: 让其中一方的初始化不依赖于 require即可 1.去掉 var testDrowEcharts=function(data){ require.
1133 0
|
1月前
|
前端开发 JavaScript BI
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
使用echarts和highcharts图表库实现折线图、柱状图、饼图和数据集图
93 2
|
1月前
|
数据可视化
echarts图表坐标轴数据标签添加下划线
echarts图表坐标轴数据标签添加下划线
100 0
|
1月前
|
容器
echarts图表怎样实现刷新功能?
echarts图表怎样实现刷新功能?
|
1月前
|
数据可视化 JavaScript 前端开发
Echarts是一个开源的JavaScript可视化库,用于创建各种类型的图表
Echarts是JavaScript的开源可视化库,Python通过Pyecharts库可调用它来绘制图表。示例展示了如何用Pyecharts创建柱状图:定义图表对象,设置标题和坐标轴,添加X轴、Y轴数据,最后渲染展示。Pyecharts还支持折线图、散点图、饼图等多种图表类型,更多详情可查阅官方文档。
54 0
|
1月前
|
前端开发 JavaScript 定位技术
Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档
Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档
45 0
|
1月前
|
存储
vue2、vue3分别配置echarts多图表的同步缩放(二)
vue2、vue3分别配置echarts多图表的同步缩放
30 0
|
1月前
|
API
vue2、vue3分别配置echarts多图表的同步缩放(一)
vue2、vue3分别配置echarts多图表的同步缩放
53 0