使用echart的dataZoom的labelFormatter自定义时间范围

  • 需求:x轴为时间国际值,所以需要转化成'YYYY-MM-DD HH:mm:ss'格式,又因为时间不连续,没值的时间在数组里直接返回null导致x轴其实间断的,也不需要ehcart自动补齐间断的值让他们联系在一起,所以x轴type为category。导致dataZoom的labelFormatter返回的value是百分数(当前时间值占x轴的百分比),但是由于需求特殊我们的返回的不是正规的百分比,最大值才16!,导致浪费了不少时间研究,最后相处来了,既然最大值是16那就以16为100量程,value/16*(x.length-1)就解决了,如果还是除以100 datazoom的悬浮提示的时间范围不正确

  • 代码环境:vue3 ts echart5 moment.js时间转插件

  • 代码

    js 复制代码
    // 后端返回的数据格式,由于不是前段需要的'YYYY-MM-DD HH:mm:ss'格式所以需要对x轴的axisLabel使用数据转化
    const data = [
      [
        "2025-01-24T16:00:00+08:00",
        0
      ],
      null,
      [
        "2025-02-05T10:00:00+08:00",
        1
      ],
      [
        "2025-02-05T11:00:00+08:00",
        11
      ],
      [
        "2025-02-05T12:00:00+08:00",
        1
      ],
      [
        "2025-02-05T13:00:00+08:00",
        11
      ],
      [
        "2025-02-05T14:00:00+08:00",
        10
      ],
      [
        "2025-02-05T15:00:00+08:00",
        1
      ],
      null,
      [
        "2025-02-07T09:00:00+08:00",
        1
      ],
      [
        "2025-02-07T10:00:00+08:00",
        11
      ],
     
      
    ]
    
    
    
    
    // 
    	const getData= ()=>{
    		// 后端返回res
    		echartData.value = res.data[0].data?.map(item=>item?moment(item[0]).format('YYYY-MM-DD HH:mm:ss'):null) // 生成x轴时间数组
    	
    		res.data?.forEach((item,index)=>{
    			series.push({
    							
    							type: 'line',
    							data: item.data,
    						})
    
    		})
    		Option.series= series
    })
    
    
    const echartData = ref(null)
    // 设置图标配置项
    const fanweiSize = ref(null)
    option = {
    //   color: colors,
    //   tooltip: {
    //     trigger: 'axis',
    //     axisPointer: {
    //       type: 'cross'
    //     }
    //   },
    
    //   toolbox: {
    //     feature: {
    //       dataView: { show: true, readOnly: false },
    //       restore: { show: true },
    //       saveAsImage: { show: true }
    //     }
    //   },
    
    // dataZoom: {
    // 		type: 'inside',  //放大缩小x轴数值
    // 	},
    
    	// dataZoom:[{
    	// 	type: 'inside', // 放大和缩小
    	// 	orient: 'vertical',
    	// 	},
    	// 	{
    	// 		type: 'inside', 
    	// 	}],
    
    	dataZoom: [ 	
            {
              show: true,
    		  type: 'slider', // 滑动条型 dataZoom
    	
                
                labelFormatter: (value) => { 	// 核心代码
    			 if(!echartData.value) return
    			 const dataLength = echartData.value.length;
    			  fanweiSize.value&&fanweiSize.value!==0?null:fanweiSize.value=value // 记录首次进入页面获取的时间范围最大值
                  const index = Math.floor((value / fanweiSize.value) * (dataLength - 1)); // 正常是除以100的但是这里不知道哪里问题最大值只有16所以除以16就行了
    			//   console.log((value / 16),dataLength,(value / 16) * (dataLength - 1))
                  const rawDate = echartData.value[index];
    				// console.log(value,"moment(rawDate).format('YYYY-MM-DD HH:mm:ss')",moment(rawDate).format('YYYY-MM-DD HH:mm:ss'))
                  // 格式化时间(假设原始时间字符串已经是合法格式)
                  return moment(rawDate).format('YYYY-MM-DD HH:mm:ss');
                },
            },
            {
              type: 'inside',
             
            },
           
          ],
    
      xAxis: 
        {
          type: 'category', //time
    		axisLabel: {
    				formatter: function (value) {
    					
    					return moment(value).format('YYYY-MM-DD HH:mm:ss');
    				}
    		},
    		axisPointer: {
    			type: 'line',
    			label:{
    				formatter: function (obj) {
    					return moment(obj.value).format('YYYY-MM-DD HH:mm:ss');
    				},
    			} 
    		},
    	},
      
      yAxis: [{
    		type: 'value',
    		name: "数量",
    		nameLocation:'end',
    		nameGap:15,
    		nameTextStyle:{
    			align:'right',
    		},
    		
    	},],
      series: []
    
    };
相关推荐
Cache技术分享6 分钟前
219. Java 函数式编程风格 - 从命令式风格到函数式风格:迭代与数据转换
前端·后端
豆苗学前端9 分钟前
JavaScript原型对象、构造函数、继承与类详解
前端·javascript·后端
飞翔的佩奇11 分钟前
【完整源码+数据集+部署教程】【运动的&足球】足球比赛分析系统源码&数据集全套:改进yolo11-RFAConv
前端·python·yolo·计算机视觉·数据集·yolo11·足球比赛分析系统
支付宝体验科技14 分钟前
SEE Conf 2025:开启体验科技的新十年
前端
TeamDev16 分钟前
使用 Shadcn UI 构建 C# 桌面应用
前端·后端·.net
尘世中一位迷途小书童43 分钟前
Vuetify Admin 后台管理系统
前端·前端框架·开源
参宿743 分钟前
图解Vue3 响应式,手动实现核心原理
前端·javascript·vue.js
2301_801252221 小时前
前端框架Vue(Vue 的挂载点与 data 数据对象)
java·前端·javascript·vue.js·前端框架
资讯第一线1 小时前
《Windows Server 2022》 [2025年10月版 ] [官方IOS] 下载
前端
非凡ghost1 小时前
EaseUS Fixo(易我视频照片修复)
前端·javascript·后端