【若依前后端分离】首页-多个按钮控制同一个图表

示例图:上面四个框可以点击

 

重要代码片段 :

index_v1中

<panel-group @handleSetLineChartData="handleSetLineChartData" :data="totalData"/>
  1. : 这是一个自定义的 Vue 组件。名称是 panel-group
  2. @handleSetLineChartData="handleSetLineChartData": 这是一个事件监听器。在 Vue.js 中,@ 是 v-on: 的简写,用于监听 DOM 事件。这意味着当 panel-group 组件触发一个名为 handleSetLineChartData 的事件时,它将调用当前 Vue 实例中的 handleSetLineChartData 方法。
  3. :data="totalData": 这是一个属性绑定。在 Vue.js 中,: 是 v-bind: 的简写,用于绑定一个属性到一个表达式。这里,它将 panel-group 组件的 data 属性绑定到当前 Vue 实例的 totalData 数据属性。这意味着 panel-group 组件内部可以访问并使用这个 data 属性。

总的来说,这段代码的意思是:渲染一个名为 panel-group 的自定义组件,当该组件触发 handleSetLineChartData 事件时,调用 handleSetLineChartData 方法,并将 totalData 数据属性传递给该组件的 data 属性。

methods: {handleSetLineChartData(type) {this.lineChartData.type=type;console.log("点击上方按钮的数据变化type:",this.lineChartData)},
}

定义了一个名为 handleSetLineChartData 的方法。这个方法接受一个参数 type,并将这个 type 值赋给 this.lineChartData.type。

PanelGroup.vue中

<div class="card-panel" @click="handleSetLineChartData('inBound')">

表示一个 div 元素,它具有一个 card-panel 类,并且当这个 div 被点击时,它会调用 handleSetLineChartData 方法并传递 'inBound' 字符串作为参数。

这里是具体的分解:

  • <div class="card-panel">:这是一个 div 元素,它有一个 card-panel 类,通常用于 CSS 样式或 JavaScript 选择器。

  • @click="handleSetLineChartData('inBound')":这是一个事件监听器,它监听 click 事件。当这个 div 被点击时,它会执行 handleSetLineChartData 方法,并传递一个字符串参数 'inBound'

    • @ 是 v-on: 的简写,用于监听 DOM 事件。
    • click 是要监听的事件名称,即鼠标点击事件。
    • "handleSetLineChartData('inBound')" 是当事件触发时要调用的方法,并传递一个参数。

在这个例子中,当 div 被点击时,handleSetLineChartData 方法将被调用,并且 type 参数将被设置为 'inBound'。这通常用于更新组件的状态或触发其他操作,比如更新图表数据。

 

//接收TotalData
props: {data: {typeof: Object,//数据类型required: true//必须的}
},
methods: {handleSetLineChartData(type) {this.$emit('handleSetLineChartData', type)}
}

分析:

  • props 用于子组件接收父组件传递下来的数据
  • handleSetLineChartData(type): 这是一个方法,它接受一个参数 type
  • this.$emit('handleSetLineChartData', type): 在这个方法中,组件使用 $emit 方法触发一个自定义事件,事件的名称也是 handleSetLineChartData,并且传递了 type 参数。这通常用于通知父组件某些状态的变化或者触发父组件的某个方法。

现在,将这两部分结合起来解释:

当父组件使用 <panel-group /> 组件,并传递一个 data prop时,这个 data 会被 panel-group 组件接收并使用。如果 panel-group 组件内部需要通知其父组件更新线性图表的数据类型,它会调用 handleSetLineChartData 方法,并传递相应的 type。通过 $emit,这个事件和参数会被发送到父组件,父组件可以监听这个事件并调用相应的处理函数(如 handleSetLineChartData),从而更新线性图表的数据。

全部代码:

index_v1.vue

<template><div class="dashboard-editor-container"><panel-group @handleSetLineChartData="handleSetLineChartData" :data="totalData"/><el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;"><line-chart :chart-data="lineChartData"  v-if="!isLoading1"/></el-row><el-row :gutter="32"><el-col :xs="24" :sm="24" :lg="8"><div class="chart-wrapper"><raddar-chart/></div></el-col><el-col :xs="24" :sm="24" :lg="8"><div class="chart-wrapper"><pie-chart/></div></el-col><el-col :xs="24" :sm="24" :lg="8"><div class="chart-wrapper"><bar-chart/></div></el-col></el-row></div>
</template><script>
import PanelGroup from './dashboard/PanelGroup'
//折线图
import LineChart from './dashboard/LineChart'
//雷达图
import RaddarChart from './dashboard/RaddarChart'
//饼图
import PieChart from './dashboard/PieChart'
//柱状图
import BarChart from './dashboard/BarChart'
import BackGrand from "@/views/dashboard/BackGrand";
import {getTotalData,getStatistics} from "@/api";
const lineChartData = {//折线图type:"inBound",inBound: [],outBound: [],returnBound: [],inventory: [],dateData:[]
}
export default {name: 'Index',components: {PanelGroup,LineChart,RaddarChart,PieChart,BarChart,BackGrand},data() {return {// lineChartData: lineChartData.inBound,lineChartData:{},totalData: {},isLoading1 :true,}},created() {this.getTotalData();this.getStatistics();},methods: {handleSetLineChartData(type) {this.lineChartData.type=type;console.log("点击上方按钮的数据变化type:",this.lineChartData)//this.lineChartData = lineChartData[type]},getTotalData() {getTotalData().then(response =>{console.log("response",response);this.totalData=response.data;})},getStatistics() {getStatistics().then(response =>{console.log("response1",response);//this.lineChartData=response.data;this.lineChartData.inBound=response.data.map(item=>item.everydayInboundCount);console.log("inBound",this.lineChartData.inBound);this.lineChartData.outBound=response.data.map(item=>item.everydayOutboundCount);console.log("outbound:",this.lineChartData.outBound)this.lineChartData.returnBound=response.data.map(item=>item.everydayReturnboundCount);console.log("returnbound:",this.lineChartData.returnBound)this.lineChartData.inventory=response.data.map(item=>item.inventoryCount);console.log("inventory:",this.lineChartData.inventory)this.lineChartData.dateData=response.data.map(item=>item.date);this.isLoading1 = false;this.lineChartData.type="inBound";})},}
}
</script><style lang="scss" scoped>
.dashboard-editor-container {padding: 32px;background-color: rgb(240, 242, 245);position: relative;.chart-wrapper {background: #fff;padding: 16px 16px 0;margin-bottom: 32px;}
}@media (max-width: 1024px) {.chart-wrapper {padding: 8px;}
}#main{width:auto;height: auto;}</style>

PanelGroup.vue

<template><el-row :gutter="40" class="panel-group"><el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"><div class="card-panel" @click="handleSetLineChartData('inBound')"><div class="card-panel-icon-wrapper icon-people"><svg-icon icon-class="in" class-name="card-panel-icon" /></div><div class="card-panel-description"><div class="card-panel-text">数量一</div><count-to :start-val="0" :end-val="data.inBoundTotal" :duration="2600" class="card-panel-num" /></div></div></el-col><el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"><div class="card-panel" @click="handleSetLineChartData('outBound')"><div class="card-panel-icon-wrapper icon-message"><svg-icon icon-class="out" class-name="card-panel-icon" /></div><div class="card-panel-description"><div class="card-panel-text">数量二</div><count-to :start-val="0" :end-val="data.outBoundTotal" :duration="3000" class="card-panel-num" /></div></div></el-col><el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"><div class="card-panel" @click="handleSetLineChartData('returnBound')"><div class="card-panel-icon-wrapper icon-money"><svg-icon icon-class="returnDetail" class-name="card-panel-icon" /></div><div class="card-panel-description"><div class="card-panel-text">数量三</div><count-to :start-val="0" :end-val="data.returnBoundTotal" :duration="3200" class="card-panel-num" /></div></div></el-col><el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"><div class="card-panel" @click="handleSetLineChartData('inventory')"><div class="card-panel-icon-wrapper icon-shopping"><svg-icon icon-class="international" class-name="card-panel-icon" /></div><div class="card-panel-description"><div class="card-panel-text">数量四</div><count-to :start-val="0" :end-val="data.inventoryTotal" :duration="3600" class="card-panel-num" /></div></div></el-col></el-row>
</template><script>
import CountTo from 'vue-count-to'export default {props: {data: {typeof: Object,//数据类型required: true//必须的}},components: {CountTo},created() {console.log("数量数据:",this.data)},methods: {handleSetLineChartData(type) {this.$emit('handleSetLineChartData', type)}}
}
</script><style lang="scss" scoped>
.panel-group {margin-top: 18px;.card-panel-col {margin-bottom: 32px;}.card-panel {height: 108px;cursor: pointer;font-size: 12px;position: relative;overflow: hidden;color: #666;background: #fff;box-shadow: 4px 4px 40px rgba(0, 0, 0, .05);border-color: rgba(0, 0, 0, .05);&:hover {.card-panel-icon-wrapper {color: #fff;}.icon-people {background: #40c9c6;}.icon-message {background: #36a3f7;}.icon-money {background: #f4516c;}.icon-shopping {background: #34bfa3}}.icon-people {color: #40c9c6;}.icon-message {color: #36a3f7;}.icon-money {color: #f4516c;}.icon-shopping {color: #34bfa3}.card-panel-icon-wrapper {float: left;margin: 14px 0 0 14px;padding: 16px;transition: all 0.38s ease-out;border-radius: 6px;}.card-panel-icon {float: left;font-size: 48px;}.card-panel-description {float: right;font-weight: bold;margin: 26px;margin-left: 0px;.card-panel-text {line-height: 18px;color: rgba(0, 0, 0, 0.45);font-size: 16px;margin-bottom: 12px;}.card-panel-num {font-size: 20px;}}}
}@media (max-width:550px) {.card-panel-description {display: none;}.card-panel-icon-wrapper {float: none !important;width: 100%;height: 100%;margin: 0 !important;.svg-icon {display: block;margin: 14px auto !important;float: none !important;}}
}
</style>

LineChart.vue

这个有点问题,不知道为什么watch检测不到数据变化,所以使用了定时器。

<template><div :class="className" :style="{height:height,width:width}"/>
</template><script>
import * as echarts from 'echarts'require('echarts/theme/macarons') // echarts theme
import resize from './mixins/resize'export default {mixins: [resize],props: {className: {type: String,default: 'chart'},width: {type: String,default: '98%'},height: {type: String,default: '350px'},autoResize: {type: Boolean,default: true},chartData: {type: Object,required: true}},data() {return {chart: null,needData: [],displayName:'出库量',timerId: null}},// watch: {//   chartData: {//     // deep: true,//     handler(val) {//       // this.setOptions(val)//       this.initChart();//       console.log("watch检测到数据变化,")//     }//   }// },
/*  watch: {chartData(newValue, oldValue) {console.log('Message changed from', oldValue, 'to', newValue);}},*/mounted() {// 启动定时器this.timerId = setInterval(this.yourMethod, 500); // 每1000毫秒调用一次yourMethod方法this.$nextTick(() => {this.initChart();console.log("chartData:", this.chartData)console.log("chartData:", this.chartData.dateData)console.log("chartData:", this.chartData.inBound)this.getData();console.log("进入页面折线图展示的数据",this.needData)})},beforeDestroy() {if (!this.chart) {return}this.chart.dispose()this.chart = null// 清除定时器if (this.timerId) {clearInterval(this.timerId);}},methods: {yourMethod() {// 你的方法逻辑// console.log('定时器触发的方法',this.chartData);this.getData();this.setOptions(this.needData);},initChart() {this.chart = echarts.init(this.$el, 'macarons')this.getData();// this.setOptions(this.chartData.inBound)this.setOptions(this.needData);console.log("初始化chartData数据", this.chartData)console.log("展示数据", this.needData)},getData() {if (this.chartData.type === "inventory") {this.needData = this.chartData.inventory;       this.displayName="数量一"} else if (this.chartData.type === "inBound") {this.needData = this.chartData.inBound;this.displayName="数量二"} else if (this.chartData.type === "outBound") {this.needData = this.chartData.outBound;this.displayName="数量三"} else {this.needData = this.chartData.returnBound;this.displayName="数量四"}},setOptions() {this.chart.setOption({xAxis: {// data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],//留取后五位data: this.chartData.dateData.map(date => date.substr(-5)),boundaryGap: false,//有竖线// splitLine: {//   show: true,//   lineStyle: {//     color: "rgba(31,99,163,.5)",//   },// },axisLine: {// show:false,lineStyle: {color: "rgba(31,99,163,.5)",},},axisLabel: {color: "#7EB7FD",fontWeight: "500",},axisTick: {show: false}},grid: {//布局show: true,left: 10,right: 10,bottom: 20,top: 30,containLabel: true,borderColor: "#1F63A3",},tooltip: {trigger: 'axis',axisPointer: {type: 'cross'},padding: [5, 10]},yAxis: {//有横线splitLine: {show: true,lineStyle: {color: "rgba(213,188,143,0.1)",},},axisLine: {lineStyle: {//横着指示线颜色color: "rgba(31,99,163,.5)",},},axisLabel: {color: "#7EB7FD",fontWeight: "500",},axisTick: {show: false},},legend: {data: ['11', '22']},series: [{name: this.displayName,smooth: true,type: 'line',itemStyle: {normal: {color: '#3888fa',lineStyle: {color: '#3888fa',width: 2},areaStyle: {color: '#f3f8ff'}}},data: this.needData,animationDuration: 2800,animationEasing: 'quadraticOut',//最大值点markPoint: {data: [{name: "最大值",type: "max",valueDim: "y",symbol: "rect",symbolSize: [60, 26],symbolOffset: [0, -20],itemStyle: {color: "rgba(0,0,0,0)",},label: {color: "#107efc",backgroundColor: "rgba(0,102,204,0.1)",borderRadius: 6,padding: [7, 14],borderWidth: 0.5,borderColor: "rgba(4,35,114,0.5)",formatter: this.displayName+":{c}",},},{name: "最大值",type: "max",valueDim: "y",symbol: "circle",symbolSize: 6,itemStyle: {color: "#2f5eb6",//最大点shadowColor: "#2f5eb6",shadowBlur: 8,},label: {formatter: "",},},],},}]})}}
}
</script>

记录学习日常~

有大佬晓得为什么watch不生效可以留言~

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

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

相关文章

WEB3.0:互联网的下一阶段

随着互联网的发展&#xff0c;WEB3.0时代正在逐步到来。本文将深入探讨WEB3.0的定义、特点、技术应用以及未来展望&#xff0c;为读者带来全新的思考。 一、什么是WEB3.0&#xff1f; WEB3.0可以被理解为互联网发展的下一阶段&#xff0c;是当前WEB2.0的升级版。相较于2.0时代…

有哪些软件可以限制应用安装呢?

在限制应用安装方面&#xff0c;有几种方法和工具可供选择&#xff0c;具体取决于你的需求和设备类型。以下是一些常见的方法和软件&#xff1a; 1. **家长控制功能**&#xff1a;操作系统如iOS、Android和Windows等都提供了家长控制功能&#xff0c;允许家长限制特定用户的应…

【go从入门到精通】作用域,包详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

性能分析-数据库(安装、索引、sql、执行过程)与磁盘知识(读、写、同时读写、内存速度测试)

数据库 数据库&#xff0c;其实是数据库管理系统dbms。 数据库管理系统&#xff0c; 常见&#xff1a; 关系型数据库&#xff1a; mysql、pg、 库的表&#xff0c;表与表之间有关联关系&#xff1b; 表二维表统一标准的SQL&#xff08;不局限于CRUD&#xff09;非关系型数据…

阿里云9元服务器租用收费价格表_免费云服务器领取

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

第P2周:CIFAR10彩色图片识别

第P2周&#xff1a;CIFAR10彩色图片识别 &#x1f368; 本文为&#x1f517;365 天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K 同学啊 &#x1f4cc;第P2周&#xff1a;彩色图片识别&#x1f4cc; 难度&#xff1a;小白入门⭐ 语言&#xff1a;Python…

QSFP-DD 和 QSFP+ / QSFP28 / QSFP56 / OSFP / CFP8 / COBO 之间的区别

&#x1f31f;QSFP-DD 作为400G 光模块的最小外形尺寸&#xff0c;提供业界最高的带宽密度&#xff0c;同时利用对低速 QSFP 可插拔模块和电缆的向后兼容性&#xff0c;使其在光纤制造商中很受欢迎。作为400G高速应用中最新的热门光收发器&#xff0c;QSFP-DD经常被拿来与QSFP5…

计算机视觉——DiffYOLO 改进YOLO与扩散模型的抗噪声目标检测

概述 物体检测技术在图像处理和计算机视觉中发挥着重要作用。其中&#xff0c;YOLO 系列等型号因其高性能和高效率而备受关注。然而&#xff0c;在现实生活中&#xff0c;并非所有数据都是高质量的。在低质量数据集中&#xff0c;更难准确检测物体。为了解决这个问题&#xff…

【报错】AttributeError: ‘NoneType‘ object has no attribute ‘pyplot_show‘(已解决)

【报错】AttributeError: ‘NoneType’ object has no attribute ‘pyplot_show’ 问题描述&#xff1a;python可视化出现下面报错 我的原始代码&#xff1a; import matplotlib.pyplot as pltplt.figure() plt.plot(x, y, bo-) plt.axis(equal) plt.xlabel(X) plt.ylabe…

基于LNMP部署wordpress

目录 一.环境准备 二.配置源并安装 三.配置Nginx 四.配置数据库 五.上传源码并替换 六.打开浏览器&#xff0c;输入虚拟机ip访问安装部署 七.扩展增加主题 一.环境准备 centos7虚拟机 关闭防火墙和seliunx stop firewalld #关闭防火墙 setenforce 0 …

软件设计师-基础知识科目-标准化与软件知识产权基本知识11

十一、标准化与软件知识产权基本知识&#xff1a; 知识产权&#xff1a; 主要包括&#xff1a;著作权及邻接权、专利权、工业品外观设计权、商标权、地理标志权、继承电路布图设计权。邻接权是指与著作权相邻近的权利&#xff0c;是指作品传播者&#xff0c;对其传播作品过程…

Unity TextMeshProUGUI 获取文本尺寸·大小

一般使用ContentSizeFitter组件自动变更大小 API 渲染前 Vector2 GetPreferredValues(string text)Vector2 GetPreferredValues(string text, float width, float height)Vector2 GetPreferredValues(float width, float height) 渲染后 Vector2 GetRenderedValues()Vector…

【安全】挖矿木马自助清理手册

一、什么是挖矿木马 挖矿木马会占用CPU进行超频运算&#xff0c;从而占用主机大量的CPU资源&#xff0c;严重影响服务器上的其他应用的正常运行。黑客为了得到更多的算力资源&#xff0c;一般都会对全网进行无差别扫描&#xff0c;同时利用SSH爆破和漏洞利用等手段攻击主机。 …

JavaEE初阶——多线程(二)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章延续上一篇文章,与大家分享Thread常见的方法以及线程的状态相关知识 其他内容我们下一篇再见! 如果有错误或不足请您指出!!! 目录 3.Thread类及常见方法3.1Thread常见的构造方法3.2Thread…

STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(2)

接前一篇文章&#xff1a;STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978&#xff08;1&#xff09; 本文参考以下文章及视频&#xff1a; STM32CbueIDE Audio播放音频 WM8978 I2S_stm32 cube配置i2s录音和播放-CSDN博客 STM32第二十二课&#xff08;I2S&#xff0c;HAL&am…

CLIP大模型图文检索——原理解读及代码实现

一. 核心思想 通过自然语言处理获得的监督信号可用于训练迁移效果出色的视觉模型。本论文的作者团队构建了一个庞大的图像文本配对数据集&#xff0c;其中包含400 million个图片文本的配对。利用最大规模的ViT-large模型&#xff0c;他们提出了CLIP&#xff08;Contrastive La…

机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day 13

Day13 Error surface is rugged…… Tips for training :Adaptive Learning Rate critical point is not the difficult Root mean Square --used in Adagrad 这里为啥是前面的g的和而不是直接只除以当前呢? 这种方法的目的是防止学习率在训练过程中快速衰减。如果只用当前的…

自然语言处理NLP关键知识点

大家好&#xff0c;在人工智能出现之前&#xff0c;机器智能处理结构化的数据&#xff0c;例如 Excel 里的数据。但是网络中大部分的数据都是非结构化的&#xff0c;例如文章、图片、音频、视频等。在非结构数据中&#xff0c;文本的数量是最多的&#xff0c;他虽然没有图片和视…

信息系统项目管理师——第27章管理科学基础知识

1 最大流量问题[简单] 百度百科:最大流问题&#xff0c;一种组合最优化问题&#xff0c;就是要讨论如何充分利用装置的能力&#xff0c;使得运输的流量最大&#xff0c;以取得最好的效果。 教材P869:在起点和终点之间可能存在多条运输路径&#xff0c;总的最大流量就是求出各…

智能EDM邮件营销推广工具哪个好?

有效且精准的客户沟通已经成为企业成功的关键要素之一&#xff0c;云衔科技以其尖端的智能EDM邮件营销系统解决方案脱颖而出&#xff0c;为全球各行业的企业提供了一个强有力的竞争优势和业绩增长引擎。 云衔科技深谙市场营销的艺术与科学&#xff0c;凭借多年积累的专业技术研…