首页 > 其他分享 >vue3使用echarts的tree,自己写事件进行分页

vue3使用echarts的tree,自己写事件进行分页

时间:2024-04-25 19:55:37浏览次数:22  
标签:node name tree myChart value children vue3 data echarts

vue3使用echarts的tree,自己写事件进行分页 

 

先到npmjs 官网查看当前使用最多的版本

https://www.npmjs.com/package/echarts

 

看了下5.5.0用的最多

npm i [email protected]

 

以下的demo(“@/flare”是后面的flare.json数据 )

<template>
<div id="chart-container">
</div>
</template>

<script>
    import { defineComponent,setup,reactive,onMounted } from 'vue'
    import * as echarts from 'echarts'
    import * as flarejson from '@/flare'
export default defineComponent({
    setup(props,ctx){
        let myChart;
        let echartsoption=reactive([])

        const getChartData = ()=>{
            let dom = document.getElementById('chart-container');
             myChart = echarts.init(dom, null, {
            renderer: 'canvas',
            useDirtyRect: false
            });
        }
        myChart.showLoading();
        //隐藏单数的节点
        flarejson.children.forEach(function (datum, index) {
            index % 2 === 0 && (datum.collapsed = true);
          });
        //调用
        echartsoption={
            tooltip: {
              trigger: 'item',
              triggerOn: 'mousemove'
            },
            series: [
              {
                type: 'tree',
                data: [flarejson],
                top: '1%',
                left: '7%',
                bottom: '1%',
                right: '10%',
                symbolSize: 20,  //圆的大小
                label: {  //主节点默认默认配置,也可以在data里面自定义赋值
                  position: 'left',
                  verticalAlign: 'middle',
                  align: 'right',
                  fontSize: 16
                },
                leaves: {  //子节点相关默认配置
                  label: {
                    position: 'right',
                    verticalAlign: 'middle',
                    align: 'left'
                  }
                },
                emphasis: {
                  focus: 'descendant'
                },
                expandAndCollapse: true,
                animationDuration: 550,
                animationDurationUpdate: 750,
                tooltip:{
                    formatter:function(params,ticket,callback){
                        // $.get('detail?name=' + params.name, function (content) {
                        //     callback(ticket, toHTML(content));
                        // });
                        // setTimeout(() => {
                        //     callback(ticket, 'test setTimeout formatter');
                        // }, 2000);
                        return 'Loading formatter';  //优先加载
                    },
                    valueFormatter:function(params,dataIndex){  //数值显示部分的格式化回调函数
                        // $.get('detail?name=' + params.name, function (content) {
                        //     callback(ticket, toHTML(content));
                        // });
                        // setTimeout(() => {
                        //     callback(ticket, 'test setTimeout formatter');
                        // }, 2000);
                        return '$' + value;  //优先加载
                    },
                },
              }
            ]
          }
            if (echartsoption && typeof echartsoption === 'object') {
              myChart.setOption(echartsoption);
            }
            window.addEventListener('resize', myChart.resize);
            myChart.on("click", handleNodeClick);//点击事件
    }

    const handleNodeClick = (node)=>{
        console.warn({ node });
       if(node.data.valuetype){
            //下一页
         if(node.data.valuetype  =='nextpage'){
           let parentNode=  node.treeAncestors(node.treeAncestors.length-2) //treeAncestors 存储的当前点击的链路节点,我们用来获取父节点
            const curData = myChart.getOption().series[0].data;
              //模拟已经取到下一页的数据
             let childrenData=[
                 {"name": "上一页","valuetype": "lastpage", "value": "lastpage"},
                {"name": "11", "value": 11},
             ]
             matchNodeData(curData[0],parentNode,childrenData)
             echartsoption.series[0].data = curData;
             renderEcharts()
         }else if(node.data.valuetype  =='lastpage'){   //上一页
            //模拟已经取到下一页的数据
             let childrenData=[
                {"name": "1", "value": 1},
                 {"name": "2", "value": 2},
                 {"name": "3", "value": 3},
                 {"name": "4", "value": 4},
                 {"name": "5", "value": 5},
                 {"name": "下一页","valuetype": "nextpage", "value": "nextpage"},
             ]
             matchNodeData(curData[0],parentNode,childrenData)
             echartsoption.series[0].data = curData;
             renderEcharts()
         }
       }
      else if (node.data.children && node.data.children.length) {
        // 已有下级
         //node.collapsed = node.collapsed;
      } else {
        myChart.showLoading();
        setTimeout(() => {
          myChart.hideLoading();
          //下面数据为自己想要加入的数据
           const newNode = [{
               name: "哪吒三太子1",
               value: node.dataIndex+1,
             },{
               name: "哪吒三太子2",
               value: node.dataIndex+2,
             }]
          
          if (!node.data.children) {
            node.data.children =newNode;
          } else if (!node.data.children.length) {
            node.data.children.push(...newNode);
          }
          node.data.collapsed=false //展开
          //节点的数据赋值给echartsoption
          const curData = myChart.getOption().series[0].data;
          echartsoption.series[0].data = curData;
          renderEcharts();
        }, 300);
    }
  }
    //刷新节点
  const renderEcharts =()= {
      myChart.setOption(echartsoption);
      myChart.resize();
    }
    
     const matchNodeData =(node,parentNode,childrenData)= {
        //只能取到name,value这些自带的字段,所以如果有分页,那这个的父节点一定要设置value
      if(node.value==parentNode.value){
        node.children=childrenData
        return true
      }
      if (node.data.children && node.data.children.length){
         for(let count=0;count<node.children.length;count++){
            if(matchNodeData(node.children[count],parentNode,childrenData)){  //递推继续找子节点
                return true
            }
         }
      }
    }

    onMounted(()=>{
        getChartData()
    })

    return {
        myChart,
        echartsoption,
        getChartData,
        handleNodeClick,
        renderEcharts,
        matchNodeData,
    }
});
</script>

 

测试的flare.json 数据

{
 "name": "flare",
 "value": 1,
 "children": [
  {
   "name": "analytics",
   "children": [
    {
     "name": "cluster",
     "children": [
      {"name": "AgglomerativeCluster", "value": 3938},
      {"name": "CommunityStructure", "value": 3812},
      {"name": "HierarchicalCluster", "value": 6714},
      {"name": "MergeEdge", "value": 743}
     ]
    },
    {
     "name": "graph",
     "children": [
      {"name": "BetweennessCentrality", "value": 3534},
      {"name": "LinkDistance", "value": 5731},
      {"name": "MaxFlowMinCut", "value": 7840},
      {"name": "ShortestPaths", "value": 5914},
      {"name": "SpanningTree", "value": 3416}
     ]
    },
    {
     "name": "optimization",
     "children": [
      {"name": "AspectRatioBanker", "value": 7074}
     ]
    }
   ]
  },
  {
   "name": "data",
   "value": "11224",
   "children": [
    {
     "name": "converters",
     "children": [
      {"name": "Converters", "value": 721},
      {"name": "DelimitedTextConverter", "value": 4294},
      {"name": "GraphMLConverter", "value": 9800},
      {"name": "IDataConverter", "value": 1314},
      {"name": "JSONConverter", "value": 2220}
     ]
    },
    {"name": "DataField", "value": 1759},
    {"name": "DataSchema", "value": 2165},
    {"name": "DataSet", "value": 586},
    {"name": "DataSource", "value": 3331},
    {"name": "DataTable", "value": 772},
    {"name": "DataUtil", "value": 3322}
   ]
  },
  {
    "name": "下一页","valuetype": "nextpage", "value": "nextpage"
 }
  
 ]
}

 

标签:node,name,tree,myChart,value,children,vue3,data,echarts
From: https://www.cnblogs.com/zhian/p/18158460

相关文章

  • Vue3 简单登录管理页面Demo
    目录前言项目基础配置新建项目引入组件项目配置Vue项目配置项目基本结构基础页面布局和路由搭建新增页面,简单跳转LoginViewMainViewrouterApp嵌套路由Test[1-4]Layout.vuerouter给个简单的跳转路由守护,重定向,动态路由,路由传值。这里不做展开描述简单登录页面:烂尾了总结前言这里......
  • CF1709E XOR Tree
    linkSolution:PART1:转化首先套路地预处理出每个节点到根节点(\(1\)号节点)路径上的点权异或和\(w[u]\)。可以发现题意容易转化为:给定一棵\(n\)个节点的树,问你最少可以把它分成多少个联通块,使得每个连通块中的节点两两路径上的异或和不为0。易知对于一个节点,若它要被割......
  • CF771C Bear and Tree Jumps
    题目大意:给定一棵有\(n\)个节点的树,要你统计\(\sum_{1\lex\ley\len}{dist(x,y)/k}\)(\(dist(x,y)\)表示\(x\)到\(y\)的距离)\(n\le2\times10^5,k\le5\)解法:一道换根\(dp\)套路题。首先看到树上统计问题,考虑树形\(dp\),那么我们设\(g(u)\)为以\(......
  • vue3 使用vant4中的List分页加载时,会回滚到页面顶部
    问题项目中使用vue3+vant4,列表页使用了List来做列表加载,代码如下:<van-listv-model:loading="loading":finished="finished"finished-text="没有更多了"@load="onLoad"><divv-if="list&&list.length"class=......
  • Vue3——tdesign-vue-next如何按需加载动态渲染ICON
    前言如题,在vue3中进行按需加载来动态的渲染icon图标;在线案例:https://stackblitz.com/edit/9ufmeo?file=src%2Fdemo.vue内容<template><t-spacedirection="vertical"><t-spacebreak-linev-for="(item,index)iniconList":key="index"&......
  • echarts折线图使用dataZoom,切换数据时渲染异常,出现竖线bug
     今天做项目遇到一个省份过多时,要加滚动条的需求。但是切换数据的时候,出现上图所出现的问题。经查资料,发现可以设置一个属性来解决这个问题。    filterMode:'empty' dataZoom:{     show:this.xiaonengXData.length>12?true:false,//为true滚动条......
  • CF911F Tree Destruction
    题目链接:https://www.luogu.com.cn/problem/CF911Fsolution:先求得树的直径,再求得在树的直径上的节点和不在树的直径上的节点。我们考虑优先删除不在直径上的节点,这样不会破坏树的直径,在删完了这些点之后再慢慢删直径上的点。#include<bits/stdc++.h>usingnamespacestd;#def......
  • vue3大屏适配
    1、定义初始化比例letstyle=ref({//定义默认比例width:1920,height:1080,transform:"scaleY(1)scaleX(1)translate(-50%,-50%)"})2、获取屏幕的宽高比列对象letgetScale=()=>{//获取屏幕的宽高比列constw=window.innerWidth/style.va......
  • [Vue3+Element-Plus]点击列表中的图片预览时,图片被表格覆盖
    preview-teleported="true" <el-table-columnprop="id"label="ID"width="80"align="center"sortable/><el-table-columnlabel="商品图片"width="85px"><template#default=&q......
  • ECharts海量数据渲染解决卡顿的4种方式
    场景周五进行需求评审的时候;出现了一个图表,本身一个图表本没有什么稀奇的;可是产品经理在图表的上的备注,让我觉得这个事情并不简单;那个图表的时间跨度可以是月,年,而且时间间隔很短;这让我意识到事情并不是想的那样简单;然后经过简单的询问:如果选择的范围是年;数据可能会上万;我......