react + hooks 实现Echarts树状图 - 手风琴效果,滑过节点时展示其他信息

react + hooks 实现Echarts树状图 - 手风琴效果

官网效果

Echarts官网效果图

React中实现

// npm i echarts --save
// npm i echarts-for-react --save
import ReactEcharts from 'echarts-for-react';

const EchartsDom = () => {
  // 配置
  const getOption = {
    // 标题
    title: {
      text: '阿巴阿巴',
    },
    // 提示,滑过时展示数据
    tooltip: {
      trigger: 'item',
      formatter: (params: any) => {
        return (
          [params.name] +
          '<br/>基线数量 : ' +
          [params.data.idss] +
          '<br/>资金(万元) : ' +
          [params.data.collapsed]
        );
      },
    },
    // 主要配置
    series: [
      {
      	// 类型
        type: 'tree',
        // 数据源
        data: edata,

        top: '1%',
        left: '7%',
        bottom: '1%',
        right: '20%',

        symbol: 'none', // symbolSize: 100,
		// 字体节点样式
        label: {
          backgroundColor: 'rgba(241, 191, 14, 1)',
          borderRadius: [22, 11, 11, 6],
          padding: [16, 16, 16, 16],
        },
		// 线条样式
        lineStyle: {
          color: 'rgba(221, 212, 212, 1)',
          curveness: 0.8,
          width: '0.5',
        },

        leaves: {},

        emphasis: {
          focus: 'descendant',
        },
		// 默认展开计几层
        initialTreeDepth: 1,

        expandAndCollapse: true,
        animationDuration: 550,
        animationDurationUpdate: 750,
      },
    ],
  };

  return (
    <div>
      <ReactEcharts
        style={{ height: 700 }}
        option={getOption}
        notMerge={true}
        lazyUpdate={true}
        // 绑定事件
        onEvents={onclick}
      ></ReactEcharts>
    </div>
  );
}

这样就类似官网效果图,这里onEvents={onclick}你直接绑定onclick回调的话在ts中会报错,可以这样搞:

// 实现手风琴效果的函数
const clickEchartsPie = (params: any) => {
	console.log('params:', params);
};

const onclick = {
	// 这里绑定回调
    click: clickEchartsPie,
  };

params:
params.data就是数据源的item,你可以给他加一个collapsed来控制它展开收缩,idss是他的标识符。那接下来就是用户点击时来处理数据:

const clickEchartsPie = (e: any) => {
    var idss = e.data.idss; // 2

    // 收缩同级的子级节点 & 通过 collapsed 属性控制节点收缩
    // data就是数据源
    var children = data[0].children;

    for (var i in children) {
      //当前点击的节点展开  其余节点收缩
      if (children[i].idss == idss) {
        children[i].collapsed = false;
      } else {
        children[i].collapsed = true;
      }
    }

    const newData = data.map((item, key) => (key == 0 ? { ...item, children: children } : item));
    // const [edata, setData] = useState(data // 数据)
    seteData(newData);
  };

这就是我的解决思路,大佬勿喷[doge]!

附上一份data.js

const data = [{
  name: '阿巴阿巴',
  label: {
    backgroundColor: 'rgba(168, 0, 252, 1)',
    borderRadius: [22, 11, 11, 6],
    padding: [16, 16, 16, 16],
  },
  children: [
    {
      name: '产品1',
      idss: 1,
      collapsed: false,
      label: {
        backgroundColor: 'rgba(252, 25, 0, 1)',
        borderRadius: [22, 11, 11, 6],
        padding: [16, 16, 16, 16],
      },
      children: [
        {
          name: '基线1',
          children: [
            { name: '基线1', value: 3938, collapsed: true, },
            { name: '基线2', value: 3812, collapsed: true, },
            { name: '基线3', value: 6714, collapsed: true,  },
            { name: '基线4', value: 743, collapsed: true,  },
          ],
        },
        {
          name: '基线2',
          children: [
            { name: '基线1', value: 3534, collapsed: true,  },
            { name: '基线2', value: 5731, collapsed: true,  },
            { name: '基线3', value: 7840, collapsed: true,  },
            { name: '基线4', value: 5914, collapsed: true,  },
            { name: '基线5', value: 3416, collapsed: true,  },
          ],
        },
        {
          name: '基线3',
          children: [{ name: 'AspectRatioBanker', value: 7074 }],
        },
      ],
    },
    {
      name: '产品2',
      idss: 2,
      collapsed: true,
      label: {
        backgroundColor: 'rgba(242, 144, 7, 1)',
        borderRadius: [22, 11, 11, 6],
        padding: [16, 16, 16, 16],
      },
      children: [
        { name: '基线1', collapsed: true, },
        { name: '基线1', value: 1759, collapsed: true, },
        { name: '基线2', value: 2165, collapsed: true, },
        { name: '基线3', value: 586, collapsed: true, },
        { name: '基线4', value: 3331, collapsed: true, },
        { name: '基线5', value: 772, collapsed: true, },
        { name: '基线6', value: 3322, collapsed: true, },
      ],
    },
    {
      name: '产品3',
      idss: 3,
      collapsed: true,
      label: {
        backgroundColor: 'rgba(252, 248, 0, 1)',
        borderRadius: [22, 11, 11, 6],
        padding: [16, 16, 16, 16],
      },
      children: [
        { name: '基线1', value: 8833, collapsed: true, },
        { name: '基线2', value: 1732, collapsed: true, },
        { name: '基线3', value: 3623, collapsed: true, },
        { name: '基线4', value: 10066, collapsed: true, },
      ],
    },
  ],
}];

export default data;

我实现的效果


版权声明:本文为hxj_Studio原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。