(echarts)饼图封装相关总结及使用

news2025/2/24 3:53:50

(echarts)饼图封装相关总结


在这里插入图片描述


一、封装组件pieCharts.vue

<template>
  <div :id="id" :class="className" :style="{ height: height, width: width }" />
</template>

<script>
import echarts from 'echarts'
import resize from '@/components/Charts/mixins/resize' //自适应画布

export default {
  mixins: [resize],
  props: {// 使用页面传的数据(有则用新,无则默认)
    className: {
      type: String,
      default: 'chart'
    },
    id: {
      type: String,
      default: 'chart'
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '400px'
    },
    xData: {
      type: Array,
      default: function() {
        return []
      }
    },
    chartData: {
      type: Object,
      default: function() { 
        return {
          name: '偏好占比',
          datas: [
            { name: '爱好1', value: 63.8 },
            { name: '爱好2', value: 26.4 },
            { name: '其他', value: 9.8 }
          ]
        }
      }
      // required: true,
    }
  },
  data() {
    return {
      chart: null
    }
  },
  //监听数据若变化同步渲染图表
  watch: {
    chartData: {
      deep: true,
      handler(val) {
        this.setOptions(val)
      }
    }
  },
  // mounted周期
  mounted() { 
    this.$nextTick(() => {
      this.initChart1()
    })
  },
  // beforeDestroy周期
  beforeDestroy() {
  	//如果chart存在则用dispose销毁,不存在则过
    if (!this.chart) {
      return
    }
    this.chart.dispose()
    this.chart = null
  },
  // 方法
  methods: {
    initChart1() {
      this.chart = echarts.init(document.getElementById(this.id), 'macarons')
      this.setOptions(this.chartData)
    },
    setOptions(chartObj) {
      this.chart.setOption({
        //标签设置
        tooltip: {
          trigger: 'item'
          formatter:'{b}:({d}%)',
        },
        //图例设置
        legend: {
          orient: 'horizontal',//水平
          left: 'center',  //居中
          orient: "vertical",//垂直
          left: "left",//左侧
          bottom: "5%",//距底部
          textStyle: {
            color: "#ffffff",
            size: 14,
          },
          type: "scroll",
          pageIconColor: '#ffffff', //图例分页左右箭头图标颜色
          pageTextStyle: {
            color: '#ffffff', //图例分页页码的颜色设置
          },
          pageIconSize: 12, //当然就是按钮的大小
          pageIconInactiveColor: "#7f7f7f", // 禁用的按钮颜色 
        },
        //颜色设置
        color: [
          '#52A8FF',
          '#00B389',
          '#FFA940',
          '#FF5A57',
          '#29EFC4',
          '#F8AEA4',
          '#FFC53D',
          '#009982',
          '#C099FC',
          '#F5855F'
        ],
        //数据
        series: [
          {
            name: chartObj.name,//父组件传的数据名称
            type: 'pie',//类型
            radius: '50%',//半径程度,50%时是圆
            label: {
              normal: {
                formatter: "{b}:({d}%)",//显示格式
                formatter: (params) => {//显示格式
                  //调用自定义显示格式
                  return this.getEqualNewlineString(params,8); //过长处理
                },
              }
            },
            data: chartObj.datas,//父组件传的数据值
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }
        ]
      })
    },
    //params 要处理的字符串 每行显示长度
    getEqualNewlineString(params, length) {
      return params.name +":" + "\n" +"("+params.percent+"%)"
      let text = "";
      let textString = `${params.name}:(${params.percent}%)`
      console.log(params);
      let count = Math.ceil(textString.length / length); // 向上取整数
      // 一行展示length个
      if (count > 1) {
        for (let z = 1; z <= count; z++) {
          text += textString.substr((z - 1) * length, length);
          if (z < count) {
            text += "\n";
          }
        }
      } else {
        text += textString.substr(0, length);
      }
      return text;
    },
  }
}
</script>

<style>
</style>


二、页面使用

<div class="charts">
 <pie-chart :id="'pieChart'" :height="'420px'" :chart-data="regionalDistribution" />
</div>

<script>
import PieChart from './charts/pieChart'
export default { 
	components: { PieChart},//组件注册
	data(){
		return:{		
	      regionalDistribution: {
	        name: '区域分布',
	        datas: []
	      },
		}
	}
}
</script>

// 样式
.charts {
    height: 420px;
    box-sizing: border-box;
    border: 1px solid rgb(213, 223, 232);
  }

拓展:自适应resize.js

import { debounce } from '@/utils'

export default {
  data() {
    return {
      $_sidebarElm: null,
      $_resizeHandler: null
    }
  },
  mounted() {
    this.initListener()
  },
  activated() {
    if (!this.$_resizeHandler) {
      // avoid duplication init
      this.initListener()
    }

    // when keep-alive chart activated, auto resize
    this.resize()
  },
  beforeDestroy() {
    this.destroyListener()
  },
  deactivated() {
    this.destroyListener()
  },
  methods: {
    // use $_ for mixins properties
    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
    $_sidebarResizeHandler(e) {
      if (e.propertyName === 'width') {
        this.$_resizeHandler()
      }
    },
    initListener() {
      this.$_resizeHandler = debounce(() => {
        this.resize()
      }, 100)
      window.addEventListener('resize', this.$_resizeHandler)

      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
      this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
    },
    destroyListener() {
      window.removeEventListener('resize', this.$_resizeHandler)
      this.$_resizeHandler = null

      this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
    },
    resize() {
      const { chart } = this
      chart && chart.resize()
    }
  }
}

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

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

相关文章

STM32Cube高效开发教程<基础篇>(三)----STM32CubeMX创建工程

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、新建项目 …

亚马逊频繁封号,跨境电商卖家如何应对?

相信各位同行都知道&#xff0c;自2021年起&#xff0c;亚马逊的扫号活动就从未间断&#xff0c;直到如今2023年的亚马逊&#xff0c;仍然是隔2周-几个月就有大规模的审核扫号&#xff0c;大批卖家店铺被封&#xff0c;亚马逊卖家人人自危&#xff0c;面对时间间隔短频率高的扫…

WordPress插件 WP-PostViews 汉化语言包

WP-PostViews汉化语言包 WP-PostViews是一款很受欢迎的文章浏览次数统计插件&#xff0c;记录每篇文章展示次数、根据展示次数显示历史最热或最衰的文章排行、展示范围可以是全部文章和页面&#xff0c;也可以是某些目录下的文章和页面。本文还介绍了一些隐藏的功能&#xff0…

【完美世界】石昊偷渡出境四人组产生分歧,云曦和石昊牵手,二人世界要开始了

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析完美世界。 转眼又到完美世界动漫更新日&#xff0c;现在第132集已经更新了了。而这一集看下来&#xff0c;很明显完美世界又进步了&#xff0c;不但剧情紧凑&#xff0c;高潮点也要来了。而这一集看下来信息量也很多&…

k8s 1.28版本二进制安装

本文目录 二进制安装Kubernetes&#xff08;k8s&#xff09;v1.28.0介绍1.环境1.0.环境准备1.Linux网卡没有eth0显示ens33或者其它&#xff08;以ens33为例&#xff09;方法一&#xff1a;修改网卡配置方法二&#xff1a;重新安装机器(本文为虚拟机) 2.克隆的虚拟机&#xff0c…

UE5 Texture2D数组资产BUG!!!

Texture2D数组资产中的元素资产更新后&#xff0c;并未被更新&#xff0c;读取的仍然是之前缓存的Texture2D&#xff0c;需要手动清除后再手动设置新的Texture2D&#xff0c;才能生效&#xff01;&#xff01;&#xff01; 说明&#xff1a;Texture2D数组资产中的后期参数高于…

vmware vsphere用户权限分级

组或用户创建 在“系统管理→Single Sign On→用户和组”中“用户”选项卡中的“域”下拉列表中选择vSphere.local&#xff0c;单击“添加用户”。 权限分配 “系统管理→访问控制→角色”中查看或分配权限。 分类 1、管理员&#xff1a;具有完全的权限&#xff1b; 2、只…

当多条折线数据渲染在一个echarts里,这些折线的x轴数据是不统一的,处理方法

文档中series可以写成[[x轴值&#xff0c;y轴值],[x轴值&#xff0c;y轴值],[x轴值&#xff0c;y轴值]] 这种形式&#xff0c; 如果写成这样那么x轴会以series数组第一个子数组的x轴值的范围来定义&#xff0c;所以大家可以在给series赋值之前排个序&#xff0c;将子数组最多的…

【特纳斯电子】基于STM32的商用厨房监控系统-实物设计

视频及资料链接&#xff1a;基于STM32的商用厨房监控系统-实物设计 - 电子校园网 (mcude.com) 编号&#xff1a; T0052203M-SW 设计简介&#xff1a; 本设计是基于STM32的商用厨房监控系统&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示温度、烟雾浓度、燃气浓…

2023年中国云存储优势、产值及市场规模分析[图]

云存储是基于云计算建立起来的一个网络存储技术即与计算的存储部分&#xff0c;将网络中的不同设备通过应用程序连接起来&#xff0c;进行协同工作&#xff0c;对外提供数据存储和业务访问。 云存储优势 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 云存…

Kafka SASL认证授权(四)认证源码解析

Kafka SASL认证授权(四)认证源码解析。 官网地址:https://kafka.apache.org/ 一、认证流程 在了解kafka网络模型的基础上,了解它的认证流程: ApiVersionsRequest->SaslHandshakeRequest->a series of SASL client and server tokens corresponding to the mechani…

vue自定义指令directives

官网:https://cn.vuejs.org/v2/guide/custom-directive.html v-if等是内置的指令, 在这里研究自定义指令 局部自定义指令 在directives中定义,在一个组件中定义的,只能在这一个组件中使用 ; 定义命令: directives:{//自定义指令color,el是这个标签,binding是传入的值color:f…

SyntaxError: invalid character ‘:‘ (U+FF1A)问题解决

问题&#xff1a; SyntaxError: invalid character &#xff1a; (UFF1A) 原因及解决方法&#xff1a; 冒号输入的格式不对&#xff0c;冒号的输入为中文&#xff0c;改成英文即可。

[C++随想录] 模版进阶

模版进阶 模版中 class 与 typename非类型模版参数模版的分离编译模版的特化函数模版的特化类模板的特化1. 全特化2.偏特化 模版中 class 与 typename 一般情况下, 我们定义一个模版, 模版中的 class/ typename 的意义是一样的. 但是, 有一种情况除外&#x1f447;&#x1f44…

【Linux】 ps命令使用

作为一个后端的程序员&#xff0c;我们经常用到ps -ef | grep XXX 到底什么事ps呢。 下面我们一起学习一下吧、 ps &#xff08;英文全拼&#xff1a;process status&#xff09;命令用于显示当前进程的状态&#xff0c;类似于 windows 的任务管理器。 ps命令 -Linux手册页 …

云原生SIEM解决方案

云原生&#xff08;Cloud Native&#xff09;是一种基于云计算的软件开发和部署方法论&#xff0c;它强调将应用程序和服务设计为云环境下的原生应用&#xff0c;以实现高可用性、可扩展性和灵活性。 云原生的优势有哪些 高可用性&#xff1a;云原生可以实现应用程序的高可用…

易点易动RFID固定资产管理系统:实现固定资产快速准确盘点的利器

在现代企业管理中&#xff0c;固定资产的盘点是一项重要而繁琐的任务。传统的盘点方法往往耗时耗力&#xff0c;容易出现错误和遗漏&#xff0c;给企业带来不必要的麻烦和损失。为了解决这些问题&#xff0c;我们推出了易点易动RFID固定资产管理系统&#xff0c;它利用射频识别…

Plsql连接报Initialization Error:Could not initialize oci.dll

可能原因&#xff1a;本地plsql为32位。 目前本机中使用的是 instantclient_19_6&#xff0c;其中的oci.dll库为64位。 到Oracle官网下载 http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 下载Instant Client for Microsoft Window…

JavaScript之正则表达式

详见MDN 正则表达式(RegExp) 正则表达式不是JS独有的内容&#xff0c;大部分语言都支持正则表达式 JS中正则表达式使用得不是那么多&#xff0c;我们可以尽量避免使用正则表达式 在JS中&#xff0c;正则表达式就是RegExp对象&#xff0c;RegExp 对象用于将文本与一个模式匹配 正…

轻松搭建个人web站点:OpenWRT教程结合内网穿透技术实现公网远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦 &#x1f516;系列专栏&#xff1a; C语言、Linux &#x1f325;️每日语录&#xff1a;山不让尘&#xff0c;川不辞盈。 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web …