微信小程序使用echarts

在这里插入图片描述

思路

  • 五个tab公用一个柱状图组件
  • 切换tab以及切换时间改变数据,传入子组件,子组件监听数据重新更新
  • 点击柱状图显示具体数值
  • 每个时间点有两个柱子(高压和低压),柱状图显示高压的最大值到最小值的范围
  • 除了血压其余只有一条柱子
  • 步数比较特殊,不是范围,而是一个具体的步数数值
  • 根据tab设置不同的最小值
  • 假如最大值==最小值,显示一个点
  • 所有横坐标全部显示,不滚动

下载wx-echarts

image.png

堆叠柱状图子组件

image.png

  • bar.json
{"component": true,"usingComponents": {"ec-canvas": "../../../ec-canvas/ec-canvas"}
}
  • bar.wxml
<view class="w100 h100"><ec-canvas id="mychart-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>
  • bar.js
import * as echarts from '../../../ec-canvas/echarts';
Component({options: {addGlobalClass: true,},data: {ec: {lazyLoad: true // 懒加载},time: [],low1: [],high1: [],low2: [],high2: [],step: []},properties: {list: {type: Array,observer: function (newVal, oldVal) {if (newVal.length || oldVal.length) {console.log(newVal, oldVal, 88)let time = newVal.map(item => item.date)let low1 = newVal.map(item => item.firstLowIndicators * 1)let high1 = newVal.map(item => item.firstHighIndicators && item.firstHighIndicators == item.firstLowIndicators ? 'solo' : item.firstHighIndicators * 1 - item.firstLowIndicators * 1)// let high1 = newVal.map(item => (item.firstHighIndicators * 1 - item.firstLowIndicators * 1 == 0) ? 1 : item.firstHighIndicators * 1 - item.firstLowIndicators * 1)let low2 = newVal.map(item => item.secondLowIndicators * 1)let high2 = newVal.map(item => item.secondHighIndicators && item.secondHighIndicators == item.secondLowIndicators ? 'solo' : item.secondHighIndicators * 1 - item.secondLowIndicators * 1)// let high2 = newVal.map(item => (item.secondHighIndicators * 1 - item.secondLowIndicators * 1 == 0) ? 1 : item.secondHighIndicators * 1 - item.secondLowIndicators * 1)let step = newVal.map(item => item.firstHighIndicators)this.setData({time,low1,high1,low2,high2,step})this.initChart(); // 数据变化时重新初始化图表}}},tab: {type: Number,value: 1}},methods: {initChart() {// 绑定组件this.barComponent = this.selectComponent("#mychart-bar");// 初始化柱状图this.barComponent.init((canvas, width, height, dpr) => {// 初始化图表const chart = echarts.init(canvas, null, {width: width,height: height,devicePixelRatio: dpr // 解决模糊显示问题})// 开发中根据从后端获取barData数据,动态更新图表chart.setOption(this.getOption())return chart})},getOption() {var option = {tooltip: {trigger: "axis",axisPointer: {type: "shadow",},formatter: (params) => {// console.log(params)if (this.data.tab == 5) {return (params[0].axisValue +"\n" +params[0].marker +params[1].seriesName +":" +(params[0].value || 0))} else if (this.data.tab == 1) {return (params[0].axisValue +"\n" +params[1].marker +params[0].seriesName +":" +params[0].value +"~" +(params[0].value + ((params[1].value + '').slice(-6) == '521125' ? 0 : params[1].value)) +"\n" +params[3].marker +params[2].seriesName +":" +params[2].value +"~" +(params[2].value * 1 + ((params[3].value + '').slice(-6) == '521125' ? 0 : params[3].value * 1)));} else {return (params[0].axisValue +"\n" +params[1].marker +params[0].seriesName +":" +params[0].value +"~" +(params[0].value + ((params[1].value + '').slice(-6) == '521125' ? 0 : params[1].value)))}},},grid: {top: '8%',left: '5%',right: '5%',bottom: '3%',containLabel: true},// dataZoom: [{//   type: 'inside', // 内置型数据区域缩放//   show: true,//   startValue: 0,//   endValue: 5,// }],xAxis: {type: 'category',splitLine: {show: false},data: this.data.time},yAxis: {type: 'value',min: [40, 80, 50, 34, 0][this.data.tab * 1 - 1],},series: [{name: ['舒张压范围', '血氧范围', '心率范围', '体温范围', '步数'][this.data.tab * 1 - 1],type: 'bar',stack: 'Total',barWidth: 4,itemStyle: {borderColor: 'transparent',color: 'transparent'},data: this.data.tab == 5 ? 0 : this.data.low1},{name: '',type: 'bar',stack: 'Total',barWidth: 4,label: {// show: true,position: 'inside'},itemStyle: {color: '#2bdc70', // 设置整个系列柱子的颜色为蓝色barBorderRadius: 10 // 设置所有柱子的圆角半径为10px},data: this.data.tab == 5 ? this.data.step : this.data.high1.map(item => item == 'solo' ? [2.0521125, 0.3521125, 1.0521125, 0.12521125, 0][this.data.tab * 1 - 1] : item)},{name: ['舒张压范围', '血氧范围', '心率范围', '体温范围', '步数'][this.data.tab * 1 - 1],type: 'bar',stack: 'Total1',barWidth: 4,itemStyle: {borderColor: 'transparent',color: 'transparent',},data: this.data.low2},{name: '',type: 'bar',stack: 'Total1',barWidth: 4,label: {// show: true,position: 'inside'},itemStyle: {color: '#fa5151', // 设置整个系列柱子的颜色为蓝色barBorderRadius: 10 // 设置所有柱子的圆角半径为10px},data: this.data.high2.map(item => item == 'solo' ? [2.0521125, 0.3521125, 0.521125, 0.0521125, 0][this.data.tab * 1 - 1] : item)}]};return option}}
})

父组件

<view style="width: 100%; height: 260px;"><my-bar list="{{barList}}"></my-bar>
</view>"usingComponents": {"my-bar": "./components/bar/bar","solo-table": "./components/table/table"},barList: [{time: this.data.active,low1: 50,high1: 80,low2: 80,high2: 140}, {time: this.data.active,low1: 50,high1: 90,low2: 90,high2: 150}, {time: this.data.active,low1: 50,high1: 80,low2: 70,high2: 100}, {time: this.data.active,low1: 50,high1: 80,low2: 60,high2: 140}, {time: this.data.active,low1: 70,high1: 100,low2: 100,high2: 140}, ]

定制echarts.min.js

image.png

完整父组件

<view class="w100 min100"><van-sticky offset-top="{{ 0 }}"><van-tabs style="z-index: 99;" sticky animated class="gray-2 bold bg-white" active="{{ tab }}" bind:change="onChangeTab" color="#217EF7" line-width="{{20}}" line-height="{{4}}"><van-tab title="血压" name="1"></van-tab><van-tab title="血氧" name="2"></van-tab><van-tab title="心率" name="3"></van-tab><van-tab title="体温" name="4"></van-tab><van-tab title="步数" name="5"></van-tab></van-tabs></van-sticky><time bindchangeTab="onChangeTime" bindchangeDay="onChangeDay"></time><view class="flex w100 pl-30 ptb-20"><view class="bold size-32 flex-1">{{title}}统计分析</view><!-- <van-tabs animated type="card" class="gray-2 flex-1" active="{{ active }}" bind:change="onChangeTime" color="#217EF7"><van-tab title="日" name="1"></van-tab><van-tab title="周" name="2"></van-tab><van-tab title="月" name="3"></van-tab></van-tabs> --></view><view style="width: 100%; height: 250px;"><my-bar list="{{barList}}" tab="{{tab*1}}"></my-bar></view><view class="pd-30"><table1 head="{{head}}" list="{{tableList}}" tab="{{tab*1}}"></table1></view><view wx:if="{{tab==1}}"><view class="bold size-32 flex-1 plr-30 mt-30 mb-30">30天血压趋势情况</view><view style="width: 100%; height: 320px;"><my-scatter list="{{scatterList}}"></my-scatter></view><view class="pd-30"><solo-table total="{{total}}" list="{{soloTable}}"></solo-table></view></view>
</view>
{"usingComponents": {"my-bar": "./components/bar/bar","bar1": "./components/bar1/bar","my-scatter": "./components/scatter/scatter","solo-table": "./components/solo-table/table","table1": "./components/table/table","time": "./components-time/time/time"},"navigationBarTitleText": "健康监测"
}
 Page({data: {tab: 1, // 大分类title: '血压',timeRange: 'day', //时间切换queryDate: '', //时间切换//  barbarList: [],stepList: [],scatterList: [],total: 0,soloTable: [],//  表格head: [{text: '指标',prop: 'name'},{text: '最高',prop: 'max'},{text: '最低',prop: 'min'},{text: '参考值',prop: 'range'}],tableList: []},onLoad(option) {let now = this.getNowData(new Date(), 'day')this.setData({timeRange: 'day',queryDate: now.content})this.getList()this.getList30()},getList() {let {timeRange,queryDate,tab} = this.dataconsole.log(timeRange, queryDate, 8888888888888, timeRange == 'weeks' ? queryDate.split(' 至 ').join(',') : timeRange == 'day' ? queryDate : queryDate.split(' 至 ')[0].split('-')[0] + '-' + queryDate.split(' 至 ')[0].split('-')[1])wx.http('occupant/health-records/chartList', Object.assign({dataSource: 1, //0 手动录入   1智能手表   2、健康检测userId: wx.getStorageSync('userInfo').userId,timeRange: timeRange == 'weeks' ? 'week' : timeRange,queryDate: timeRange == 'weeks' ? queryDate.split(' 至 ').join(',') : timeRange == 'day' ? queryDate : queryDate.split(' 至 ')[0].split('-')[0] + '-' + queryDate.split(' 至 ')[0].split('-')[1],firstIndicator: ['diastolic_blood_pressure', 'blood_oxygen', 'heart_rate', 'temperature', 'step_count'][tab * 1 - 1],}, tab == 1 ? {secondIndicator: ['systolic_blood_pressure'][tab * 1 - 1]} : {})).then(res => {if (res.data.table && res.data.table.length) {if (tab == 1) {res.data.table[0].name = '舒张压'res.data.table[0].range = '60-90'res.data.table[1].range = '90-140'res.data.table[1].name = '收缩压'} else if (tab == 2) {res.data.table[0].name = '血氧'res.data.table[0].range = '95-100%'} else if (tab == 3) {res.data.table[0].name = '心率'res.data.table[0].range = '60-100'} else if (tab == 4) {res.data.table[0].name = '体温'res.data.table[0].range = '35.3-37.3℃'} else if (tab == 5) {res.data.table[0].name = '步数'res.data.table[0].range = '5000-10000步'}}//  if (tab == 5) {//    this.setData({//      stepList: res.data.charts || [],//      tableList: res.data.table//    })//  } else {//  }this.setData({barList: res.data.charts || [],tableList: res.data.table})})},getList30() {wx.http('occupant/health-records/bloodPressureTrend', {dataSource: 1, //0 手动录入   1智能手表   2、健康检测userId: wx.getStorageSync('userInfo').userId,}).then(res => {this.setData({scatterList: res.data.charts,total: res.data.total,soloTable: res.data.table,})})},onChangeTab(e) {this.setData({tab: e.detail.name,title: e.detail.title})this.getList()if (this.data.tab == 1) {this.getList30()}},//  onChangeTime(e) { //    this.setData({//      timeRange: e.detail.id, //    }) //  },// 点击切换获取默认时间getNowData(date, dateType, direction) {let updateData = {};let content = "";let year = date.getFullYear();let month = date.getMonth() + 1;let day = date.getDate();let weeksDay = date.getDay();switch (dateType) {case 'day': {year = date.getFullYear();month = date.getMonth() + 1;day = date.getDate();content = year + "-" + month + "-" + day;break;}case 'weeks': {//获取当天在这一周是属于第几天,然后计算这一周的起始天日期和结束的日期weeksDay = date.getDay();let starDate = new Date(date.getTime());starDate.setDate(date.getDate() - weeksDay + 1);let startYear = starDate.getFullYear();let startMonth = starDate.getMonth() + 1;let startDay = starDate.getDate();let endDate = new Date(date.getTime());let endYear = endDate.getFullYear();let endMonth = endDate.getMonth() + 1;let endDay = endDate.getDate();//  let weeksDay = date.getDay(); // 获取今天是周几,注意:0代表周日,1代表周一//  // 计算本周第一天(周一)//  let startDate = new Date(date.getTime());//  if (weeksDay !== 0) { // 如果不是周日//    startDate.setDate(date.getDate() - weeksDay + 1); // 减去当前是周几再加1,得到周一//  } else {//    // 如果是周日,直接使用当前日期即可,因为已经是新的一周的开始//  }//  let startYear = startDate.getFullYear();//  let startMonth = startDate.getMonth() + 1; // 月份需要加1//  let startDay = startDate.getDate();//  // 计算本周最后一天(周日)//  let endDate = new Date(startDate.getTime());//  endDate.setDate(startDate.getDate() + 6); // 从周一基础上加6天到达周日//  let endYear = endDate.getFullYear();//  let endMonth = endDate.getMonth() + 1;//  let endDay = endDate.getDate();content = startYear + "-" + startMonth + "-" + startDay + ' 至 ' + endYear + "-" + endMonth + "-" + endDay;break;}case 'month': {let starDate = new Date(date.getTime());//计算当月的第一天日期starDate.setDate(1);let startYear = starDate.getFullYear();let startMonth = starDate.getMonth() + 1;let startDay = starDate.getDate();let endDate = new Date(date.getTime());let endYear = endDate.getFullYear();let endMonth = endDate.getMonth() + 1;let endDay = endDate.getDate();content = startYear + "-" + startMonth + "-" + startDay + ' 至 ' + endYear + "-" + endMonth + "-" + endDay;break;}}updateData.content = content;return updateData;},onChangeDay(e) {console.log(e.detail.id, 999999)this.setData({queryDate: e.detail.id.date.curDate,})if (e.detail.id.type) {this.setData({timeRange: e.detail.id.type,})}this.getList()},});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python采集数据处理:利用Pandas进行组排序和筛选

概述 在现代数据处理和分析中&#xff0c;网络爬虫技术变得越来越重要。通过网络爬虫&#xff0c;我们可以自动化地从网页上收集大量的数据。然而&#xff0c;如何高效地处理和筛选这些数据是一个关键问题。本文将介绍如何使用Python的Pandas库对采集到的数据进行组排序和筛选…

基于SpringBoot+Vue研究生志愿填报辅助系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

mp公共字段自动注入

目录 一 什么是公共字段自动注入 二 使用mp实现公共字段自动注入 1.实现步骤 ①导入mp相关依赖 ② 在实体类上给相关字段加上 TableField()注解 ③自定义元数据对象处理器 2.实现原理 一 什么是公共字段自动注入 我们平时在执行更新或者是插入数据功能的时候&#xff0c;…

智绘“水蓝图”,宏电亮相第4届中国(山东)水利科技与生态建设博览会

5月23-25日&#xff0c;第4届中国&#xff08;山东&#xff09;水利科技与生态建设博览会在济南黄河国际会展中心成功召开。展会以“人水和谐&#xff0c;生态山东”为主题&#xff0c;围绕智慧水利建设、水环境治理、水生态保护等领域&#xff0c;展示当下水利行业的新技术、新…

红酒:如何正确地储存红酒

云仓酒庄雷盛红酒&#xff0c;以其优良的品质和丰富的口感&#xff0c;深受广大消费者的喜爱。然而&#xff0c;要想让这些美酒能够长时间保持良好的状态&#xff0c;正确的储存方式是必不可少的。下面&#xff0c;云仓酒庄雷盛红酒将为您详细介绍如何正确地储存红酒。 一、合适…

C语言笔记23 •文件操作•

1.为什么要使用文件&#xff1f; 文件&#xff0c;顾名思义就是存储我们所写在电脑上的文本内容。如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失 了&#xff0c;等再次运⾏程序&#x…

AI工具:如何通过智能助手简化工作流程?

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

【二叉树】Leetcode 103. 二叉树的锯齿形层序遍历【中等】

二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…

Kimichat使用案例007:用kimichat批量重命名txt文本文件

文章目录 一、介绍二、txt文件集三、Kimi操作内容四、Kimi输出内容一、介绍 一个文件夹中有很多个txt文本文件,需要全部进行重命名。 二、txt文件集 三、Kimi操作内容 可以在kimichat中输入提示词: 你是一个Python编程专家,要完成一个关于批量重命名txt文本文件的Python脚本…

产品经理的需求善变,利用规则引擎减少80%的需求变更成本

经常有技术团队的小伙伴抱怨最烦的就是产品经理发起需求变更&#xff0c;才做了三周&#xff0c;改了八回需求...... 其实这个故事&#xff0c;每天都在开发团队中上演&#xff0c;作为 IT的 leader 来透视这个问题&#xff0c;要辩证的看待&#xff0c;其实80% 的可能性都是如…

《对马岛之魂:导演剪辑版》新鲜出炉,AOC电竞显示器与你并肩作战!

超越PS版本的画面表现&#xff0c;AOC U27G3XM助你轻松拉满游戏体验&#xff01; 近日&#xff0c;《对马岛之魂&#xff1a;导演剪辑版》正式登陆PC平台。这款备受期待的作品不仅在战斗机制和故事内容上进行了创新&#xff0c;还引入了更高级的图形选项和更丰富的自定义设置。…

Android 绑定服务的5个问题。

1.android studio 目录结构改变了。为什么会报R 资源文件找不到。 在写项目的时候经常需要改到。 gradle文件里的域名名字要改变下。 2.Caused by: android.app.BackgroundServiceStartNotAllowedException: Not allowed to start service Intent { cmpcom.zjtzsw.sbkDevice/…

oracle 数字或者小数格式化

select trim(. from to_char(1,fm9999990.9999)),trim(. from to_char(0.1,fm9999990.9999)) from dual

视觉SLAM十四讲:从理论到实践(Chapter8:视觉里程计2)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 一、目标 1.理解光流法跟踪特征点的原理。 2.理解直接法是如何估计相机位姿的。 3.实现多层直接法的计算。 特征点法存在缺陷&#xff1a; 二、光流(Optical Flow) …

【Qt知识】Qt中的对象树是什么?

在深入Qt编程的世界时&#xff0c;你会频繁遇到一个核心概念——对象树&#xff08;Object Tree&#xff09;。这个概念是Qt框架管理内存、处理事件和组织用户界面元素的基础。 什么是Qt对象树&#xff1f; 如果你的Qt应用程序就像一片茂盛的森林&#xff0c;而这片森林中的每…

C++学习笔记(22)——多态

目录 [TOC](目录) 比喻与理解1. 多态的概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写2.3.1 虚函数重写的两个例外&#xff1a;1. 协变(基类与派生类虚函数返回值类型不同)2. 析构函数的重写(基类与派生类析构函数的名字不同) 2.4 C11 override 和 final2…

如何保证每次画出的都同一张人脸?AI绘画Stable Diffusion的Reference only教程

Ai绘画有一个很现实的问题&#xff0c;要保证每次画出的都是同一个人物的话&#xff0c;很费劲。 Midjourney就不必说了&#xff0c;人物的高度一致性一直得不到很好的解决。而在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;常用办法是通过同一个Seed值&#xf…

【Python Cookbook】S01E16 同时对数据做转换和换算

目录 问题解决方案讨论 问题 当换算&#xff08;sum(), min(), max()&#xff09;同时遇到转换或筛选&#xff0c;怎么做&#xff1f; 解决方案 有一种非常优雅的方法&#xff0c;可以将数据换算和转换结合在一起——在函数参数中使用 生成器表达式。 一个直观的案例&#…

ATA-7030高压放大器应用分享:铁电体和压电材料

经过多年研究探索&#xff0c;Aigtek安泰电子功率放大器目前已拥有一众完善的系列功放产品&#xff0c;可为超声测试、生物医疗、水声测试、压电驱动、电磁驱动、MEMS测试等众多研究项目提供系统性的行业测试方案&#xff0c;其中对于压电极化测试、铁电极化测试&#xff0c;Ai…

GPT-4o:人工智能新纪元的突破与展望

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…