手动实现legend 与 echarts图交互 通过js事件实现图标某项的高亮 显示与隐藏

通过html实现legend的样式 提供调用echarts的api实现与echarts图表交互的效果

实现饼图element实现类似于legend与echartstu表交互效果

效果图

配置代码

html 复制代码
<template>
  <div style="height: 400px; width: 500px;background-color: #CCC;">
    <v-chart
      :option="options"
      autoresize
      style="width: 100%; height: 100%"
      ref="chart"
    />
    <div style="display: flex; margin-right: 20px">
      <div
        v-for="item in dataList"
        :key="item.name"
        style="display: flex;align-items: center; margin-top: 10px; margin-right: 20px;cursor: pointer"
        @mouseenter="handleMouseenter(item)"
        @mouseleave="handleMouseleave(item)"
        @click="handleClick(item)"
      >
        <i :style="{'background-color': item.isShow ? item.itemStyle.color: '#CCC'}" style="width: 10px;height:10px;border-radius: 50%;margin-right: 5px"></i>
        <span style="margin-right:10px;">{{item.name}}</span>
        <span>{{item.value}}</span>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'AboutView',
    data() {
      return{
        dataList: [
          { value: 1048, name: 'Search Engine',isShow: true,itemStyle: {color: '#006699'} },
          { value: 735, name: 'Direct',isShow: true,itemStyle: {color: '#009966'}  },
          { value: 580, name: 'Email',isShow: true,itemStyle: {color: '#FFCC00'}  },
        ]
      }
    },
    computed: {
      options() {
        return {
          tooltip: {
            trigger: 'item'
          },
          legend:{
            show: false
          },
          series: [
            {
              name: 'Access From',
              type: 'pie',
              radius: ['45%', '50%'],
              center: ['50%', '38.5%'],
              avoidLabelOverlap: false,
              label: {
                show: false,
                position: 'center'
              },
              labelLine: {
                show: false
              },
              data: this.dataList
            }
          ]
        }
      }
    },
    methods: {
      handleMouseenter(item){
        this.$refs.chart.dispatchAction({
            type: 'highlight',
            name: item.name,
            // seriesIndex: 1
            // dataIndex: 1
            // // 用 index 或 id 或 name 来指定系列。
            // // 可以使用数组指定多个系列。
            // seriesIndex?: number | number[],
            // seriesId?: string | string[],
            // seriesName?: string | string[],

            // // 数据项的 index,如果不指定也可以通过 name 属性根据名称指定数据项
            // dataIndex?: number | number[],
            // // 可选,数据项名称,在有 dataIndex 的时候忽略
            // name?: string | string[],
        })
      },
      handleMouseleave(item){
        this.$refs.chart.dispatchAction({
            type: 'downplay',
            name: item.name,
            // seriesIndex: 1
            // dataIndex: 1
            // // 用 index 或 id 或 name 来指定系列。
            // // 可以使用数组指定多个系列。
            // seriesIndex?: number | number[],
            // seriesId?: string | string[],
            // seriesName?: string | string[],

            // // 数据项的 index,如果不指定也可以通过 name 属性根据名称指定数据项
            // dataIndex?: number | number[],
            // // 可选,数据项名称,在有 dataIndex 的时候忽略
            // name?: string | string[],
        })
      },
      handleClick(item){
        item.isShow = !item.isShow
        this.$refs.chart.dispatchAction({
          type: 'legendToggleSelect',
          name: item.name,
          // // 用 index 或 id 或 name 来指定系列。
          // // 可以使用数组指定多个系列。
          // seriesIndex?: number | number[],
          // seriesId?: string | string[],
          // seriesName?: string | string[],

          // // 数据项的 index,如果不指定也可以通过 name 属性根据名称指定数据项
          // dataIndex?: number | number[],
          // // 可选,数据项名称,在有 dataIndex 的时候忽略
          // name?: string | string[],
        })
      }
    }

  }
</script>

<style lang="scss" scoped>

</style>

通过js实现柱形图同一组数据时 隐藏某一个柱子

效果图

配置代码

html 复制代码
<template>
  <div style="height: 400px; width: 500px;background-color: #CCC;">
    <v-chart
      :option="options"
      autoresize
      style="width: 100%; height: 100%"
      ref="chart"
    />
    <div style="display: flex; margin-right: 20px">
      <div
        v-for="item in dataList"
        :key="item.name"
        style="display: flex;align-items: center; margin-top: 10px; margin-right: 20px;cursor: pointer"
        @click="handleClick(item)"
        @mouseenter="handleMouseenter(item)"
        @mouseleave="handleMouseleave(item)"
      >
        <i :style="{'background-color': item.isShow ? item.itemStyle.color: '#CCC'}" style="width: 10px;height:10px;border-radius: 50%;margin-right: 5px"></i>
        <span style="margin-right:10px;">{{item.name}}</span>
        <span>{{item.value}}</span>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'AboutView',
    data() {
      return{
        dataList: [
          { value: 1048, name: 'Search Engine',isShow: true,itemStyle: {color: '#006699'} },
          { value: 735, name: 'Direct',isShow: true,itemStyle: {color: '#009966'}  },
          { value: 580, name: 'Email',isShow: true,itemStyle: {color: '#FFCC00'}  },
        ]
      }
    },
    computed: {
      options() {
        return {
          tooltip: {
            trigger: 'item'
          },
          legend:{
            show: false
          },
          xAxis: {
            type: 'category',
            data: this.computedSeriesData.map(item => item.name)
          },
          yAxis: {
            type: 'value'
          },
          series: [
            {
              name: 'Access From',
              type: 'bar',
              radius: ['45%', '50%'],
              center: ['50%', '38.5%'],
              avoidLabelOverlap: false,
              label: {
                show: false,
                position: 'center'
              },
              labelLine: {
                show: false
              },
              data: this.computedSeriesData
            }
          ]
        }
      },
      computedSeriesData() {
        return this.dataList.filter(item => item.isShow)
      }
    },
    methods: {
      handleClick(item){
        item.isShow = !item.isShow
      },
       handleMouseenter(item){
        this.$refs.chart.dispatchAction({
            type: 'highlight',
            name: item.name,
            // seriesIndex: 1
            // dataIndex: 1
            // // 用 index 或 id 或 name 来指定系列。
            // // 可以使用数组指定多个系列。
            // seriesIndex?: number | number[],
            // seriesId?: string | string[],
            // seriesName?: string | string[],

            // // 数据项的 index,如果不指定也可以通过 name 属性根据名称指定数据项
            // dataIndex?: number | number[],
            // // 可选,数据项名称,在有 dataIndex 的时候忽略
            // name?: string | string[],
        })
      },
      handleMouseleave(item){
        this.$refs.chart.dispatchAction({
            type: 'downplay',
            name: item.name,
            // seriesIndex: 1
            // dataIndex: 1
            // // 用 index 或 id 或 name 来指定系列。
            // // 可以使用数组指定多个系列。
            // seriesIndex?: number | number[],
            // seriesId?: string | string[],
            // seriesName?: string | string[],

            // // 数据项的 index,如果不指定也可以通过 name 属性根据名称指定数据项
            // dataIndex?: number | number[],
            // // 可选,数据项名称,在有 dataIndex 的时候忽略
            // name?: string | string[],
        })
      },
    }

  }
</script>

<style lang="scss" scoped>

</style>

通过js实现柱形图一组数据的显示隐藏 达到legend的效果

效果图


配置代码

html 复制代码
<template>
  <div style="height: 400px; width: 500px;background-color: #CCC;">
    <v-chart
      :option="options"
      autoresize
      style="width: 100%; height: 100%"
      ref="chart"
    />
    <div style="display: flex; margin-right: 20px">
      <div
        v-for="item in legendList"
        :key="item.name"
        style="display: flex;align-items: center; margin-top: 10px; margin-right: 20px;cursor: pointer"
        @click="handleClick(item)"
        @mouseenter="handleMouseenter(item)"
        @mouseleave="handleMouseleave(item)"
      >
        <i :style="{'background-color': item.isShow ? item.color: '#CCC'}" style="width: 10px;height:10px;border-radius: 50%;margin-right: 5px"></i>
        <span style="margin-right:10px;">{{item.name}}</span>
        <span>{{item.value}}</span>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'AboutView',
    data() {
      return{
        legendList: [
          { name: '测试1', isShow: true, color: '#00BFFF' },
          { name: '测试2', isShow: true, color: '#FFD700'},
        ],
        dataList1: [
          { value: 1048, name: 'Search Engine' },
          { value: 735, name: 'Direct'},
          { value: 580, name: 'Email'},
        ],
        dataList2: [
          { value: 800, name: 'Search Engine' },
          { value: 335, name: 'Direct'},
          { value: 1580, name: 'Email'},
        ]
      }
    },
    computed: {
      options() {
        return {
          tooltip: {
            trigger: 'item'
          },
          legend:{
            show: false
          },
          xAxis: {
            type: 'category',
            data: this.dataList1.map(item => item.name)
          },
          yAxis: {
            type: 'value'
          },
          series: [
            {
              name: '测试1',
              type: 'bar',
              radius: ['45%', '50%'],
              center: ['50%', '38.5%'],
              avoidLabelOverlap: false,
              label: {
                show: false,
                position: 'center'
              },
              labelLine: {
                show: false
              },
              itemStyle:{
                color: '#00BFFF'
              },
              data: this.dataList1
            },
            {
              name: '测试2',
              type: 'bar',
              radius: ['45%', '50%'],
              center: ['50%', '38.5%'],
              avoidLabelOverlap: false,
              label: {
                show: false,
                position: 'center'
              },
              labelLine: {
                show: false
              },
              itemStyle:{
                color: '#FFD700'
              },
              data: this.dataList2
            }
          ]
        }
      },
    },
    methods: {
      handleClick(item){
        item.isShow = !item.isShow
        this.$refs.chart.dispatchAction({
          type: 'legendToggleSelect',
          // 图例名称
          name: item.name,

          // // 下列参数自 v5.6.0 起开始支持
          // // 图例组件ID
          // legendId: string,
          // // 图例组件索引
          // legendIndex: number,
          // // 图例组件名称
          // legendName: string
        })
      },
       handleMouseenter(item){
        this.$refs.chart.dispatchAction({
            type: 'highlight',
            seriesName: item.name
            // seriesIndex: 1
            // dataIndex: 1
            // // 用 index 或 id 或 name 来指定系列。
            // // 可以使用数组指定多个系列。
            // seriesIndex?: number | number[],
            // seriesId?: string | string[],
            // seriesName?: string | string[],

            // // 数据项的 index,如果不指定也可以通过 name 属性根据名称指定数据项
            // dataIndex?: number | number[],
            // // 可选,数据项名称,在有 dataIndex 的时候忽略
            // name?: string | string[],
        })
      },
      handleMouseleave(item){
        this.$refs.chart.dispatchAction({
            type: 'downplay',
            seriesName: item.name
            // seriesIndex: 1
            // dataIndex: 1
            // // 用 index 或 id 或 name 来指定系列。
            // // 可以使用数组指定多个系列。
            // seriesIndex?: number | number[],
            // seriesId?: string | string[],
            // seriesName?: string | string[],

            // // 数据项的 index,如果不指定也可以通过 name 属性根据名称指定数据项
            // dataIndex?: number | number[],
            // // 可选,数据项名称,在有 dataIndex 的时候忽略
            // name?: string | string[],
        })
      },
    }

  }
</script>

<style lang="scss" scoped>

</style>
相关推荐
繁依Fanyi6 分钟前
用 CodeBuddy 实现「IdeaSpark 每日灵感卡」:一场 UI 与灵感的极简之旅
开发语言·前端·游戏·ui·编辑器·codebuddy首席试玩官
来自星星的坤2 小时前
【Vue 3 + Vue Router 4】如何正确重置路由实例(resetRouter)——避免“VueRouter is not defined”错误
前端·javascript·vue.js
香蕉可乐荷包蛋6 小时前
浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
前端·javascript·es6
未来之窗软件服务7 小时前
资源管理器必要性———仙盟创梦IDE
前端·javascript·ide·仙盟创梦ide
liuyang___8 小时前
第一次经历项目上线
前端·typescript
西哥写代码8 小时前
基于cornerstone3D的dicom影像浏览器 第十八章 自定义序列自动播放条
前端·javascript·vue
清风细雨_林木木8 小时前
Vue 中生成源码映射文件,配置 map
前端·javascript·vue.js
FungLeo9 小时前
node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示
前端·非对称加密·rsa 加密·node 后端
雪芽蓝域zzs9 小时前
JavaScript splice() 方法
开发语言·javascript·ecmascript
不灭锦鲤9 小时前
xss-labs靶场第11-14关基础详解
前端·xss