vue3+TS+echarts 折线图

news2025/4/26 20:52:01

需要实现的效果如下

<script setup lang="ts" name="RepsSingleLineChart">
  import * as echarts from 'echarts'
  import { getInitecharts } from '@/utils/echart'
  import type { EChartsOption } from 'echarts'

  // 定义 props 类型
  interface Props {
    id: string
    dataObj: Record<string, unknown> | null
  }

  // 定义 props
  const props = defineProps<Props>()

  // 定义 ECharts 实例类型
  let myChart: echarts.ECharts | null = null
  // 定义 ECharts 配置项
  const option = ref<EChartsOption>({
    grid: {
      top: '30px',
      left: '17px',
      right: '20px',
      bottom: '9px',
      containLabel: true,
    },
    xAxis: {
      type: 'category',
      boundaryGap: false,
      data: ['2025.01', '2025.02', '2025.03', '2025.04', '2025.05', '2025.06'],
      axisTick: {
        alignWithLabel: true,
        show: false,
      },
      axisLine: {
        show: true, // 确保显示轴线
        lineStyle: {
          color: 'rgba(153,204,255,0.50)',
          type: 'solid', // 设置为实线
          width: 1,
        },
      },
      axisLabel: {
        color: '#DAECFF',
        fontSize: 14,
        fontFamily: 'Arial, Arial-400',
        fontWeight: 400,
        lineHeight: 36,
        formatter: function (value: string, index: number) {
          if (index === 0) {
            return '{a|' + value + '}' // First label
          } else if (index === 5) {
            return '{b|' + value + '}' // Last label
          }
          return value
        },
        rich: {
          a: {
            padding: [0, 0, 0, 5],
          },
          b: {
            padding: [0, 25, 0, 0],
          },
        },
      },
      // 添加X轴网格线配置
      splitLine: {
        show: true, // 不显示X轴方向的网格线
        lineStyle: {
          color: 'rgba(153,204,255,0.20)',
          type: 'dashed',
          width: 1,
        },
      },
    },
    yAxis: {
      type: 'value',
      axisLabel: {
        color: 'rgba(218,236,255,0.60)',
        fontSize: 14,
        fontFamily: 'Arial, Arial-400',
        fontWeight: 400,
        lineHeight: 20,
      },
      // Y轴轴线样式
      axisLine: {
        show: false,
      },
      // Y轴刻度线样式
      axisTick: {
        show: false,
      },
      // Y轴网格线样式(设置为虚线)
      splitLine: {
        show: true,
        lineStyle: {
          color: 'rgba(153,204,255,0.20)', // 浅色虚线
          type: 'dashed', // 虚线样式
          dashOffset: 2, // 虚线偏移量
          width: 1,
        },
      },
    },
    series: [
      {
        data: [820, 932, 0, 0, 1290, 1330],
        type: 'line',
        symbol: 'circle', // 设置拐点为圆形
        symbolSize: 6, // 设置拐点大小为6px
        silent: true,
        label: {
          show: true, // 显示标签
          position: 'top', // 显示在拐点上方
          // distance: 10, // 标签距离拐点的距离
          color: '#ffffff', // 文字颜色
          fontSize: 14, // 文字大小
          fontFamily: 'Arial, Arial-700', // 字体
          fontWeight: 'bold', // 字重
          lineHeight: 12, // 行高
          formatter: '{c}', // 显示数据值
        },
        areaStyle: {
          color: {
            type: 'linear',
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [
              {
                offset: 0,
                color: 'rgba(0,230,191,0.30)', // 渐变起始颜色
              },
              {
                offset: 1,
                color: 'rgba(0,230,191,0.10)', // 渐变结束颜色
              },
            ],
          },
        },
        lineStyle: {
          color: '#00E5BF',
          width: 2,
        },
        itemStyle: {
          color: '#00e5bf', // 设置拐点填充色
          borderColor: 'rgba(0,229,191,0.40)', // 设置拐点边框颜色
          borderWidth: 3, // 设置拐点边框宽度
        },
      },
    ],
  })
  // 定义空数据时的提示信息
  const emptyObj = reactive<Record<string, string>>({
    dashboardPtglHyxxs: '暂无学校数据',
    dashboardPtglRzqys: '暂无企业数据',
  })

  /**
   * @description: 渲染
   * @return {void}
   */
  const getRender = () => {
    if (myChart) {
      myChart.dispose()
    }

    myChart = getInitecharts(echarts, props.id)

    nextTick(() => {
      if (!myChart) return

      if (props.dataObj && Object.keys(props.dataObj).length > 0) {
        console.log(props.dataObj)

        myChart.setOption(option.value)
      } else {
        myChart.setOption({
          // 禁用所有交互
          tooltip: {
            show: false,
          },
          graphic: {
            elements: [
              {
                type: 'group',
                left: 'center',
                top: 'center',
                silent: true, // 关键设置:禁用交互
                children: [
                  {
                    type: 'image',
                    style: {
                      image: '/src/assets/img/table-empty.png',
                      width: 88,
                      height: 88,
                    },
                    y: 0,
                  },
                  {
                    type: 'text',
                    style: {
                      text: emptyObj[props.id],
                      fontSize: 14,
                      fontWeight: '400',
                      fill: 'rgba(255, 255, 255, .8)',
                      opacity: '.8',
                      fontFamily: 'Microsoft YaHei UI, Microsoft YaHei UI-400',
                      lineHeight: 24,
                      letterSpacing: 0.07,
                    },
                    y: 88 + 4, // 图片高度 + 间隔
                    x: 2,
                  },
                ],
              },
            ],
          },
        })
      }
    })
  }

  watch(
    () => props.dataObj,
    () => {
      getRender()
    },
    { deep: true },
  )

  onMounted(() => {
    getRender()
  })
</script>

<template>
  <div :id="props.id" class="line"></div>
</template>

<style lang="less" scoped>
  .line {
    width: 100%;
    height: 100%;
  }
</style>

封装echarts统一调用

import * as echarts from 'echarts'

/**
 * @description: 初始化echarts
 * @param {typeof echarts} echartsInstance echarts实例
 * @param {string} id dom的id
 * @param {('canvas' | 'svg')} renderer 渲染方式
 * @returns {echarts.ECharts} echarts实例
 */
export function getInitecharts(
  echartsInstance: typeof echarts,
  id: string,
  renderer: 'canvas' | 'svg' = 'canvas',
): echarts.ECharts {
  const dom = document.getElementById(id)
  if (!dom) {
    throw new Error(`Element with id "${id}" not found`)
  }
  return echartsInstance.init(dom, null, {
    renderer,
    useDirtyRect: false,
  })
}

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

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

相关文章

小火电视桌面TV版下载-小火桌面纯净版下载-官方历史版本安装包

别再费心地寻找小火桌面的官方历史版本安装包啦&#xff0c;试试乐看家桌面吧&#xff0c;它作为纯净版本的第三方桌面&#xff0c;具有诸多优点。 界面简洁纯净&#xff1a;乐看家桌面设计简洁流畅&#xff0c;页面简洁、纯净无广告&#xff0c;为用户打造了一个干净的电视操…

androidstudio安装配置

B站配置视频AndroidStudio安装配置教程&#xff08;最新版本教程&#xff09;3分钟搞定 快速安装使用_哔哩哔哩_bilibili 1、环境变量 D:\AndroidSdk ANDROID_HOME ANDROID_SDK_HOME 2、新建 3、配置 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-…

《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现

基于RAG向量数据库的知识库AI问答助手设计与实现 引言 随着大语言模型&#xff08;LLM&#xff09;技术的快速发展&#xff0c;构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…

BeeWorks Meet:私有化部署视频会议的高效选择

在数字化时代&#xff0c;视频会议已成为企业沟通协作的重要工具。然而&#xff0c;对于金融、政务、医疗等对数据安全和隐私保护要求极高的行业来说&#xff0c;传统的公有云视频会议解决方案往往难以满足其严格的安全标准。此时&#xff0c;BeeWorks Meet 私有化部署视频会议…

IPv6 技术细节 | 源 IP 地址选择 / Anycast / 地址自动配置 / 地址聚类分配

注&#xff1a;本文为 “IPv6 技术细节” 相关文章合集。 部分文章中提到的其他文章&#xff0c;一并引入。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 闲谈 IPv6 - 典型特征的一些技术细节 iteye_21199 于 2012-11-10 20:54:00 发布 0. 巨大的…

【工具】使用 MCP Inspector 调试服务的完全指南

Model Context Protocol (MCP) Inspector 是一个交互式开发工具&#xff0c;专为测试和调试 MCP 服务器而设计。本文将详细介绍如何使用 Inspector 工具有效地调试和测试 MCP 服务。 1. MCP Inspector 简介 MCP Inspector 提供了直观的界面&#xff0c;让开发者能够&#xff…

【音视频】AVIO输入模式

内存IO模式 AVIOContext *avio_alloc_context( unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t (*seek)(…

Uniapp:scroll-view(区域滑动视图)

目录 一、基本概述二、属性说明三、基本使用3.1 纵向滚动3.2 横向滚动一、基本概述 scroll-view,可滚动视图区域。用于区域滚动。 二、属性说明 属性名类型默认值说明平台差异说明scroll-xBooleanfalse允许横向滚动scroll-yBooleanfalse允许纵向滚动三、基本使用 3.1 纵向滚…

单精度浮点运算/定点运算下 MATLAB (VS) VIVADO

VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比 MATLAB定点运算仿真&#xff0c;对比VIVADO计算的结果 目录 前言 一、VIVADO与MATLAB单精度浮点数运算结果对比 二、MATLAB定点运算仿真 总结 前言 本文介绍了怎么在MATLAB中使用单精度浮点数进行运算…

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明

一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件&#xff0c;提供以下核心功能&#xff1a; 嵌入式提问&#xff1a;对选中的文本内容进行AI分析&#xff0c;通过侧边栏聊天界面与AI交互&#xff0c;实现多轮对话、问题解答或代码生成。对话式提问&#xff1a;独…

【MySQL数据库入门到精通-07 函数-字符串函数、数值函数、日期函数和流程函数】

文章目录 一、字符串函数1. MySQL中的函数主要分为以下四类&#xff1a; 字符串函数、数值函数、日期函数、流程函数。下面是字符串函数常见的函数&#xff0c;见下表。2.具体代码实现3.结果 二、数值函数1.知识点2.具体代码实现3.结果 三、日期函数1.知识点2.具体代码实现3.结…

Python图像处理——基于Retinex算法的低光照图像增强系统

1.项目内容 &#xff08;1&#xff09;算法介绍 ①MSRCR (Multi-Scale Retinex with Color Restoration) MSRCR 是多尺度 Retinex 算法&#xff08;MSR&#xff09;的扩展版&#xff0c;引入了色彩恢复机制以进一步提升图像增强质量。MSR 能有效地压缩图像动态范围&#xff…

如何在JDK17项目中改成1.8

1.调整 Spring Boot 版本 由于 Spring Boot 3.x 最低要求 JDK 17&#xff0c;所以如果要使用 JDK 8&#xff0c;需要把 spring-boot-starter-parent 的版本降低到 2.7.x 系列&#xff0c;这个系列是支持 JDK 8 的。示例如下&#xff1a; <parent><groupId>org.sp…

【不同名字的yolo的yaml文件名是什么意思】

以下是这些 YOLO 系列配置文件的详细解析&#xff0c;按版本和功能分类说明&#xff1a; 一、YOLOv3 系列 文件名核心特性适用场景yolov3.yaml原始 YOLOv3 结构&#xff0c;3 尺度预测&#xff08;13x13,26x26,52x52&#xff09;通用目标检测yolov3-spp.yaml增加 SPP&#xff…

Zephyr kernel Build System (CMake)介绍

目录 概述 1. 结构介绍 2 构建和配置阶段 2.1 配置阶段 2.2 Cmake编译 3 Zephy项目目录结构 3.1 文件架构 3.2 文件content 概述 本文主要介绍Zephyr kernel Build System CMake的功能&#xff0c;以及使用该工具构建项目&#xff0c;并详细介绍了每个目录以及目录下文…

相对论大师-记录型正负性质BFS/图论-链表/数据结构

看到这一题我的第一个思路就是双向bfs 起点是a&#xff0c;终点还是a&#xff0c;但是flag是相反的&#xff08;“越”的方向&#xff09; tip1.可以用字典vis来存储flag 刚开始初始化时vissta,visend一个对应0、1 要求两个队列相…

Jenkins流水线管理工具

文章目录 前言&#xff1a; DevOps时代的自动化核心 —Jenkins一、Jenkins是什么&#xff1f;二、Linux安装Jenkinswar包方式安装依赖环境下载 Jenkins WAR 包启动 Jenkins 服务启动日志验证配置插件镜像源 docker镜像方式安装依赖环境拉取 Jenkins 镜像运行 Jenkins 容器获取初…

嵌入式开发:基础知识介绍

一、嵌入式系统 1、介绍 以提高对象体系智能性、控制力和人机交互能力为目的&#xff0c;通过相互作用和内在指标评价的&#xff0c;嵌入到对象体系中的专用计算机系统。 2、分类 按其形态的差异&#xff0c;一般可将嵌入式系统分为&#xff1a;芯片级&#xff08;MCU、SoC&am…

el-table中el-input的autofocus无法自动聚焦的解决方案

需求 有一个表格展示了一些进度信息&#xff0c;进度信息可以修改&#xff0c;需要点击进度信息旁边的编辑按钮时&#xff0c;把进度变为输入框且自动聚焦&#xff0c;当鼠标失去焦点时自动请求更新接口。 注&#xff1a;本例以vue2 element UI为例 分析 这个需求看着挺简单…

一文了解智慧教育顶刊TLT的研究热点

本文聚焦于IEEE Transactions on Learning Technologies&#xff08;TLT&#xff09;期刊&#xff0c;通过图文结合的方式&#xff0c;梳理了2025年第18卷的研究热点&#xff0c;帮助读者把握教育技术与人工智能交叉领域的研究进展&#xff0c;深入了解智能学习系统、自适应学习…