小程序引入e-charts圖表html
這裏是狗尾草第一次發表掘金文章,往後望各位大佬多多支持~前端
git
幹就完了~github
由於一個頁面要引入多個圖表,因此須要對e-charts圖表進行封裝。然鵝問題來了,怎麼引入呢?npm
爲了兼容小程序 Canvas,ECharts提供了一個小程序的組件,用這種方式能夠方便地使用 ECharts。插件下載地址json
其中,ec-canvas 是ECharts提供的組件,其餘文件是如何使用該組件的示例。canvas
ec-canvas 目錄下有一個 echarts.js,默認ECharts會在每次 echarts-for-weixin 項目發版的時候替換成最新版的 ECharts。若有必要,能夠自行從 ECharts 項目中下載最新發布版,或者從官網自定義構建以減少文件大小小程序
這裏引入,咱們只須要引入ec-canvas目錄到小程序項目便可。api
一個頁面只須要引入一個圖表的,咱們在相關的js文件書寫便可。這樣引入比較簡單,也能夠減小沒必要要的不少問題。但只限於一個頁面引入一個圖表 ,若是有一種狀況,正如狗尾草所要完成的,一個頁面4個圖表,各不相同。則就須要封裝組件了echarts
話很少說,直接擼~
index.json配置
{ "usingComponents": { "ec-canvas": "../../ec-canvas/ec-canvas" } }
index.wxml
<view class="container"> <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas> </view>
index.js
function initChart(canvas, width, height) { const chart = echarts.init(canvas, null, { width: width, height: height }); canvas.setChart(chart); var option = { ... }; chart.setOption(option); return chart; } Page({ data: { ec: { onInit: initChart } } });
以上爲單頁面引入圖表,須要注意的是,
引入文件的路徑,改爲本身項目中的實際路徑。
option配置可查看e-charts官方文檔按需配置。
小程序的層級由於是原生組件,因此小程序的層級沒法修改。
因爲原生組件脫離在 WebView 渲染流程外,所以在使用時有如下限制: 組件的層級是最高的,因此頁面中的其餘組件不管設置 z-index 爲多少,都沒法蓋在原生組件上。 後插入的原生組件能夠覆蓋以前的原生組件。 原生組件還沒法在 scroll-view、swiper、picker-view、movable-view 中使用。 部分CSS樣式沒法應用於原生組件,例如: 沒法對原生組件設置 CSS 動畫 沒法定義原生組件爲 position: fixed 不能在父級節點使用 overflow:hidden 來裁剪原生組件的顯示區域,
所以在使用時,可能遇到這個問題,圖表的層級很高,並且不會跟隨屏幕滾動。大概就是以上緣由形成的。
這裏狗尾草的解決是經過修改佈局。由於這裏本人形成圖表不隨屏幕滾動的緣由是採用了,聖盃佈局。所以在將聖盃佈局去掉後。採用原本的默認佈局,就修改了這個問題。
雖然問題獲得瞭解決,但需求比較急,尚未查找到完美的解決方案,小夥伴有的話,能夠告知一下,在這裏先說一聲謝謝啦~
狗尾草的完成,頁面引入多個圖表,若是還如上面所示,在單頁面中引入多個方法,配置會更加複雜。
這裏,須要引入豎向柱狀圖,橫向柱狀圖,餅狀圖。
所以將每一個類型的圖標單獨放到一個組件中,在須要引入的頁面只引入這些個組件就夠。
在父組件獲得數據後,將數據傳入子組件。子組件更新view便可。可是會遇到這麼一個問題
子組件在獲得傳遞的值後,並不會更新view。所以狗尾草是經過修改引入的ec-canvas組件來完成視圖的更新。
聽着可能有點懵逼,理一下。
父組件給子組件傳遞數據
子組件作視圖的option配置
源碼組件接受數據
大概就是這麼個意思
先來看一下目錄結構
這裏只給你們引用一下餅狀圖
Wxml
<view class='echarts-department'> <echarts-depart oData="{{echarts.departNumber}}"></echarts-depart> </view>
Wxss
.echarts-department { width: 100%; height: 498rpx; }
Json
{ "usingComponents": { "echarts-depart": "/components/eChartsSubDepartment/index" } }
Js
// 數據日報 const $api = require('../../api/index.js'); const $util = require('../../utils/utils.js'); const regeneratorRuntime = require('../../utils/runtime.js'); Page({ onShareAppMessage: function (res) { return { title: '數據日報', path: '/pages/eCharts/index', success: function () { }, fail: function () { } } }, data: { subParams: { distCode: "", beginTime: $util.formatDate(new Date()), endTime: $util.formatDate(new Date()) }, //獲取除過審醫生數外的其餘的全部api params echarts: { departNumber: [], } //圖標傳入的數據 }, // 獲取二級科室診療統計 getDepartNumber() { $api.DATADAILY.getDepartNumber(this.data.subParams) .then(res => { if(res.length == 0) { this.setData({ "echarts.departNumber": [{name:'',value:''}] }) return ; } let arr = []; res.map(item => { let obj = {}; obj.value = item.count; obj.name = item.date; arr.push(obj); }) this.setData({ "echarts.departNumber":arr }) }) }, onReady() { this.getDepartNumber(); //獲取二級科室診療總排行 }, });
這裏就是父組件的引入
wxml
<!-- 數據日報 二級科室診療排行 --> <view class='box'> <ec-canvas id="mychart-dom-bar" oData = "{{oData}}" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas> </view>
須要注意的是oData就是傳遞過來的數據
wx.json
{ "component": true, "usingComponents": { "ec-canvas": "/ec-canvas/ec-canvas" } }
js
// 數據日報 二級科室診療統計 // 一、引入依賴腳本 import * as echarts from '../../ec-canvas/echarts'; let chart = null; // 二、進行初始化數據 function initChart(canvas, width, height,data) { chart = echarts.init(canvas, null, { width: width, height: height }); canvas.setChart(chart); var option = { tooltip: { position: function (px) { return [px[0], '20%']; } }, color: ['#48C6EB', '#60E3CA', '#5E9ED5', '#9F9FF5', '#72C7FD'], grid: { x: 0, y: 0, x2: 0, y2: 0 }, //圖標距離上下左右的距離 series: [{ // name: 'pie', type: 'pie', // selectedMode: 'single', //點擊的時候是否區域進行分離 // selectedOffset: 30, //區域分離的距離 clockwise: true, label: { normal: { show: false, textStyle: { fontSize: '14px', color: '#333333' }, // backgroundColor: '#061F3D', } }, // labelLine: { // normal: { // lineStyle: { // color: '#999999' // } // } // }, //label線條的顏色 data: data, itemStyle: { normal: { borderWidth: 2, borderColor: '#ffffff', opacity: .7 } } }] }; chart.setOption(option); return chart; } Component({ /** * Component properties */ properties: { oData: { type: Array, value: [], observer: function (newVal, oldVal, changedPath) { // 屬性被改變時執行的函數(可選),也能夠寫成在methods段中定義的方法名字符串, 如:'_propertyChange' // 一般 newVal 就是新設置的數據, oldVal 是舊數據 } } }, /** * Component initial data */ data: { ec: { onInit: initChart // 三、將數據放入到裏面 } }, /** * Component methods */ methods: { }, })
ec-canvas > ec-canvas.js
properties: { canvasId: { type: String, value: 'ec-canvas' }, ec: { type: Object }, oData: { type: Object, observer: function(newVal,oldVal) { if(newVal.length == 0) { return ; } this.init(); } } //oData爲父傳子,子傳這裏 },
在這裏將傳的數據做爲參數
啊,噗~
至此,一條數據流就算完成。其餘類型的圖標也按照這種方式引入便可
由於引入多個圖表的話,更多的須要控制順序,所以,這裏給你們補充一下ES7的引入
npm install regenerator
引用:
const regeneratorRuntime = require('../../libs/regenerator-runtime')
這裏就能夠放心使用async和await來控制api請求的順序了。
固然你們能夠引入相關的js文件也是能夠的。