手动实现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>
相关推荐
vipbic3 小时前
别再把“做个H5”挂嘴边了:这个词,官方压根就没有定义过
前端
ZC跨境爬虫4 小时前
跟着 MDN 学CSS day_39:(Flexbox 弹性盒子核心机制)
前端·css·ui·html·tensorflow
小陈同学呦4 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
开发者每周简报5 小时前
网海三部曲·无名宗师传
javascript·人工智能
喵个咪5 小时前
GoWind Toolkit 前端代码生成|Vue3(ElementPlus/Vben)、React(AntDesign)全自动一键生成教程
前端·vue.js·react.js
摆烂大大王6 小时前
玩转 OpenClaw:用 TaskFlow + Heartbeat 打造自动化工作流
前端·人工智能·自动化
zhangxingchao6 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
梦想的颜色7 小时前
TypeScript 完全指南(上):从零开始掌握类型系统
前端·typescript
之歆7 小时前
Day01_ES6+ 专业指南:从基础到实战的现代JavaScript开发(下)
前端·javascript·es6
lichenyang4537 小时前
鸿蒙 MVVM 实战:从 Demo 到工程化,聊聊登录、状态管理与埋点系统设计
前端