使用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: []
    
    };
相关推荐
勇往直前plus11 分钟前
Vue3(篇四)单页面应用到路由管理
javascript·typescript·前端框架·vue
Chengbei111 小时前
云安全漏洞挖掘SKILL、一站式云漏洞挖掘工具,支持S3爆破、IMDS探测、K8s检测与AK/SK权限利用
前端·人工智能·网络安全·云原生·容器·kubernetes·系统安全
不简说2 小时前
JS 代码技巧 vol.9 — 20 个设计模式在真实项目里的应用
前端·javascript·github
CoderLiu2 小时前
Agent 工程的下一层:为什么「把流程写成图」还不够,还需要 Graph Engineering
前端·人工智能·后端
勇往直前plus2 小时前
Vue3(篇三) Element Plus
前端·javascript·typescript·vue
AI_paid_community2 小时前
机械研发人员如何使用 Claude?
java·vue.js
爱勇宝2 小时前
《道德经》第 8 章:真正高级的能力,像水一样成事
前端·后端·程序员
Revolution612 小时前
数组本身没有 map,为什么还能直接调用:原型链怎样查找属性
前端·javascript·面试
bonechips2 小时前
RAG实战(一):EPUB 加载、文本切割与向量入库
前端·数据库
swipe2 小时前
10|(前端转全栈)库存扣减为什么最容易出事故?SKU、并发与原子更新
前端·后端·全栈