您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

echarts的初始化和销毁dispose

假设中存在多个页,
每个页都包含一些图表。
当选中页的时候,其他页的在 DOM 中被移除了。
这样,当再选中这些页的时候,就会发现图表“不见”了。

本质上,这是由于图表的容器节点被移除导致的。
即使之后该节点被重新,图表所在的节点也已经不存在了。
正确的做法是,
在图表容器被销毁之后,
 echartsInstance.dispose 销毁实例,
在图表容器重新被后再次 echarts.init 初始化。

从上面这一句话,我们可以得出结论:
那就是有些时候我们在移除容器的时候,echarts可能展示不出来
那么的办法是:
 echartsInstance.dispose 销毁实例,
<!DOCTYPE html>
<html>

<head>
    < 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>

<!DOCTYPE html>
<html>

<head>
    < 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','#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',textStyle: {
                    fontSize: 20
                }
            },tooltip: {
                trigger: 'item'
            },legend: {
                type: 'scroll',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,formatter: "{b}:{d}%"
                },series: [{
                type: 'pie',emphasis: {
                    itemStyle: {
                        borderColor: '#f3f3f3',borderWidth: 10
                    }
                },itemStyle: {
                    normal: {
                        borderColor: "#FFFFFF",label: {
                            show: false,labelLine: {
                            show: false
                        }
                    }
                },}]
        };
        // 使用刚指定的配置项和数据图表。
        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>

学过vue的同学都知道,v-show和v-if
其实clear类似于v-show
dispose类似于v-if
他们的区别就是这样

联系我
置顶