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!

推薦閱讀: