uni-app:服务器端数据绘制echarts图标(renderjs解决手机端无法显示问题)

效果

 代码

<template>
	<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" id="echarts" class="echarts">
	</view>
</template>

<script>
	export default {
		data() {
			return {
				option: '',
			}
		},
		mounted() {
			this.getData(); // 在组件挂载后调用获取数据的方法
		},
		methods: {
			getData() {
				uni.request({
					url: getApp().globalData.position + 'Other/select_sale_ekanbaninfo',
					data: {},
					header: {
						"Content-Type": "application/x-www-form-urlencoded"
					},
					method: 'POST',
					dataType: 'json',
					success: res => {
						//月统计
						var monthinfo = res.data.month_info;
						this.monthinfo = monthinfo;
						//显示图表
						this.echart();
					},
					fail(res) {
						console.log("查询失败")
					}
				});
			},
			echart() {
				//月统计
				// 提取日期和对应的值
				var dates1 = this.monthinfo.date;
				var values1 = this.monthinfo.total_amount;
				var months1 = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"];
				var months1_chinese = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];
				this.option = {
					//配置网格组件,用于定义图表的位置和大小
					grid: {
						top: '15%', // 增加top的值来创建间距
						left: '2%',
						right: '2%',
						bottom: '2%', // 增加bottom的值来创建间距
						containLabel: true, //自动计算并包含坐标轴标签、刻度和标题等内容在内。
					},
					color: ['#5588d4'],
					tooltip: {
						trigger: 'item',
						axisPointer: {
							type: 'line'
						},
						formatter: function(params) {
							var value = values1[params.dataIndex];
							var date = dates1[params.dataIndex];
							var month = months1_chinese[params.dataIndex];
							var marker = params.marker; // 添加marker(小圆点)
							return marker + ' ' + date + '<br/>' + month + ' : ' + value + '万元';
						}
					},
					xAxis: {
						// name: '日期',
						data: months1,
						axisLine: {
							show: false // 隐藏纵坐标轴的横线
						},
						//隐藏小刻度短线
						axisTick: { // x轴刻度相关配置
							show: false, // 是否显示x轴刻度线
						},
						nameTextStyle: {
							fontSize: 12 // 设置横轴名称字体大小为12
						}
					},
					yAxis: {
						name: '金额(万元)',
						splitLine: {
							show: false // 隐藏纵坐标轴的背景横线
						},
						axisLine: {
							show: false // 隐藏纵坐标轴的竖线
						},
						//隐藏小刻度短线
						axisTick: { // x轴刻度相关配置
							show: false, // 是否显示x轴刻度线
						},
						axisLabel: {
							fontSize: 12 // 设置横轴标签字体大小为12
						},
						nameTextStyle: {
							fontSize: 12 // 设置横轴名称字体大小为12
						}
					},
					series: [{
						barWidth: '6',
						name: '销量',
						type: 'bar',
						data: values1,
						itemStyle: {
							show: true,
							position: 'top',
							textStyle: {
								// color: '#515dc3',
								fontSize: 12
							}
						}
					}]
				}
			}
		}
	}
</script>
<!-- 指定脚本类型模块为echarts,语言为renderjs -->
<script module="echarts" lang="renderjs">
	let myChart
	export default {
		mounted() {
			// 首先判断window.echarts是否存在,如果存在则调用initEcharts方法进行初始化。
			if (typeof window.echarts === 'function') {
				this.initEcharts()
			} else {
				// 如果不存在,则动态创建一个<script>标签,并设置其src属性为static/js/echarts.js,然后在加载完成后调用initEcharts方法。
				// 动态引入较大类库避免影响页面展示
				const script = document.createElement('script')
				script.src = 'static/js/echarts.js'
				script.onload = this.initEcharts.bind(this)
				document.head.appendChild(script)
			}
		},
		methods: {
			initEcharts() {
				//echarts.init函数创建一个新的ECharts实例,并将其挂载到具有id为echarts的DOM元素上。
				myChart = echarts.init(document.getElementById('echarts'))
			},
			//updateEcharts方法用于更新图表数据。当监听到组件数据或属性发生变化时,会调用这个方法。
			// 在方法中,首先判断myChart实例是否存在,如果存在则调用setOption方法,将新的配置选项传递给图表实例。
			updateEcharts(newValue, oldValue, ownerInstance, instance) {
				if (myChart != undefined) {
					myChart.setOption(newValue)
				}
			},
		}
	}
</script>

<style>
	.echarts {
		width: 100%;
		height: 300px;
	}
</style>

解析

<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" id="echarts" class="echarts">

  • @click="echarts.onClick":在点击事件发生时,将调用echarts.onClick方法进行处理。@click是Vue中绑定点击事件的方式,相当于v-on:click

  • :prop="option":将option作为prop属性的值进行绑定。这里的prop可以是组件的自定义属性,被父组件传递给子组件作为数据的一种方式。

  • :change:prop="echarts.updateEcharts":使用了Vue的修饰符语法,在change:prop事件发生时,调用echarts.updateEcharts方法进行处理。

  • id="echarts":给该元素指定了唯一的id属性值为echartsid属性通常用于在JavaScript中获取元素或通过CSS选择器匹配元素。

  • class="echarts":给该元素指定了一个CSS类名为echarts,用于样式设计或选择器匹配。

 <script module="echarts" lang="renderjs">

  •  指定了这个脚本模块的类型为echarts,并且语言为renderjs

if (typeof window.echarts === 'function') {
        this.initEcharts()
} else {
        // 动态引入较大类库避免影响页面展示
        const script = document.createElement('script')
        script.src = 'static/js/echarts.js'
        script.onload = this.initEcharts.bind(this)
        document.head.appendChild(script)
 }

  • 首先判断window.echarts是否存在,如果存在则调用initEcharts方法进行初始化。
  • 如果不存在,则动态创建一个<script>标签,并设置其src属性为static/js/echarts.js,然后在加载完成后调用initEcharts方法。

  • script.onload指定了onload事件的回调函数为this.initEcharts.bind(this)。当ECharts库的脚本加载完成后,触发onload事件,即可执行该回调函数。

  • this.initEcharts.bind(this)使用bind方法将当前组件实例绑定到initEcharts方法内部的this关键字上。这样,在initEcharts方法内部,this关键字将指向当前组件实例,可以访问组件的属性和方法。

  • document.head.appendChild(script)将动态创建的<script>元素添加到文档头部(head元素)中。通过这样的方式,浏览器会开始加载并执行该脚本。

initEcharts() {
        myChart = echarts.init(document.getElementById('echarts'))
 },

  • echarts.init函数创建一个新的ECharts实例,并将其挂载到具有id为echarts的DOM元素上

updateEcharts(newValue, oldValue, ownerInstance, instance) {
        if (myChart != undefined) {
                myChart.setOption(newValue)
        }
},

  • updateEcharts方法用于更新图表数据。当监听到组件数据或属性发生变化时,会调用这个方法。
  • 在方法中,首先判断myChart实例是否存在,如果存在则调用setOption方法,将新的配置选项传递给图表实例。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: uni-app-template是一款基于uni-app框架建立的通用模板,可以为开发者提供一个基础的项目结构和功能模块,减少开发的时间和工作量。 该模板的优势在于跨平台性能良好,支持同时开发多个平台的应用程序,并且可以达到近乎原生的用户体验。 在使用uni-app-template时,开发者可以选择不同的开发方式,如HBuilder X、VS Code等,也可以选择不同的UI框架和组件库进行二次开发。该模板还提供了常用的API,如ajax、storage、toast、loading等,方便开发者快速构建应用界面。 总之,uni-app-template是一款十分实用的通用模板,开发者可以通过基于此模板的项目,快速开发出高性能、跨平台的应用程序。 ### 回答2: uni-app-template是一个能够快速构建uni-app项目的通用模板。uni-app是一款跨平台开发框架,可以将一份代码同时转化为多个平台的应用程序,如微信小程序、App Store和Google Play应用商店,以及各种移动设备。 uni-app-template的特点主要体现在以下几个方面: 1.简单易用 uni-app-template是一个基于uni-app的通用模板,具有简单易用的特点,可以轻松构建平台适配性高、UI风格统一的app。 2.多平台适配 uni-app-template支持多种平台适配,不仅可以生成微信小程序应用,还可以生成iOS和Android应用,无需重新编写代码。因此,采用uni-app-template开发应用程序可以大大提高开发效率和代码复用率。 3.模块化开发 模板支持应用程序的模块化开发,可以将功能实现的代码封装在一个模块中,方便开发者进行管理和维护,并提高代码的可重用性和可维护性。 4.灵活配置 uni-app-template支持灵活配置,可以根据不同的需求选择不同的UI组件、主题颜色、字体、字号等参数,还可以根据具体平台的特点进行适配。 总之,uni-app-template是一个开发者在uni-app框架下快速构建多端应用程序的好选择。借助它,可以迅速构建高效、稳定、具备多端适配能力的app,大大提高开发效率和使用体验。 ### 回答3: Uni-app-template是一种用于uni-app框架的通用模板。uni-app是最近非常受欢迎的移动端应用开发框架,它可以一次编写,多端发布,不仅能够开发微信小程序,还可以开发iOS和安卓应用,还支持H5。 Uni-app-template能够提供一个通用的模板,以便开发者更加高效地完成开发工作。这个模板内置了一些常用的功能,例如页面布局,样式设置,组件引用等。开发者在使用这个模板时,可以根据自己的需要,逐步添加或修改代码,来实现自己的功能。 Uni-app-template中已经内置了很多通用的组件,例如tab栏、navbar、搜索栏等,这些组件可供开发者直接使用,以减少重复开发的工作量。 此外,Uni-app-template还内置了一些常用的插件,例如uni-ui(一个类似于Element UI的移动端UI组件库)、uview(一个为uni-app量身定制的UI库)等,这些插件可以帮助开发者更简单地进行开发工作。 Uni-app-template的另一个优点是它的兼容性。一旦应用开发完成,它将能够直接在各个平台上运行,包括微信小程序、iOS和安卓应用,以及H5网页应用。由于Uni-app框架和Uni-app-template具有良好的兼容性,使得开发者的工作更加高效和简单。 总之,Uni-app-template是一个非常实用和方便的开发工具,它能够帮助开发者更加快速、高效地完成应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值