vue自定义指令使用ecahrts,并传入事件

在Vue项目中,通过自定义指令使用Echarts图表,并实现点击事件的传递。主要步骤包括在main.js中注册自定义指令,然后在模板中使用v-echarts绑定计算属性,以此达到在不直接实例化Echarts的情况下,依然能为图表添加事件监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:echarts图表需要加入点击事件,项目是用指令使用echarts,并没有在页面实例echarts图表,那就需要一个统一的传参来实现:
1、话不多说上代码:

import Vue from 'vue'
const echarts = require('echarts')
/**
 * 变量说明:
 * el: html element,el=document.getElementById得到值
 * binding:绑定变量。其中binding.value值为对象时即为echarts的option;值为数组时,索引0为echarts的option,索引1为echarts的event
 * vnode:vue的虚拟节点
 */
export default {
  deep: true,
  bind(el, binding, vnode) {
    // do nothing
  },
  inserted(el, binding, vnode) {
    const self = vnode.context
    Vue.nextTick(() => {
      // options & events
      let [options, events] = [{}, {}]
      if (Array.isArray(binding.value)) {
        options = binding.value[0] || {}
        events = binding.value[1] || {}
      } else {
        options = binding.value || {}
      }

      // init chart
      self._echartsInstance = echarts.init(el, theme)
      self._echartsInstance.showLoading()
      self._echartsInstance.setOption(options, true)
      self._echartsInstance.hideLoading()
      setTimeout(() => {
        self._echartsInstance.resize()
      }, 0)

      // init chart events
      Object.keys(events).forEach(key => {
        const func = events[key]
        if (typeof func === 'function') {
          self._echartsInstance.on(key, params => {
            func(params)
          })
        }
      })
    })
  },
  update(el, binding, vnode) {
    const self = vnode.context
    Vue.nextTick(() => {
      // options & events
      let options = {}
      if (Array.isArray(binding.value)) {
        options = binding.value[0] || {}
      } else {
        options = binding.value || {}
      }

      // init chart
      self._echartsInstance = echarts.init(el, theme)
      self._echartsInstance.showLoading()
      self._echartsInstance.setOption(options, true)
      self._echartsInstance.hideLoading()
      setTimeout(() => {
        self._echartsInstance.resize()
      }, 0)
    })
  },
  componentUpdated(el, binding, vnode) {
    // do nothing
  },
  unbind(el, binding, vnode) {
    const self = vnode.context
    try {
      if (self._echartsInstance) {
        // console && console.log('in echarts unbind......')
        self._echartsInstance.dispose()
      }
    } catch (e) {}
  }
}


main.js里

 Vue.directive('echarts', echartsOption)

页面内的使用:
1、templeate里用v-echarts绑定计算属性

<template>
  <div>
    <div v-if="ready" :style="chartStyle" v-echarts="echartsOptions"></div>
  </div>
</template>
<script>
   export default {
      data() {
      const self = this
      return {
        ready: false,
        options: null,
        events: {
          click(params) {
            self.onEchartsClick(params)
          }
        }
      }
    },
    computed: {
      echartsOptions() {
      //传入两个参数,1为图表,2为事件
        return [this.options, this.events]
      }
    },
     methods: {
     //事件返回的参数,在这里操作就ok了
      onEchartsClick(params) {
        console.log(params)
      },
      load() {
            let option={
                //你定义的图表
         }
            this.options = option
            this.$nextTick(() => {
              this.ready = true;
            });
          
      }
    },
   mounted() {
      this.load()
    },
}
</script>

对你有帮助的话点个赞吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值