uniapp引用echarts的詳細步驟(附柱狀圖實例)
相信很多小夥伴對於echarts這個東西應該不會陌生,我在網上看到很多文章,那麼他到底是怎麼用的呢,卻是五花八門,我現在就來總結一下我的方法。
如果使用npm全局安裝,太麻煩,這裡推薦使用官網(ECharts 在線構建)定制下載,這樣會方便我們使用。
選擇柱狀圖,折線圖,餅圖;這三樣是平常較常用到的;
坐標系選擇直角坐標系;
組件可以全選,也可以選擇自己所需要的,在這裡個人建議除瞭工具欄不選,其他都選上;下載後的文件為echarts.min.js,建議把他放在static內。
好瞭,來到下一步,我們需要在components內創建一個echarts.vue,把這段代碼復制下來,放到echarts.vue內;
<template> <view> <view class="echarts" :prop="option" :change:prop="echarts.update"></view> </view> </template> <script> export default { name: 'Echarts', props: { option: { type: Object, required: true } } } </script> <script module="echarts" lang="renderjs"> export default { data() { return { chart: null } }, mounted() { if (typeof window.echarts === 'object') { this.init() } else { // 動態引入類庫 const script = document.createElement('script') script.src = './static/echarts.min.js' // script.src = './static/echarts/echarts.min.js' script.onload = this.init document.head.appendChild(script) } }, methods: { /** * 初始化echarts */ init() { this.chart = echarts.init(this.$el) this.update(this.option) }, /** * 監測數據更新 * @param {Object} option */ update(option) { if (this.chart) { // 因App端,回調函數無法從renderjs外傳遞,故在此自定義設置相關回調函數 if (option) { // tooltip if (option.tooltip) { // 判斷是否設置tooltip的位置 if (option.tooltip.positionStatus) { option.tooltip.position = this.tooltipPosition() } // 判斷是否格式化tooltip if (option.tooltip.formatterStatus) { option.tooltip.formatter = this.tooltipFormatter(option.tooltip.formatterUnit, option .tooltip.formatFloat2, option.tooltip.formatThousands) } } // if (option.xAxis[0].data.length >= 5) { // option.xAxis[0].axisLabel.formatter = function formatter(params) { // if (params > 5) { // return params; // } // var maxLength = 4; // //判斷長度,超出使用...代替 // if (params && params.length > maxLength) { // return params.substring(0, maxLength - 1) + '...'; // } else { // return params; // } // } // } else if(option.xAxis[0].data.length === 1){ // option.xAxis[0].axisLabel.formatter = function formatter(params) { // return params // } // } else { // option.xAxis[0].axisLabel.formatter = function formatter(params) { // if (params > 5) { // return params; // } // var maxLength = 6; // //判斷長度,超出使用...代替 // if (params && params.length > maxLength) { // return params.substring(0, maxLength - 1) + '...'; // } else { // return params; // } // } // } // 設置新的option this.chart.setOption(option, option.notMerge) } } }, /** * 設置tooltip的位置,防止超出畫佈 */ tooltipPosition() { return (point, params, dom, rect, size) => { //其中point為當前鼠標的位置,size中有兩個屬性:viewSize和contentSize,分別為外層div和tooltip提示框的大小 let x = point[0] let y = point[1] let viewWidth = size.viewSize[0] let viewHeight = size.viewSize[1] let boxWidth = size.contentSize[0] let boxHeight = size.contentSize[1] let posX = 0 //x坐標位置 let posY = 0 //y坐標位置 if (x < boxWidth) { //左邊放不開 posX = 5 } else { //左邊放的下 posX = x - boxWidth } if (y < boxHeight) { //上邊放不開 posY = 5 } else { //上邊放得下 posY = y - boxHeight } return [posX, posY] } }, /** * tooltip格式化 * @param {Object} unit 數值後的單位 * @param {Object} formatFloat2 是否保留兩位小數 * @param {Object} formatThousands 是否添加千分位 */ tooltipFormatter(unit, formatFloat2, formatThousands) { return params => { let result = '' unit = unit ? unit : '' for (let i in params) { if (i == 0) { result += params[i].axisValueLabel } let value = '--' if (params[i].data !== null) { value = params[i].data // 保留兩位小數 if (formatFloat2) { value = this.formatFloat2(value) } // 添加千分位 if (formatThousands) { value = this.formatThousands(value) } } // #ifdef H5 result += '\n' + params[i].seriesName + ':' + value + ' ' + unit // #endif // #ifdef APP-PLUS result += '<br/>' + params[i].marker + params[i].seriesName + ':' + value + ' ' + unit // #endif } return result } }, /** * 保留兩位小數 * @param {Object} value */ formatFloat2(value) { let temp = Math.round(parseFloat(value) * 100) / 100 let xsd = temp.toString().split('.') if (xsd.length === 1) { temp = (isNaN(temp) ? '0' : temp.toString()) + '.00' return temp } if (xsd.length > 1) { if (xsd[1].length < 2) { temp = temp.toString() + '0' } return temp } }, /** * 添加千分位 * @param {Object} value */ formatThousands(value) { if (value === undefined || value === null) { value = '' } if (!isNaN(value)) { value = value + '' } let re = /\d{1,3}(?=(\d{3})+$)/g let n1 = value.replace(/^(\d+)((\.\d+)?)$/, function(s, s1, s2) { return s1.replace(re, '$&,') + s2 }) return n1 } } } </script> <style lang="scss" scoped> .echarts { width: 100%; height: 100%; } </style>
接下來就可以在所需要使用echarts的頁面上,在script內引入該組件,並註冊該組件,註冊完後你需要復制以下代碼
import echarts from '@/components/echarts.vue'; export default { // 註冊組件 components: { echarts }, data(){ return{ option:{} } }, methods:{ logstatrt() { // console.log('初次調用'); this.option = { notMerge: true, backgroundColor": "#F8FAFF", tooltip: { trigger: 'axis', showContent: this.showContent, axisPointer: { type: 'shadow', label: { show: true }, }, }, toolbox: { padding: [200, 0, 0, 0], show: true, feature: { //工具配置項 mark: { show: true }, dataView: { //數據視圖工具,可以展現當前圖表所用數據 show: true, //是否顯示該工具 readOnly: false //是否不可編輯 }, magicType: { show: true, //是否顯示該工具 type: ['line', 'bar'] //啟用的動態類型 }, restore: { show: true //是否顯示該工具 }, saveAsImage: { show: true //是否顯示該工具 } } }, calculable: false, //是否顯示拖拽的手柄 // itemHeight: 0, legend: { //圖例組件 data: [{ name: '進入數', }, { name: '出去數' }], itemGap: 24, padding: [16, 0, 0, 0], // y: 'bottom', itemHeight: 8, //高 itemWidth: 8, //寬 icon: 'circle' //設置為圓 }, grid: { top: '15%', left: '4%', right: '4%', bottom: '6%', containLabel: true }, xAxis: [{ show: true, type: 'category', //坐標軸類型 // boundaryGap:false, //解決數據與線不對應問題 data: ['7.1', '7.2', '7.3', '7.4', '7.5', '7.6', '7.7', '7.8', '7.9', '7.10','7.11' ], // offset:50, //['7.1', '7.2', '7.3', '7.4', '7.5', '7.6', '7.7', '7.8', '7.9', '7.10','7.11', ], //this.xList, //obama_budget_2012.names axisLabel: { color: '#7F84B5', fontWeight: 300, interval: 0, }, axisTick: { show: false //刻度線 }, axisLine: { show: false, //不顯示坐標軸線 }, }, ], yAxis: [{ show: true, boundaryGap: false, //解決數據與線不對應問題 type: 'value', // name: 'Budget (million USD)', // data: this.yList, minInterval: 1, axisLabel: { interval: 0, }, splitLine: { show: true, lineStyle: { //背景網格線 type: 'dashed' } }, axisTick: { show: false //刻度線 }, axisLine: { show: false, //不顯示坐標軸線 }, }], dataZoom: [{ show: false, start: 0, end: 100, handleSize: 8 }, { type: 'inside', start: 0, end: 50, }, { show: false, yAxisIndex: 0, filterMode: 'empty', width: 12, height: '80%', showDataShadow: false, left: '93%', handleSize: 8 } ], series: [{ name: '進入數', type: 'bar', data: ['10', '20', '30', '40', '50', '60', '70', '80', '90', '100', '110','120'], //['10', '20', '30', '40', '50', '60', '70', '80', '90', '100', '110','120'], // this.inNum, //obama_budget_2012.budget2011List color: "#00B1FF" }, { name: '出去數', type: 'bar', data: ['10', '20', '30', '40', '50', '60', '70', '80', '90', '100', '110','120'], //['10', '20', '30', '40', '50', '60', '70', '80', '90', '100', '110','120'], //this.outNum, //obama_budget_2012.budget2012List color: "#FF6C00" } ] }; }, } }
好瞭,你已經離成功不遠瞭!!
接下來我們到頁面上使用該組件,我們要設置他的id,把option內的配置也給他傳過去,該圖的寬高也在上面設置好,你會發現,這個時候多瞭一個柱狀圖出來
<echarts :option="option" id="myChart" style="height: 110vw;margin-left: 2vw;width: 100%;padding: 4vw 0 0 0;"></echarts>
這就是一個簡單的echarts柱狀圖使用 ,我也是走瞭很多彎路,看瞭許多的文章,覺得每個人的方法都不同,我隻是把我認為好的方法放上來,希望對大傢有所幫助。
最後附上一張效果圖 (當然,這些顏色都是可改的,具體可以看文檔或者來問一下我,我都非常樂意解答)
附:報錯:this.echarts.setCanvasCreator is not a function 的解決辦法
echarts.vue頁面引起的 prors不能傳遞方法
將剛才定制的echarts.js文件引入進去
import * as echarts from '@/common/echarts.min.js';
參數加this
this.ctx = wx.createCanvasContext(canvasId,this); const query = wx.createSelectorQuery().in(this);
也可以直接復制代碼進去,註意修改echarts.js的路徑
<template> <canvas v-if="canvasId" class="ec-canvas" :id="canvasId" :canvasId="canvasId" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" @error="error"></canvas> </template> <script> import WxCanvas from './wx-canvas'; import * as echarts from '@/common/echarts.min.js'; export default { props: { // echarts: { // required: true, // type: Object, // default() { // return echarts; // } // }, onInit: { required: true, type: Function, default: null }, canvasId: { type: String, default: 'ec-canvas' }, lazyLoad: { type: Boolean, default: false }, disableTouch: { type: Boolean, default: false }, throttleTouch: { type: Boolean, default: false } }, onReady() { this.echarts = echarts; if (!this.echarts) { console.warn('組件需綁定 echarts 變量,例:<ec-canvas id="mychart-dom-bar" ' + 'canvas-id="mychart-bar" :echarts="echarts"></ec-canvas>'); return; } console.log('echarts'); console.log(this.onInit); if (!this.lazyLoad) this.init(); }, methods: { init() { const version = wx.version.version.split('.').map(n => parseInt(n, 10)); const isValid = version[0] > 1 || (version[0] === 1 && version[1] > 9) || (version[0] === 1 && version[1] === 9 && version[2] >= 91); if (!isValid) { console.error('微信基礎庫版本過低,需大於等於 1.9.91。' + '參見:https://github.com/ecomfe/echarts-for-weixin' + '#%E5%BE%AE%E4%BF%A1%E7%89%88%E6%9C%AC%E8%A6%81%E6%B1%82'); return; } if (!this.onInit) { console.warn('請傳入 onInit 函數進行初始化'); return; } const canvasId = this.canvasId; this.ctx = wx.createCanvasContext(canvasId,this); const canvas = new WxCanvas(this.ctx, canvasId); this.echarts.setCanvasCreator(() => canvas); const query = wx.createSelectorQuery().in(this); query .select(`#${canvasId}`) .boundingClientRect(res => { if (!res) { //setTimeout(() => this.init(), 200); return; } this.chart = this.onInit(canvas, res.width, res.height); }) .exec(); }, canvasToTempFilePath(opt) { const { canvasId } = this; this.ctx.draw(true, () => { wx.canvasToTempFilePath({ canvasId, ...opt }); }); }, touchStart(e) { const { disableTouch, chart } = this; if (disableTouch || !chart || !e.mp.touches.length) return; const touch = e.mp.touches[0]; chart._zr.handler.dispatch('mousedown', { zrX: touch.x, zrY: touch.y }); chart._zr.handler.dispatch('mousemove', { zrX: touch.x, zrY: touch.y }); }, touchMove(e) { const { disableTouch, throttleTouch, chart, lastMoveTime } = this; if (disableTouch || !chart || !e.mp.touches.length) return; if (throttleTouch) { const currMoveTime = Date.now(); if (currMoveTime - lastMoveTime < 240) return; this.lastMoveTime = currMoveTime; } const touch = e.mp.touches[0]; chart._zr.handler.dispatch('mousemove', { zrX: touch.x, zrY: touch.y }); }, touchEnd(e) { const { disableTouch, chart } = this; if (disableTouch || !chart) return; const touch = e.mp.changedTouches ? e.mp.changedTouches[0] : {}; chart._zr.handler.dispatch('mouseup', { zrX: touch.x, zrY: touch.y }); chart._zr.handler.dispatch('click', { zrX: touch.x, zrY: touch.y }); } } }; </script> <style scoped> .ec-canvas { width: 100%; height: 100%; flex: 1; } </style>
總結
到此這篇關於uniapp引用echarts的詳細步驟的文章就介紹到這瞭,更多相關uniapp引用echarts內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Echarts直角坐標系x軸y軸屬性設置整理大全
- vue-echarts如何實現圖表組件封裝詳解
- Vue-cli3中如何引入ECharts並實現自適應
- 基於vue+echarts數據可視化大屏展示的實現
- vue中封裝echarts公共組件過程