解决echart在vue中id重复问题

 更新时间:2024年03月12日 08:47:07   作者:一码哥  
这篇文章主要介绍了解决echart在vue中id重复问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

echart在vue中id重复问题

封装的echarts组件重复调用时,id重复会导致页面不渲染,数据覆盖等一系列问题

解决方法

用ref解决了问题

解决方法:

//修改前
<div  id="echart"></div>
 
//修改后
<div  ref="echart"></div>
 

初始化调用时,document.getElementById(‘xxx’) 改成 this.$refs.xxx

//修改前
var myChart = this.$echarts.init(document.getElementById('echart'));
//修改后
var myChart = this.$echarts.init(this.$refs.echart);

组件调用

//1
<echart  :data="myData"></echart >
//2再次调用
<echart :data="myData"></echart >

Echarts图表复用解决id唯一性

目前市面上许多项目都会接触到可视化大屏的开发,用得最多的三方组件库Echarts,在进行封装后复用许多同学会发现页面渲染异常问题,只会渲染第一次复用的内容.究其原因在于我们通过Id获取了页面节点进行渲染造成了id的重复.

网上也有许多的解决方案.在此,给大家分享一个自己测试后的可行的实施方案.我们可以通过uuid生成不同的id向子组件传值指定唯一性,也可以通过随机数的方式.

具体的操作我们接着往下看.

首先我们需要将需要复用的组件进行简单的封装.  commonEcharts.vue(子组件)

<template>
  <div :id="id"></div>
</template>
 
<script setup>
import { number } from 'echarts';
import { ref, inject, onMounted, onUnmounted, defineProps } from 'vue'
import useDraw from '/src/util/useDraw.js'
const { appRef, calcRate, windowDraw, unWindowDraw } = useDraw()
const echarts = inject('$echarts')
let { id, option } = defineProps({
  option: Object,
  id: String
})
let tuChart = () => {
  let eg = document.getElementById(id)
  eg.removeAttribute('_echarts_instance_')
  const myChart = echarts.init(eg)
 
  myChart.setOption(option)
 
  window.addEventListener("resize", function () {
    myChart.resize()
  })
}
 
onMounted(() => {
  windowDraw()
  calcRate()
  tuChart()
})
onUnmounted(() => {
  unWindowDraw()
})
</script>
 
<style lang="scss" scoped>
#tu {
  width: 615px;
  height: 300px;
  border: 1px solid gray;
  margin-top: 15px;
}
</style>

然后在需要使用的组件中父组件()引入对应的组件.expControl.vue

import charts from '../../../components/copycompnents/commonEcharts.vue'

接下来解决id复用的问题,新建一个js或ts文件,对方法进行封装并导出引入.

新建createID.js文件

export function createId(){
  return 'id' +Math.random()
}

引入js文件

import { createId } from '../../../api/createId'

在父组件中传入配置项option,这儿一折线图为例

let lineTwo = reactive({
  color: ['#0298DB', '#F59A23'],
  title: {
    text: '出院人次数',
    left: 80,
    top: 20,
    textStyle: {
      fontWeight: 400,
      fontFamily: 'Arial Normal',
      fontStyle: 'normal',
      fontSize: 20,
      color: '#555555'
    }
  },
  grid: {
    top: 70,
    bottom: 40,
  },
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'cross',
      crossStyle: {
        color: '#999'
      }
    }
  },
  xAxis: {
    type: 'category',
    boundaryGap: false,
    data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
  },
 
  yAxis: {
    type: 'value',
    show: true,
    min: 0,
    max: 5000,
    iterval: 1000,
    axisLine: {
      show: true
    },
    axisLabel: {
      formatter: function (value, index) {
        return value >= 1000 ? parseInt(value / 1000) + '千' : value;
      }
    },
    axisPointer: {
      type: 'shadow'
    }
  },
 
  legend: {
    // itemStyle: {},  //继承系列中属性值的颜色
    right: 80,
    top: 15,
    itemGap: 20,
    itemWidth: 9,
    itemHeight: 10,
    data: [
      { icon: 'rect', name: '今年' },
      { icon: 'rect', name: '去年' }
    ],
    textStyle: {
      fontWeight: 400,
      fontFamily: 'Arial Normal',
      fontStyle: 'normal',
      fontSize: 20,
      color: '#555555',
    }
  },
 
  series: [
    {
      name: '今年',
      symbol: 'none',
      data: [1500, 2300, 2240, 2180, 1350, 1470, 2600, 1110, 1230, 1450, 1680, 2360],
      type: 'line'
    },
    {
      name: '去年',
      symbol: 'none',
      data: [1000, 1300, 2504, 3080, 1050, 1740, 2200, 2120, 1230, 1550, 1460, 1530],
      type: 'line'
    }
  ]
})

在父组件中传值

     <div class="atlas flex">
          <charts :option="lineOne" :id="createId()" />
     </div>

子组件通过difineprops接收父组件传过来的值

<template>
  <div :id="id"></div>
</template>
let { id, option } = defineProps({
  option: Object,
  id: String
})

效果图:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue的computed计算属性你了解吗

    Vue的computed计算属性你了解吗

    这篇文章主要为大家详细介绍了Vue的computed计算属性,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • vue中的事件绑定举例详解

    vue中的事件绑定举例详解

    这篇文章主要给大家介绍了关于vue中事件绑定的相关资料,事件绑定在Web开发中非常常见,我们经常需要在页面中为某个DOM元素绑定事件,如点击、鼠标移动、键盘敲击等等,需要的朋友可以参考下
    2023-09-09
  • Element基于el-input数字范围输入框的实现

    Element基于el-input数字范围输入框的实现

    本文主要介绍了 Element基于el-input数字范围输入框的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • vue-router项目实战总结篇

    vue-router项目实战总结篇

    vue-router 是 Vue.js 官方的路由库.这篇文章主要介绍了vue-router项目实战总结,需要的朋友可以参考下
    2018-02-02
  • vue+ts封装axios网络请求封装方式

    vue+ts封装axios网络请求封装方式

    文章介绍了如何使用Vue和TypeScript封装Axios网络请求,并提供了一个示例文件`request.ts`,展示了如何封装各种请求,此外,还提到了路由管理文件和状态码处理文件的结构
    2025-12-12
  • vue之proxyTable代理超全面配置方式

    vue之proxyTable代理超全面配置方式

    本文作者分享了使用Vue进行代理配置的个人经验,介绍了如何使用proxyTable进行跨域请求配置,并提供了具体的配置文件和使用方法,便于同行参考和学习
    2024-10-10
  • Vue3使用LogicFlow更新节点名称的方法

    Vue3使用LogicFlow更新节点名称的方法

    本文介绍了在Vue3中更新LogicFlow节点名称的多种方法,包括使用updateText和setProperties方法,以及事件监听与交互方式,还讨论了自定义节点名称编辑、批量更新与高级功能,并强调了注意事项与最佳实践,需要的朋友可以参考下
    2026-01-01
  • 样式穿透vue中的scoped详谈

    样式穿透vue中的scoped详谈

    这篇文章主要为大家介绍了样式穿透vue中的scoped示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • vue中SPA单页面应用程序详解

    vue中SPA单页面应用程序详解

    这篇文章主要为大家详细介绍了vue中SPA单页面应用程序的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • vue 使用async写数字动态加载效果案例

    vue 使用async写数字动态加载效果案例

    这篇文章主要介绍了vue 使用async写数字动态加载效果案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论