基于vue的后臺管理系統(tǒng)適配echarts圖表

在很多后臺管理系統(tǒng)中,echarts應(yīng)該是屬于比較常用組件,一個項目中,可能會有多個圖表還會考慮到屏幕適配,在此,對echarts進行簡單的封裝

介紹:引入封裝的echarts組件,然后在請求數(shù)據(jù)時,傳入需要展示的數(shù)據(jù),在此對數(shù)據(jù)做了監(jiān)聽,實現(xiàn)實時渲染,然后傳入echarts的配置項即可.

//視圖層
<template>
    <div class="shadow w100 h100" v-bind:id="id" :class="className" :style="{height:height,width:width}"></div>
</template>

動態(tài)綁定id,id為父組件傳過來

//數(shù)據(jù)和邏輯處理
  export default {
        mixins : [] ,
        name : "ECharts" ,
        components : {} ,
        data () {
            return {
                MyChart : null
            };
        } ,
        props : {
            className : {
                type : String ,
                default : "echarsCSS"
            } ,
            id : {
                type : String ,
                required : true
            } ,
            data : {
                type : Object ,
                default : null
            } ,
            width : {
                type : String ,
                default : "99.9%"
            } ,
            height : {
                type : String ,
                default : "99.9%"
            }
        } ,
        computed : {} ,
        methods : {
            $avoid = function ( j ) {
                //防止改變原數(shù)據(jù)
                return JSON.parse ( JSON.stringify ( j ) );
            },
            async initChart () {
                let _this = this;
                _this.MyChart = await require ( "echarts" ).init (
                    document.getElementById ( _this.id ) ,
                    "light"
                );
                await _this.MyChart.on ( "click" , _this.click );
                await window.addEventListener ( "resize" , _this.__resizeHandler );
                await _this.setChart ();
            } ,
            click ( p ) {
                let _this = this;
                let d = this.$avoid ( p.data );
                _this.$emit ( "clickECharts" , Object.assign ( {} , null , d ) );
            } ,
            clear () {
                this.MyChart.clear ();
            } ,
            async setChart () {
                let _this = this;
                await _this.clear ();
                await _this.MyChart.setOption ( _this.data , true );
            } ,
            __resizeHandler () {
                if ( this.MyChart ) {
                    this.$nextTick ( () => {
                        this.MyChart.resize ();
                        this.setChart ();
                    } )
                }
            }
        } ,
        watch : {
            data : {
                handler ( n , o ) {
                    if ( JSON.stringify ( n ) !== JSON.stringify ( o ) ) this.setChart ();
                } ,
                deep : true
            }
        } ,
        mounted () {
            this.initChart ();
        } ,
        beforeDestroy () {
            window.removeEventListener ( "resize" , this.__resizeHandler );
            if ( !this.MyChart ) {
                return;
            }
            this.MyChart.dispose ();
            this.MyChart = null;
        } ,
        activated () {
            let that = this;
            if ( that.MyChart ) {
                that.__resizeHandler ();
            }
        }
    };

支持傳入類名,設(shè)置圖表的寬高,id為echarts的id,data為要渲染的數(shù)據(jù)

注意:

1.在watch里監(jiān)聽傳入的data,改變的時候重新設(shè)置數(shù)據(jù),實現(xiàn)數(shù)據(jù)的實時更新

2.初始化圖表的時候監(jiān)聽屏幕的變化,重新初始化圖表,保證不同分辨率下,圖表支持適配,組件銷毀的時候,移除監(jiān)聽

//樣式
<style scope>
.h100 {
  height: 99.7%;
}

.w100 {
  width: 99.7%;
}
.echarsCSS {
    width: 99.7%;
    height: 27.77777vh;
}
.shadow {
    /* 陰影 */
    box-shadow: 0 0 2px rgba(0, 0, 0, 0.3), 0 0 2px rgba(0, 0, 0, 0.3);
}
</style>

使用方式

1.先引入組件

  components: {
    ECharts: () => import("@/assets/ECharts")
  },

2.頁面渲染

<ECharts
   id="weekIntent"
   :data="require('@/echartsdata/LinePostChart')('周意向數(shù)',weekTime,weekIntent)"
     @clickECharts="clickEChartsIntent"
 ></ECharts>

引入的配置文件 LinePostChart 傳入 標(biāo)題和需要顯示的數(shù)據(jù)

module.exports = function (title, dataAxis, data) {
    // var data = [ 122, 133, 334, 198, 123, 125, 220];
    // var yMax = 500;
    // var dataShadow = [];

    // for (var i = 0; i < data.length; i++) {
    //     dataShadow.push(yMax);
    // }
    let option = {
        title: {
            text: title,
            left: '5%',
            top: '2%',
            textStyle: {
                fontSize: 18
            }
        },
        tooltip: {
            //鼠標(biāo)懸浮彈框組件
            trigger: 'axis'
        },
        grid: {
            //配置視圖的位置 左右默認10%
            bottom: '10%',
            top: '20%',
            left:'5%',
            right: '5%',
            containLabel: true
        },
        xAxis: {
            data: dataAxis,
            z: 10
        },
        yAxis: {
            axisLabel: {
                textStyle: {
                    color: '#999'
                }
            }
        },
        series: [
            { // For shadow
                type: 'bar',
                itemStyle: {
                    normal: { color: 'rgba(0,0,0,0.02)' }
                },
                barGap: '-100%',
                barCategoryGap: '60%',

            },
            {
                type: 'bar',
                itemStyle: {
                    normal: {
                        color: new echarts.graphic.LinearGradient(
                            0, 0, 0, 1,
                            [
                                { offset: 0, color: '#83bff6' },
                                { offset: 0.5, color: '#188df0' },
                                { offset: 1, color: '#188df0' }
                            ]
                        )
                    },
                },
                data: data
            }
        ]
    };

    return option
}

效果圖

image.png

圖表大小可以適配屏幕響應(yīng)式改變

注:

具體demo請參考http://47.94.89.73:8080/zeefile/project/management-js/#/login
源碼:https://github.com/wxyfc/management-system
如有疑問,請下方留言,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赠橙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羹呵,更是在濱河造成了極大的恐慌刹悴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寝姿,死亡現(xiàn)場離奇詭異宫补,居然都是意外死亡禽炬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門蟹瘾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圾浅,“玉大人,你說我怎么就攤上這事憾朴±瓴叮” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵众雷,是天一觀的道長灸拍。 經(jīng)常有香客問我,道長砾省,這世上最難降的妖魔是什么鸡岗? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮编兄,結(jié)果婚禮上轩性,老公的妹妹穿的比我還像新娘。我一直安慰自己狠鸳,他們只是感情好炮姨,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碰煌,像睡著了一般舒岸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芦圾,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天蛾派,我揣著相機與錄音,去河邊找鬼个少。 笑死洪乍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夜焦。 我是一名探鬼主播壳澳,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茫经!你這毒婦竟也來了巷波?” 一聲冷哼從身側(cè)響起萎津,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抹镊,沒想到半個月后锉屈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡垮耳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年颈渊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片终佛。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俊嗽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铃彰,到底是詐尸還是另有隱情绍豁,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布豌研,位于F島的核電站妹田,受9級特大地震影響唬党,放射性物質(zhì)發(fā)生泄漏鹃共。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一驶拱、第九天 我趴在偏房一處隱蔽的房頂上張望霜浴。 院中可真熱鬧,春花似錦蓝纲、人聲如沸阴孟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽永丝。三九已至,卻和暖如春箭养,著一層夾襖步出監(jiān)牢的瞬間慕嚷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工毕泌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喝检,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓撼泛,卻偏偏與公主長得像挠说,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子愿题,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353