uniapp 使用renderjs引入echarts

效果图:

1.1renderjs引入echarts

组件zmui-echarts.vue:

html 复制代码
<template>
	<view class="zmui-echarts" :prop="option" :change:prop="echarts.delay"></view>
</template>

<script>
	export default {
		name: 'zmuiEcharts',
		props: {
			option: {
				type: Object,
				required: true
			}
		}
	}
</script>

//使用renderjs 就让app拥有类似有.HTML文件的环境 能直接挂载.js的能力
<script module="echarts" lang="renderjs"> 
	export default {
		data() {
			return {
				timeoutId: null,
				chart: null
			}
		},
		mounted() {
			if (typeof window.echarts === 'object') {
				this.init()
			} else {
				// 动态引入类库
				const script = document.createElement('script') //创建个标签
				script.src = './static/echarts.min.js'  //引入echarts.min.js
				script.onload = this.init
				document.head.appendChild(script) //全局挂载echarts.min.js
			}
		},
		methods: {
			/**
			 * 初始化echarts
			 */
			init() {
				// 根据id初始化图表
				this.chart = echarts.init(this.$el)
				this.update(this.option)
			},
			/**
			 * 防抖函数,500毫秒内只运行最后一次的方法
			 * @param {Object} option
			 */
			delay(option) {
				if (this.timeoutId) {
					clearTimeout(this.timeoutId)
					this.timeoutId = null
				}
      this.timeoutId = setTimeout(() => {
					this.update(option)
				}, 500)
			},
			/**
			 * 监测数据更新
			 * @param {Object} option
			 */
			update(option) {
				console.log('option', 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)
							}
						}

						// legend
						if (option.legend) {
							console.log('option.legend', option.legend)
							if (Object.prototype.toString.call(option.legend) == '[object Array]') {
								for (let i in option.legend) {
									if (option.legend[i].formatterStatus) {
										option.legend[i].formatter = this.legendFormatter(option.legend[i].formatterType, option.legend[i].formatterArr)
									}
								}
								console.log(12)
							} else {
								if (option.legend.formatterStatus) {
									console.log(56)
									// option.legend.formatter = this.legendFormatter(option.legend.formatterType, option.legend.formatterArr)
									// option.legend.formatter = function(value) {
									// 	return '1'
									// }
								}
								console.log(34)
							}
						}

						// y轴
						if (option.yAxis) {
							if (option.yAxis.axisLabel) {
								if (option.yAxis.axisLabel.formatterStatus) {
									option.yAxis.axisLabel.formatter = this.yAxisFormatter(option.yAxis.axisLabel.formatterData)
								}
							}
							
							if (option.yAxis[0].axisLabel.water) {
									let currentChooseName = option.yAxis[0].axisLabel.water.currentChooseName
									let name = option.yAxis[0].axisLabel.water.name
									console.log('name========>', name,currentChooseName)
									option.yAxis[0].axisLabel.formatter =  function(value) {
										let level = null
										if (currentChooseName == '西铝饮用水' || currentChooseName == '和尚山') {
											if (name == 'CODMn') {
												switch (value) {
													case 2:
														level = 2.0;
														break;
													case 4:
														level = 4.0;
														break;
													case 6:
														level = 6.0;
														break;
													case 10:
														level = 10.0;
														break;
												}
												return level;
											}else if (name == 'TP') {
												switch (value) {
													case 0.02:
														level = 0.02;
														break;
													case 0.1:
														level = 0.1;
														break;
													case 0.2:
														level = 0.2;
														break;
													case 0.3:
														level = 0.3;
														break;
												}
												return level;
												
											}else if (name == 'DO') {
												switch (value) {
													case 7.5:
														level = 7.5;
														break;
													case 6:
														level = 6.0;
														break;
													case 5:
														level = 5.0;
														break;
													case 3:
														level = 3.0;
														break;
												}
												return level;
											}else if (name == 'TN') {
												switch (value) {
													case 0.2:
														level = 0.2;
														break;
													case 0.5:
														level = 0.5;
														break;
													case 1:
														level = 1.0;
														break;
													case 1.5:
														level = 1.5;
														break;
												}
												return level;
											} else if (name == 'NH3-N') {
												switch (value) {
													case 0.15:
														level = 0.15;
														break;
													case 0.5:
														level = 0.5;
														break;
													case 1:
														level = 1.0;
														break;
													case 1.5:
														level = 1.5;
														break;
												}
												return level;
											}
											
										}else if(currentChooseName !== '西铝饮用水' || currentChooseName !== '和尚山') {
											if (name == 'CODMn') {
												switch (value) {
													case 4:
														level = 4.0;
														break;
													case 6:
														level = 6.0;
														break;
													case 10:
														level = 10.0;
														break;
														case 15:
															level = 15.0;
															break;
												}
												return level;
											}else if (name == 'TP') {
												switch (value) {
															
													case 0.1:
														level = 0.1;
														break;
													case 0.2:
														level = 0.2;
														break;
													case 0.3:
														level = 0.3;
														break;
														case 0.4:
															level = 0.4;
															break;
												}
												return level;
											} else if (name == 'DO') {
												switch (value) {
													
													case 6:
														level = 6.0;
														break;
													case 5:
														level = 5.0;
														break;
													case 3:
														level = 3.0;
														break;
														case 2:
															level = 2.0;
															break;
												}
												return level;
											}else if (name == 'TN') {
												switch (value) {
													
													case 0.5:
														level = 0.5;
														break;
													case 1:
														level = 1.0;
														break;
													case 1.5:
														level = 1.5;
														break;
														case 2:
															level = 2.0;
															break;
												}
																			
												return level;
											} else if (name == 'NH3-N') {
												switch (value) {							
													case 0.5:
														level = 0.5;
														break;
													case 1:
														level = 1.0;
														break;
													case 1.5:
														level = 1.5;
														break;
														case 2:
															level = 2.0;
															break;
												}
												return level;
											}
										} 
										
									}
							}
						}

						// 颜色渐变
						if (option.series) {
							for (let i in option.series) {
								let linearGradient = option.series[i].linearGradient
								if (option.series[i].axisLabel && option.series[i].axisLabel.formatterText) {
									option.series[i].axisLabel.formatter = function(value) {
										if (value === 0) {
											return '0 \n 健康';
										} else if (value === 1) {
											return '50 \n 优';
										} else if (value === 2) {
											return '100 \n 良';
										} else if (value === 3) {
											return '150 \n 轻度';
										} else if (value === 4) {
											return '200 \n 中度';
										} else if (value === 5) {
											return '300 \n 重度';
										} else if (value === 6) {
											return '500 \n 严重';
										}
									}
								}
								if (linearGradient) {
									option.series[i].color = new echarts.graphic.LinearGradient(linearGradient[0], linearGradient[1],
										linearGradient[2], linearGradient[3], linearGradient[4])
								}

								if (option.series[i].itemStyle) {
									if (option.series[i].itemStyle.normal) {
										if (option.series[i].itemStyle.normal.formatterColor) {
											option.series[i].itemStyle.normal.color = this.colorFormatter(option.series[i].itemStyle.normal.formatterType,option.series[i])
										}
									}
								}

								if (option.series[i].markLine) {
									if (option.series[i].markLine.label) {
										if (option.series[i].markLine.label.normal) {
											if (option.series[i].markLine.label.normal.formatterLabel) {
												option.series[i].markLine.label.normal.formatter = this.labelFormatter(option.series[i].markLine.label.normal
													.formatterType, option.series[i].markLine.label.normal.formatterValue)
											}
										}
									}
								}
							}
						}
					}
					
					console.log(option)
					this.chart.clear() // 这个不要删掉哟,不然切换不同图形的时候会有bug
					// 设置新的option
					this.chart.setOption(option, option.notMerge)
				}
			},
			waterFormatterYAxis (value) {
				/* let name = null
				switch (value) {
					case 2:
						name = 2.0;
						break;
					case 4:
						name = 4.0;
						break;
					case 6:
						name = 6.0;
						break;
					case 10:
						name = 10.0;
						break;
				} */
				console.log('value', value)
				// return name;
			},
			/**
			 * 设置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 = x - boxWidth - 1
					}
					if (y >= boxHeight) { // 上边放的下
						posY = y - boxHeight - 1
					}
					return [posX, posY]
				}
			},
			/**
			 * tooltip格式化
			 * @param {Object} unit 数值后的单位
			 * @param {Object} formatFloat2 是否保留两位小数
			 * @param {Object} formatThousands 是否添加千分位
			 */
			tooltipFormatter(unit, formatFloat2, formatThousands) {
				return params => {
					if (Array.isArray(params)) {
						var params = params[0]
						// #ifdef H5
						var result = params.data.fullDate + '/n' + params.seriesName + ":" + params.data.value
						// #endif
						// #ifdef APP-PLUS
						var result = params.data.fullDate + '</br>' + params.seriesName + ":" + params.data.value
						// #endif
					} else {
						// #ifdef H5
						var result = params.data.fullDate + '/n' + params.seriesName + ":" + params.data.value
						// #endif
						// #ifdef APP-PLUS
						var result = params.data.fullDate + '</br>' + params.seriesName + ":" + params.data.value
						// #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
			},

			/**
			 * Y轴格式化
			 * @param {Object} data
			 */
			yAxisFormatter(data) {
				return params => {
					let result = []
					for (let i in data) {
						if (params == i) {
							result.push(data[i])
						}
					}
					return result
				}
			},
			/**
			 * legend 格式
			 * @param {Object} Type
			 * @param {Object} Arr
			 */
			legendFormatter(Type, Arr) {
				console.log('Arr', Arr)
				return params => {
					let result = ""
					var total = 0;
					for (var i = 0, l = Arr.length; i < l; i++) {
						total += Arr[i].value;
				    }
					let res = Arr.filter(v => v.name === params)
					let val = res[0].value
					let precent=((val/total)*100).toFixed(2) + '%'
					// #ifdef H5
					result = params +"("+ val+"件)"
					// #endif
					// #ifdef APP-PLUS
					result = params +"("+ val+"件)"
					// #endif
					return result
				}
			},
			/**
			 * 颜色设置
			 * @param {Object} Type
			 */
			colorFormatter(Type,series) {
				let value  =0;
				return params => {
					//如果series 里面包含aqiData 数据 按AQI 的值来渲染颜色
					let value =params.value;
					 if(series['aqiData']!=null){
						value =series['aqiData'][params.dataIndex];
					} 
					let result = ""
					if (Type === 'one') {
						result = "rgb(126,0,35)"
						if (value > 0 && value < 51) {
							result = "#00e400"
						} else if (value >= 51 && value < 101) {
							result = "#ffff00"
						} else if (value>= 101 && value < 151) {
							result = "#ff7e00"
						} else if (value >= 151 && value < 201) {
							result = "#ff0000"
						} else if (value >= 201 && value < 301) {
							result = "#7e0023"
						}
					}
					return result
				}
			},
			/**
			 * 标记线
			 * @param {Object} Type
			 * @param {Object} Value
			 */
			labelFormatter(Type, Value) {
				return params => {
					let result = ""
					if (Type === 'one') {
						result = Value
					}
					return result
				}
			},
		}
	}
</script>

<style scoped>
	.zmui-echarts {
		width: 100%;
		height: 100%;
	}
</style>

2.使用<zmuiEcharts :option="echartOptions"></zmuiEcharts>

html 复制代码
import zmuiEcharts from '@/components/zmui-echarts/zmui-echarts.vue'
components: {
			zmuiEcharts
		},
<zmuiEcharts  :option="echartOptions"></zmuiEcharts>

export default {
    data(){
        return{
            echartOptions: {
					backgroundColor: '#ffffff',
					title: {
						text: 'mg/L',
						textStyle: {
							fontSize: 12,
							fontWeight: 'normal',
							color: '#858585', //标题颜色
						},
						top: 0,
						left: '4%',
					},
					tooltip: {
						show: false
						// axisPointer: {
						// 	type: "axis",
						// 	textStyle: {
						// 		color: "#000"
						// 	}
						// },
						// formatter: (data) => {
						// 	// 可以自定义文字和样式,用行内样式,数据包含在data参数中
						// 	let text = ` ${data.name}:${data.value}`
						// 	return text
						// }
					},
					grid: {
						top: "5%",
						right: "3%",
						bottom: '13%',
					},
					xAxis: [{
						data: [],
						margin: 20,
						interval: 0,
						rotate: 40,
						color: '#858585',
						textStyle: {
							fontSize: 12
						},
						axisLine: {
							lineStyle: {
								color: '#858585',
							}
						},
						axisTick: {
							show: true
						},
					}],
					axisLine: {
						show: false,
						lineStyle: {
							color: '#858585', //y轴颜色
						}
					},
					axisTick: {
						show: false
					},
					splitLine: {
						show: false
					},
					dataZoom: [{
							"show": true,
							"height": 8,
							"xAxisIndex": [
								0
							],
							bottom: '0%',
							start: 0,
							end: 6,
							handleIcon: "M-292,322.2c-3.2,0-6.4-0.6-9.3-1.9c-2.9-1.2-5.4-2.9-7.6-5.1s-3.9-4.8-5.1-7.6c-1.3-3-1.9-6.1-1.9-9.3c0-3.2,0.6-6.4,1.9-9.3c1.2-2.9,2.9-5.4,5.1-7.6s4.8-3.9,7.6-5.1c3-1.3,6.1-1.9,9.3-1.9c3.2,0,6.4,0.6,9.3,1.9c2.9,1.2,5.4,2.9,7.6,5.1s3.9,4.8,5.1,7.6c1.3,3,1.9,6.1,1.9,9.3c0,3.2-0.6,6.4-1.9,9.3c-1.2,2.9-2.9,5.4-5.1,7.6s-4.8,3.9-7.6,5.1C-285.6,321.5-288.8,322.2-292,322.2z",
							handleSize: "130%",
							handleStyle: {
								color: "#fff",
								shadowColor: "#B1B5B9",
								shadowBlur: 5,
							},
							backgroundColor: "#DEE3F4",
							fillerColor: "#008efe",
							endValue: 5,
						},
						{
							"type": "inside",
							"show": true,
							"height": 15,
							"start": 1,
							"end": 35
						}
					],
					yAxis: [{
						type: 'value',
						min: 0,
						max: 0,
						interval: 0.01,
						name: 'nj',
						nameTextStyle: {
							color: '#ffffff'
						},
						axisLine: {
							show: true
						},
						axisTick: {
							show: false
						},
						splitLine: {
							show: false,
						},
						axisLabel: {
							color: '#858585',
							textStyle: {
								fontSize: 13
							},
							formatter: function(value1) {
								return value1;
							},
							water: {
								name: 'water',
								code: 'code'
							},
				
						},
				
					}],
				
				
					series: [{
						label: {
							normal: {
								show: true,
								color: '#333',
								position: 'top',
							}
						},
						name: 'nj',
						type: 'bar',
						data: [],
						barWidth: '8px',
						itemStyle: {
							normal: {
								formatterColor: true,
								formatterType: "one",
							}
						},
					}]
				}
        }
    }
}


				
相关推荐
To_OC5 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic5 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy5 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志6 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble7 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯8 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜8 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司9 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
kaiking_g9 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js
江华森9 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http