鍍金池/ 問答/HTML/ 在vue中引用了Echarts 導致Cannot read property g

在vue中引用了Echarts 導致Cannot read property getAttribute of null?

這是報錯信息clipboard.png

這是網(wǎng)頁畫面
clipboard.png
本來這個空白地方時應該有一個表格的

下面貼上源代碼
<template>

<div class="table" style="height: 100%;">
    <div>
        <el-card class="box-card">
            <div slot="header">
                <p>菜單列表</p>
            </div>
            <div class="text item" @click="tabId=0" :class="[tabId==0 ? 'active' : '']">里程分析</div>
            <div class="text item" @click="tabId=1" :class="[tabId==1 ? 'active' : '']">故障分析</div>
        </el-card>
        <div class="tablebox" v-show="tabId==0">
            <el-card class="table-card" style="height: 650px;overflow-y: auto">
                <v-ClassifyTree @handleClick="handleNodeClick"></v-ClassifyTree>
            </el-card>
            <div class="handle-box" v-if="nowShow">
                    <div  style="height: 80px;padding: 20px 10px;">
                        <p style="background-color:#29a8cd;text-align: center;line-height: 50px">請先選擇需要操作的車輛</p>
                    </div>
            </div>
            <div class="handle-box" v-if="boxShow">
                <div>
                    <el-card>
                        <div slot="header">
                            <el-row><span style="font-size:20px">選擇月份</span><el-date-picker v-model="value4" type="month" placeholder="選擇月">
                            </el-date-picker></el-row>
                        </div>
                        <div id="charts" style="width: 100%;height: 250px;"></div>
                    </el-card>
                </div>
            </div>
        </div>

        <div class="tablebox" v-show="tabId==1">
            <el-card class="table-card" style="height: 650px;overflow-y: auto">
                <v-ClassifyTree @handleClick="handleNodeClick"></v-ClassifyTree>
            </el-card>
            <div class="handle-box">
                <div v-if="nowShow" style="height: 80px;padding: 20px 10px;">
                    <p style="background-color:#29a8cd;text-align: center;line-height: 50px">請先選擇需要操作的車輛</p>
                </div>
                <div v-if="boxShow">
                    <el-card>
                        <div slot="header">
                            <el-row><span style="font-size:20px">選擇月份</span><el-date-picker v-model="value2" type="month" placeholder="選擇月">
                            </el-date-picker></el-row>
                        </div>
                        <div id="charts2" style="width: 100%;height: 250px;"></div>
                    </el-card>
                </div>
            </div>
        </div>
    </div>
</div>

</template>

<script>

import vClassifyTree from '../common/ClassifyTree.vue';
let echarts = require('echarts/lib/echarts');
require('echarts/map/js/china');
require('echarts/lib/chart/pie');
require('echarts/lib/chart/line');
require('echarts/lib/chart/bar');
require('echarts/lib/component/tooltip');
require('echarts/lib/component/legend');
export default {
    data() {
        return {
            tabId:0,
            value3:'',
            value4:'',
            value2:'',
            value1:'',
            boxShow:false,
            nowShow:true,
            node:'',
            show:'',
            carArchives:[],
        }
    },
    components:{
        vClassifyTree
    },
    mounted() {
        this.drawLine();
        this.drawLine2();    
    },
    methods: {
        drawLine(){
        let myChart = echarts.init(document.getElementById('charts'));
        var option = {
                color: ['#3398DB'],
                tooltip : {
                    trigger: 'axis',
                    axisPointer : {            // 坐標軸指示器,坐標軸觸發(fā)有效
                        type : 'shadow'        // 默認為直線,可選為:'line' | 'shadow'
                    }
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis : [
                    {
                        type : 'category',
                        name:'日期',
                        data : ['1', '2', '3', '4', '5', '6', '7','8', '9', '10', '11', '12', '13', '14'],
                        axisTick: {
                            alignWithLabel: true
                        }
                    }
                ],
                yAxis : [
                    {
                        type : 'value',
                        name:'里程'
                    }
                ],
                series : [
                    {
                        name:'直接訪問',
                        type:'bar',
                        barWidth: '60%',
                        data:[10, 52, 200, 334, 390, 330, 220,10, 52, 200, 334, 390, 330, 220]
                    }
                ]
            };
            myChart.setOption(option);
        },
        drawLine2(){
        let myChart = echarts.init(document.getElementById('charts2'));
         var option = {
             title : {
                 text: '報警占比統(tǒng)計',
                 x:'center'
             },
             tooltip : {
                 trigger: 'item',
                 formatter: "{a} <br/> : {c} (iom4quc%)"
             },
             series : [
                 {
                     name: '訪問來源',
                     type: 'pie',
                     radius : '55%',
                     center: ['50%', '60%'],
                     data:[
                         {value:335, name:'直接訪問'},
                         {value:310, name:'郵件營銷'},

                     ],
                     itemStyle: {
                         emphasis: {
                             shadowBlur: 10,
                             shadowOffsetX: 0,
                             shadowColor: 'rgba(0, 0, 0, 0.5)'
                         }
                     }
                 }
             ]
         };
            myChart.setOption(option);
            myChart.resize();
        },
       },
        //車輛列表展開
        handleNodeClick(childs) {
            this.nowShow=false;
            this.boxShow=true;
            this.node=childs;
            var this_ = this;
            if(this.node.leaf) {
                this_.show = true;
                this.$axios.post('api/achives/achivesInfo', {
                    'LicencePlate': this.node.name
                }).then((res) => {
                    this.carArchives.push(res.data.achivesInfo);
                    console.log(this.carArchives);
                });
            } else {
                console.log('你點擊的不是車牌!');
            }
        }

    }
}

</script>

弄了一天

回答
編輯回答
淡墨

getAttribute是未獲取到圖形容器,VUE需要先把容器渲染出來才能掛載上echarts圖形。
使用v-if的時候,頁面渲染沒有把節(jié)點if里面的節(jié)點渲染出來,所以無法找到容器。
試了幾種方法:
1.把v-if改為v-show,后者已經(jīng)渲染只是沒有顯示。
2.this.$nextTick(()=> { this.drawLine(); this.drawLine2(); }) 這樣做能實現(xiàn)。
3.setTimeout(() => { this.drawLine(); this.drawLine2(); },10); 弄一個定時器,等頁面加載完成后再執(zhí)行,這方法肯定不咋樣。
暫時沒有找到更好辦法,有更好方法的分享下?。。。?!

2017年5月5日 10:34
編輯回答
孤星

mounted里面執(zhí)行的兩個方法放到this.$nextTick(function(){})中試下,必須保證dom渲染完成完畢才可以獲取dom節(jié)點

2017年11月19日 12:30
編輯回答
賤人曾

你用了v-if,第二個tab里么有dom,所以echarts渲染失敗,可以用v-show

2017年2月15日 01:20
編輯回答
黑與白

其次 你先把這個刪了v-if="boxShow" 估計能出來

2018年7月20日 00:09
編輯回答
笑浮塵

我看你這個表格的初始化在mounted的時候,通過調(diào)用this.drawLine();來實現(xiàn)的,但是你的charts這時候不在頁面節(jié)點中,因為boxShow為false,所以初始化不成功。echats初始化的時候,節(jié)點一定要是在頁面中真實存在的。

2017年11月24日 16:03
編輯回答
懶豬

首先你是不是npm install 下載的echarts,如果是,那么只需要 import echarts from 'echarts'就行了。

2018年8月14日 23:53