echarts图表自定义配置(二)——代码封装

news2025/3/1 13:31:52

在这里插入图片描述

下图是初版,火山图的代码。可以看出,里面的变量,逻辑,函数存在冗余,基本上都是改了参数,同样的get和set,去刷新图表;对于往后继续开发十几二十个图表,会很麻烦。因此需要将这一些基本配置:字体,颜色,样式,大小,下拉色卡 / Vuex的相关参数,方法进行代码封装。

在这里插入图片描述

  1. 封装fontSetting组件,将图表标题,x轴标题,y轴标题,x轴标签,y轴标签的自定义配置,进行统一管理
<!--父组件使用fontSetting-->
<!--
    传入参数:
        chart-type:用于判断图表类型,如果是饼图是没有x,y轴的相关参数的
        settings:echarts的一些配置信息,具体来说就是一个对象里面,包含了之前的所有”fontSize,		fontFamily ... ...“
-->
<font-settings :chart-type="'GeenLen'" :settings="geenLenOptions.settings" />


<!--子组件,fontSetting.vue-->
<div class="itemList">
    <div class="item" v-for="(item, index) in fontSettings" :key="index">
      <div class="font-title">{{ item.label }}</div>
      <div class="font-controls">
        <div class="control-item" v-if="item.textKey">
          <span>文本:</span>
          <el-input
            v-model="settings[item.textKey]"
            size="medium"
            @input="value => handleFontChange(item.textKey, value)"
          ></el-input>
        </div>
        <div class="control-item">
          <span>字体:</span>
          <el-select
            v-model="settings[item.familyKey]"
            size="large"
            @change="value => handleFontChange(item.familyKey, value)"
          >
            <el-option
              v-for="font in fontFamilies"
              :key="font.value"
              :label="font.label"
              :value="font.value"
            ></el-option>
          </el-select>
        </div>
        <div class="control-item">
          <span>大小:</span>
          <el-input-number
            v-model="settings[item.sizeKey]"
            :min="8"
            :max="72"
            size="medium"
            @change="value => handleFontChange(item.sizeKey, value)"
          ></el-input-number>
        </div>
        <div class="control-item">
          <span>颜色:</span>
          <el-color-picker
            v-model="settings[item.colorKey]"
            size="medium"
            @change="value => handleFontChange(item.colorKey, value)"
          ></el-color-picker>
        </div>
        <div class="control-item">
          <span>样式:</span>
          <el-switch
            v-model="settings[item.styleKey]"
            active-value="italic"
            inactive-value="normal"
            active-text="斜体"
            @change="value => handleFontChange(item.styleKey, value)"
          ></el-switch>
        </div>
      </div>
    </div>
</div>
//子组件的相关参数和方法
//接收父组件的传值
props: {
    settings: {
      type: Object,
      required: true
    },
    chartType: {
      type: String,
      required: true
    }
},
//自定义参数配置    
data() {
    return {
      fontSettings: [
        { 
          label: '图表标题',
          textKey: 'title',
          familyKey: 'titleFontFamily',
          sizeKey: 'titleFontSize',
          colorKey: 'titleFontColor',
          styleKey: 'titleFontStyle'
        },
        { 
          label: 'X轴标题',
          textKey: 'xAxisTitle',
          familyKey: 'xAxisTitleFontFamily',
          sizeKey: 'xAxisTitleFontSize',
          colorKey: 'xAxisTitleFontColor',
          styleKey: 'xAxisTitleFontStyle'
        },
        { 
          label: 'Y轴标题',
          textKey: 'yAxisTitle',
          familyKey: 'yAxisTitleFontFamily',
          sizeKey: 'yAxisTitleFontSize',
          colorKey: 'yAxisTitleFontColor',
          styleKey: 'yAxisTitleFontStyle'
        },
        { 
          label: 'X轴标签字体',
          familyKey: 'xAxisLabelFontFamily',
          sizeKey: 'xAxisLabelFontSize',
          colorKey: 'xAxisLabelFontColor',
          styleKey: 'xAxisLabelFontStyle'
        },
        { 
          label: 'Y轴标签字体',
          familyKey: 'yAxisLabelFontFamily',
          sizeKey: 'yAxisLabelFontSize',
          colorKey: 'yAxisLabelFontColor',
          styleKey: 'yAxisLabelFontStyle'
        }
      ],
      fontFamilies: [
        { label: 'Arial', value: 'Arial' },
        { label: 'Times New Roman', value: 'Times New Roman' },
        { label: '微软雅黑', value: 'Microsoft YaHei' },
        { label: '宋体', value: 'SimSun' },
        { label: '黑体', value: 'SimHei' }
      ]
    };
},
//判断哪些图表不需要x/y轴配置
mounted() {
    if (this.chartType === 'GeenLen') {
      this.fontSettings = this.fontSettings.filter(item => item.label == '图表标题');
    }
},

methods: {
    ...mapActions('echartEncapsulation', ['updateStyle', 'setOptions', 'setSetting']),
    handleFontChange(key, value) {
      //change事件触发时,更新父组件的settings对象,并且将修改后的值更新到Vuex中
      this.$emit('update:settings', {
        ...this.settings,
        [key]: value
      });
      this.updateStyle({
        target: 'readsRegion',
        key,
        value
      });
    }
}
//vuex
updateStyle({ commit }, { key, value }) {
    commit('SET_STYLE', { key, value });
},
SET_STYLE(state, { key, value }) {
    state.insertSizeOptions.settings[key] = value;
},
  1. 封装色卡组件colorList,实现在多个图表中,切换整体色系风格。色卡选择器的代码和上一篇博文是一致的,区别就是:传入chart-type参数,用于触发不同的事件回调函数。

    this.$emit(``change${this.chartType}, selectedColors.colors);

<!--父组件使用colorList-->
<ColorList :chart-type="'GeenLen'" @changeGeenLen="handleColorChange"></ColorList>
<!--兄弟组件中,对于$emit触发的函数,进行处理-->
this.$bus.$on('updateColorGoBar', (colors) => {
	this.colorList = colors
});
beforeDestroy() {
// 组件销毁前移除事件监听
	this.$bus.$off('updateColorGoBar');
},
<!--子组件colorList-->
<template>
  <div class="color-template-select">
    <el-select
      v-model="selectedValue"
      :placeholder="placeholder"
      @change="handleTemplateChange"
      :style="{ width: width }"
      ref="selectRef"
    >
      <el-option
        v-for="(template, index) in colorTemplates"
        :key="index"
        :label="template.name"
        :value="template.name"
      >
        <div style="display: flex; gap: 5px">
          <div
            v-for="(color, colorIndex) in template.colors"
            :key="colorIndex"
            class="color-box"
            :style="{
              backgroundColor: color,
              width: '20px',
              height: '20px',
            }"
          ></div>
        </div>
      </el-option>
    </el-select>
  </div>
</template>

<script>
export default {
  name: 'ColorTemplateSelect',
  props: {
    width: {
      type: String,
      default: '250px'
    },
    placeholder: {
      type: String,
      default: ''
    },
    chartType: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      selectedValue: '',
      selectSVG: '',
      colorTemplates: [],
        },
      ],
    };
  },
  mounted() {
    const defaultColors = this.colorTemplates[0].colors;
    // this.$emit('changeGoBar', defaultColors);
    this.$emit(`change${this.chartType}`, defaultColors);
    this.getSvgString(defaultColors);
  },
  methods: {
    handleTemplateChange() {
      const selectedColors = this.colorTemplates.find(
        (template) => template.name === this.selectedValue
      );
      
      if (selectedColors) {
        // console.log(this.chartType,"-----");
        this.$emit(`change${this.chartType}`, selectedColors.colors);
        // this.$emit('changeGoBar', selectedColors.colors);
        this.selectedValue = "";
        this.getSvgString(selectedColors.colors);
      }
    },
  }
};
</script>
  1. 全局更新
this.$store.dispatch("echartEncapsulation/setSetting", {
    target: "goBar",
    settings: initialSettings,
});
setSetting({ commit }, { target, settings }) {
    commit('SET_SETTINGS', { target, settings });
}
SET_SETTINGS(state, { target, settings }) {
    state[`${target}Options`].settings = settings;
}

相当于此前,一个图表的配置,相关函数,重复逻辑可能会有上千行,如果存在十几二十个图表,对于后期维护极差,在封装后,基本能够减少80%的代码量,并且减少后续开发投入的精力

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

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

相关文章

如何用状态图进行设计05

到目前为止&#xff0c;我们已经讨论了状态图的原理。这些原理对状态图和扩展状态图都适用。第二章后面的部分主要讲述了扩展状态图的扩展功能。我们将围绕这些增强的功能&#xff0c;使你对BetterState Pro的设计能力有很好的了解。 关于这些内容和其他有关扩展状态图特性的完…

鸿蒙NEXT开发案例:九宫格随机

【引言】 在鸿蒙NEXT开发中&#xff0c;九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖&#xff0c;用户可以随机获得不同奖品&#xff0c;增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能&#xff0c;并通过代码解析展示实现细节。 【环境准…

【efinance一个2k星的库】

efinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库&#xff0c;回测以及量化交易的好帮手 但没有等比复权的&#xff0c;不用。 import efinance as ef ef.stock.get_quote_history(510880,fqt2)

协同办公软件新升级:细节优化,让办公更简单

细节决定成败&#xff0c;企业酷信协同办公系统通过贴近客户实际需求的一系列改进和创新&#xff0c;在技术架构、系统结构、管理理念和使用性能上&#xff0c;都达到了国内先进水平&#xff0c;同时具备独特的优势。让我们看看企业酷信是如何通过这些细节提升&#xff0c;为企…

【AI知识】有监督学习分类任务之支持向量机

1.支持向量机概念 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 是一种有监督学习算法&#xff0c;主要用于分类任务&#xff08;也可用于回归任务&#xff0c;即支持向量回归&#xff0c;SVR&#xff09;。SVM的核心思想是找到一个最优的超平面&#xff0…

MySQL有哪些高可用方案?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助&#xff1b; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…

利用Docker分层构建优化镜像大小

合适docker镜像文件大小不仅影响容器启动效率&#xff0c;也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像&#xff0c;采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…

threejs——无人机概念切割效果

主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…

我的AI工具箱Tauri版-SpiderYtDlp油管视频多功能下载

本教程基于自研的AI工具箱Tauri版进行SpiderYtDlp油管视频多功能下载。 SpiderYtDlp油管视频多功能下载 是一款基于自研AI工具箱的全新解决方案&#xff0c;专为满足多场景需求的用户设计。工具集成了便捷的链接直接下载功能和强大的关键词模糊搜索下载功能&#xff0c;赋能创…

PyCharm如何导入库( 包 )

目录 1.在主界面中导库 2.用设置->项目安装库 2.1.使用右上方按钮 2.2.使用右下方Python解释器 3.使用左下角终端导库 1.在主界面中导库 在主界面输入导库后等待一会儿&#xff0c;会在那一行出现一个红色灯。 图1 红色灯 我们点击红色灯&#xff0c;会出现 图2 错误选…

Bananna Pi开源社区联合矽昌通信打造开源的低成本Wifi5路由器

香蕉派 BPI-Wifi5 路由器采用矽昌SF19A2890S2芯片方案设计。它是一款高性能无线路由器&#xff0c;适用于小微企业、家庭和其他网络环境。Banana Pi开源社区提供整体解决方案。所有代码开源&#xff0c;用户可以在上面自由开发自己的应用。 Banana Pi wifi5 路由器github代码: …

Spring Boot教程之二十五: 使用 Tomcat 部署项目

Spring Boot – 使用 Tomcat 部署项目 Spring Boot 是一个基于微服务的框架&#xff0c;在其中创建可用于生产的应用程序只需很少的时间。Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。如今&#xff0c;它正成为开发人员的最爱&#xff0c;因为它是一个…

scale index的计算

scale index定义 基本实现 需要注意&#xff0c;scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是&#xff0c;需要注意&#xff0c;经过我向作者求证。 MATLAB编写的代码已经“过时了”&#xff0c;为了拥抱时代&#xff0c;作者构建了R语言包&#xff0c;名称为…

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色

【Java Nio Netty】基于TCP的简单Netty自定义协议实现(万字,全篇例子)

基于TCP的简单Netty自定义协议实现&#xff08;万字&#xff0c;全篇例子&#xff09; 前言 有一阵子没写博客了&#xff0c;最近在学习Netty写一个实时聊天软件&#xff0c;一个高性能异步事件驱动的网络应用框架&#xff0c;我们常用的SpringBoot一般基于Http协议&#xff0…

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库 环境下载 MySQL 5.7.44 包安装标题检查服务是否启动成功遇到的问题登陆&修改密码&远程访问 环境 操作系统&#xff1a;Ubuntu 20.04.4 LTS 数据库&#xff1a;MySQL 5.7.34 内核版本&#xff1a;x86_64&#xff08;amd…

后端-redis的使用

redis的服务端启动命令&#xff0c;打开redis的目录&#xff0c;输入cmd redis的客户端启动命令 设置redis密码 redis连接 指定ip地址的服务端,没设密码&#xff1a;redis-cli.exe -h localhost -p 6379 edis连接 指定ip地址的服务端,设置了密码&#xff1a;redis-cli.ex…

前端成长之路:CSS字体、文本属性和引入方式

本文主要介绍CSS的字体属性和文本属性&#xff0c;最后再介绍CSS在HTML中的引入方式。 CSS字体属性 CSS Fonts&#xff08;字体&#xff09;属性能用于定义字体系列属性&#xff0c;包括但不限于字体大小、粗细、字体样式等。 字体系列 在CSS中使用font-family属性定义文本…

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么&#xff1f; 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…

排序算法(2):选择排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 选择排序 选择排序每次从待排序序列中选出最小&#xff08;或最大&#xff09;的元素&#xff0c;将其放到序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;或最大&#xff09;元素…