vue3使用echarts漏斗,根据数据计算比例大小

需求:我们在开发过程中会遇到漏斗图的使用,如果用echarts里面自带的算法绘制渲染漏斗图时候,如果后端给的数据相差不大很接近时候,漏斗图渲染的结果不明显看不出来变化的。

优化之前的漏斗图:
在这里插入图片描述

优化之后的漏斗图:
在这里插入图片描述

1、实现逻辑思路如下然后

首先我们要获取后端给的数据里面数量值。计算出最大的值max。然后计算每个value数量在最大值里面所占的比重大小。这样我们计算出来的漏斗比例就很均匀的分配出来了。

2、具体实现步骤如下

注意点:为了让漏斗自适应根据不同分辨率适配,我们这里使用了window.addEventListener(‘resize’, resize)进行控制,并且防止用户多次恶意操作,加了防抖的限制debounce


<template>
  <div class="annualrecruit-box">
     <div class="search-box">
       <el-date-picker
         v-model="state.annualrecruitform.year"
         @change="getAnnualDoctorData"
         placeholder="请选择年份" 
         :disabled-date="disabledDate"
         type="year" 
         format="YYYY" 
         value-format="YYYY"
         :clearable="false"
         :editable="false"
       >
       </el-date-picker>
     </div>
     <div style="height:420px" ref="categoryChart"></div>
   </div>
</template>

<script setup lang="ts" name="AnnualRecruitmentPatient">
import { GetYearRecruitTesteeConvertSummary } from '/@/api/dashboard/index'
import { reactive, onMounted, onBeforeUnmount, nextTick, ref } from 'vue';
import * as echarts from 'echarts';
import { debounce } from 'lodash-es';
const state = reactive({
 annualrecruitform: {
   year: ''
 },
 dataName: [],
 dataList: [ ] as any
});
const categoryChart = ref()
var myChart = {} as any
const resize = debounce(() => myChart && myChart.resize(), 200)
onMounted (() => {
 getCurrentTime()
 window.addEventListener('resize', resize);
})

onBeforeUnmount(() => {
 window.removeEventListener('resize', resize);
})

//禁用当前日期之后的日期
function disabledDate(time) {
 return time.getTime() > Date.now() - 8.64e7;
}

//获取当前覆盖时间
function getCurrentTime() {
 let currentTime = new Date(), year = currentTime.getFullYear()
 state.annualrecruitform.year = year.toString()
 getAnnualDoctorData()
}

function getAnnualDoctorData () {
 GetYearRecruitTesteeConvertSummary({ year: Number(state.annualrecruitform.year)}).then((res:any) => {
   if (res.data) {
     let legendData = []
     const datavallist = res.data.map((item) => {
         return item.summaryVal
     });
     const max = Math.max(...datavallist)
     if (res.data && res.data.length > 0) {
       legendData = res.data.map((item) => {
         return { name: item.summaryItemName, value: item.summaryVal * 100 / max, _value: item.summaryVal  }
       });
       state.dataName = res.data.map((item) => {
         return item.summaryItemName
       });
     }
     state.dataList = legendData   
     nextTick(() => {
       initEchartFunnel();
     });
     
   }
 });
}

function initEchartFunnel () {
 if (myChart != null && myChart != "" && myChart != undefined) {
  echarts.dispose(categoryChart.value)
 }
 myChart = echarts.init(categoryChart.value);
 const option = {
     title: {
         text: '',
         subtext: ''
     },
     tooltip: {
         trigger: 'item',
         formatter(e){
           return `${e.name} : ${e.data._value}`//将他动态设置 name就是名字 values是我给他新添加的真实数据
         } 
         // formatter: "{a} <br/>{b} : {c}%"
     },
     toolbox: {
       show: 1, x: 'right', y: 'bottom',
         feature: {
             // dataView: {readOnly: false},
             // restore: {},
             // saveAsImage: {}
         }
     },
     legend: {
         bottom: 5,//控制图例出现的距离  默认左上角
         left: 'center',//控制图例的位置
         data: state.dataName
     },

     color: [ '#316BF4', '#0CBAD3', '#7F66EB', '#F3C949', '#FA984E', '#F57373' ],

     series: [
         {
             name:'漏斗图',
             type:'funnel',
             left: '5%',
             top: 60,
             bottom: 60,
             width: '90%',
             min: 0,
             max: 100,
             minSize: '0%',
             maxSize: '100%',
             gap: 2,
             label: {
                 show: true,
                 position: 'inside',
                 formatter(e){
                   return `${e.name}${e.data._value}`
                 }
             },
             labelLine: {
                 length: 10,
                 lineStyle: {
                     width: 1,
                     type: 'solid'
                 }
             },
             itemStyle: {
                 borderColoer: '#fff',
                 borderWidth: 1
             },
             emphasis: {
                 label: {
                     fontSize: 20
                 }
             },
             data: state.dataList
         }
     ]
 };

 myChart.setOption(option);
}
</script>

<style scoped lang="scss">
.annualrecruit-box {
 .search-box {
   text-align: right;
   margin-bottom: 20px;
 }
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端vue keyframes动画

8.1.2 keyframes动画 transition动画适合用来创建简单的过渡效果。CSS3中支持使用animation属性来配置更加复杂的动画效果。animation属性根据keyframes配置来执行基于关键帧的动画效果。新建一个名为keyframes.vue的测试文件。编写如下代码&#xff1a; <template><…

鸿蒙开发语言ArkTS及实践

什么是ArkTS ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上,对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以以更简洁…

.NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式

之前写过使用自定义返回类的方式来统一接口数据返回格式&#xff0c;.Net Core webapi RestFul 统一接口数据返回格式-CSDN博客 但是这存在一个问题&#xff0c;不是所有接口会按照定义的数据格式返回&#xff0c;除非每个接口都返回我们自定义的类&#xff0c;这种实现起来不…

集群与分布式的概念及区别

目前在工作中经常接触到集群的概念&#xff0c;通过这篇文章总结一下集群的几种方式以及和分布式对比学习 1.集群&#xff08;Cluster&#xff09; 集群是由多个计算机节点组成的网络&#xff0c;旨在共同提供服务&#xff0c;并确保高性能和高可用性。在高可用集群中&#xf…

CH06_访问数据结构

Visitor 模式 访问者模式&#xff08;Visitor&#xff09;&#xff0c;表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的提前下定义作用于这些元素的新操作。 类图 说明 Visitor&#xff08;访问者&#xff09; Visitor角色负责对数据结构中每一个…

Java_集合进阶Map集合

一、Map集合 1.1 Map概述体系 各位同学&#xff0c;前面我们已经把单列集合学习完了&#xff0c;接下来我们要学习的是双列集合。首先我们还是先认识一下什么是双列集合。 所谓双列集合&#xff0c;就是说集合中的元素是一对一对的。Map集合中的每一个元素是以keyvalue的形式…

Sublime Text 3配置 C# 开发环境

Sublime Text 3配置 C# 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 C#3. 接入 .NET Framework3.1 下载 .NET Framework3.2 环境变量配置 4. 配置 C# 开发环境5. 编写 C# 代码6. 运行 C# 代码 三、总结 一、引言 C# 是一种面向对象的编程语言&#xff0c;由微…

php学习02-php标记风格

<?php echo "这是xml格式风格" ?><script language"php">echo 脚本风格标记 </script><% echo "这是asp格式风格" %>推荐使用xml格式风格 如果要使用简短风格和ASP风格&#xff0c;需要在php.ini中对其进行配置&#…

在做题中学习(38):快乐数

202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 理解&#xff1a;根据定义一共有两种情况 1.最后变为1 2.最后变为环 思路&#xff1a;可以把两个情况都认为有环&#xff0c;第一个是环一直为1 &#xff08;快满指针法&#xff09; 定义一个快指针和慢指针&#xff0c…

前端---后端 跨域?

一、跨域 &#xff1f; 跨域&#xff08;Cross-Origin Resource Sharing&#xff0c;CORS&#xff09;是浏览器的一项安全功能&#xff0c;它用于限制一个域名下的文档如何从另一个不同的域名、端口或协议请求资源。跨域资源共享&#xff08;Cross-Origin Resource Sharing&am…

黑马点评09 秒杀功能总结

1.整体业务流程 1.1 redis判断流程 &#xff08;单线程&#xff09; 1.首先获取订单id和用户id&#xff0c;调用lua脚本进行redis操作&#xff0c;lua内包括 对购买资格/库存充足的判断 、 扣库存下单、发送订单消息到Stream。 2.Stream组成消息队列&#xff0c;有异常自动放到…

【数字图像处理】实验一 图像基本运算

图像基本运算 一、实验内容&#xff1a; 1&#xff0e; 熟悉和掌握利用Matlab工具进行数字图像的读、写、显示等数字图像处理基本步骤。 2&#xff0e; 熟练掌握各种图像点运算的基本原理及方法。 3&#xff0e; 能够从深刻理解点运算&#xff0c;并能够思考拓展到一定的应用领…

项目中webpack优化配置(1)

项目中webpack优化配置 一. 开发效率&#xff0c; 体验 1. DLL&#xff08;开发过程中减少构建时间和增加应用程序的性能&#xff09; 使用 DllPlugin 进行分包&#xff0c;使用 DllReferencePlugin(索引链接) 对 manifest.json 引用&#xff0c;让一些基本不会改动的代码先…

展馆漫游可视化与智慧展厅:开启未来展览新篇章

随着科技的飞速发展&#xff0c;展馆行业也在不断寻求创新和突破。展馆漫游可视化和智慧展厅的出现&#xff0c;为展馆行业带来了全新的发展机遇。本文将围绕这两个主题&#xff0c;探讨它们如何改变传统展览模式&#xff0c;开启未来展览新篇章。 一、展馆漫游可视化&#xff…

Ubuntu 20.4镜像国内地址下载较快

Ubuntu20.04版本比较稳定&#xff0c;部署OJ大都用这个版本。 推荐阿里云镜像点&#xff0c;点进去根据你的电脑版本下载iso后缀那个 ubuntu-releases-20.04安装包下载_开源镜像站-阿里云 下载速度较快 其他版本 http://mirrors.aliyun.com/ubuntu-releases/ 如果使用云服务…

C语言/C++雷霆战机代码(终极版)

#include <stdio.h> #include <easyx.h> #include <time.h> #include <Mmsystem.h> #pragma comment(lib,"winmm.lib") #define WIDTH 600 #define HEIGHT 850 #define bullet_max 5000 //我方飞机子弹最大量 #define enemy_bul_ma…

Instagram账号被封?必须了解的原因与防封技巧

您是否曾因 Instagram 帐户被暂停封禁而感到沮丧&#xff1f;这是一个常见问题&#xff0c;了解您的帐户被暂停的原因以及如何恢复帐户至关重要。 在本文中&#xff0c;我们将深入探讨 Instagram 帐户被封停的常见原因&#xff0c;并探讨重新获得访问权限的步骤。这个方法对于管…

源码订货系统的优势

源码订货系统是一种企业购买后可以获得源代码的订货系统&#xff0c;它可以不受软件厂商的规模、发展而修改和使用。与SaaS订货系统相比&#xff0c;核货宝为您分享源码订货系统的四大优势&#xff1a; 一是开放性&#xff1a;源码订货系统是开源的&#xff0c;用户可以掌握源代…

数据结构---算法的时间复杂度

文章目录 前言计算机重要存储数据结构与算法数据结构概念算法 数据库概念 算法的复杂度时间复杂度概念为什么有时间复杂度大O渐进表示法时间复杂度实例实例1&#xff1a;时间复杂度&#xff1a;O&#xff08;N&#xff09;实例2&#xff1a;这里输入参数是不确定的所以 时间复杂…

期货开平规则(期货交易开平规则解析)

什么是期货开平规则 期货开平规则&#xff0c;简单来说是指期货交易中的开仓和平仓所遵循的一系列规定。具体而言&#xff0c;开仓是指买入或卖出期货合约&#xff0c;建立一个新的持仓&#xff1b;平仓则是指买入或卖出相应数量的期货合约&#xff0c;用以解除原有持仓。开平…
最新文章