Vue页面多次渲染echarts封装的组件但只出现一个(原因分析,多方案解决,最后附上源码)

2023-11-19

前言

最近写项目,写到可视化的部分,有一个水球图的部分我已经封装好了,但是需要在页面多次渲染的时候只能渲染一个水球图,这篇记录一下解决的办法:
对于在页面多次使用封装好的echarts组件均可适用

原因分析

首先我们要知道echart实例的创建方式
通过获取div的id从而初始化echarts的实例,所以进行渲染时,两个div的id相同从而导致只能渲染出来一个图形

<div id="liquidFill" style="width:100%; height: 300px;"></div>
var myChart = echarts.init(document.getElementById("liquidFill"))

解决方案

上面已经得出了 因为id相同导致渲染不出来的 原因,所以经过验证有目前我想出了两个方案:

1.切换为ref获取元素

dom只有一个id,所以会出现覆盖的情况。我们需要把id改为通过ref获取到组件

<div ref="echarts" style="width:300px; height: 300px;"></div>
var myChart = echarts.init(this.$refs.echarts)

使用ref我们就不需要获取DOM结点了。$ref如果注册在元素上,它指向的就是DOM元素,如果注册在组件上,他指向的就是组件的实例。

2.给组件绑定动态id

因为两个相同的id所以会覆盖,故我们设置不同的id即可。
关于id的设置,我们可以使用父组件传过来的不同的值,也可以写个不重复的随机数进行赋值,主要是能保证两个组件id不同就行

<div :id="this.num" style="width:300px; height: 300px;"></div>
var myChart = echarts.init(document.getElementById(this.num))

这两种方法都能到达我们多次渲染echarts组件的目的,如图:

如果还有别的解决办法欢迎留言讨论~

在这里插入图片描述

最后这个水球图附上源码

<template>
  <div class="liquid">
    <el-card>
      <div ref="echarts" style="width:300px; height: 300px;"></div>
    </el-card>
  </div>
</template>

<script>
import 'echarts-liquidfill'
import * as echarts from "echarts";
export default {
  props:['msg'],
  data() {
    return {
      serverInfo: [],
      num:this.msg,
      idnum: '',
      option:{
        title:{
          text: '内存占用率'
        },
        tooltip: {
          show: true,
        },
        series: [{
          type: 'liquidFill',
          data: [],
          outline: {
            show: false
          },
          label: {
            fontSize: 32,
            color: '#43b3ef',
            insideColor: '#ffffff'
          },
        }]
      }
    }
  },
  created() {
  },
  watch:{
    msg(val){
      this.num = val
      this.initchart()
    },
  },
  methods: {
    initchart(){
      console.log(this.num)
      let myChart = echarts.getInstanceByDom(this.$refs.echarts);
      if(myChart == null) {
        myChart = echarts.init(this.$refs.echarts)
      }
      myChart.hideLoading();
      
      this.option.series[0].data.shift()
      this.option.series[0].data.push(this.num)
      myChart.setOption(this.option,true);
      window.addEventListener('resize', function () {
        myChart.resize()
      })
      
      
    }
  },
  mounted() {
    let myChart = echarts.init(this.$refs.echarts)
    myChart.showLoading();
    
  }
}
</script>

<style lang="scss" scoped>

</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue页面多次渲染echarts封装的组件但只出现一个(原因分析,多方案解决,最后附上源码) 的相关文章

  • 共享工作线程在重新加载页面时终止

    为什么 Shared Worker 在重新加载页面时死掉了 应该是复活了我该如何解决这个问题 重新加载前 重新加载后 在 example com 上按 F5 家长工人 var port new SharedWorker app worker
  • 在 Node.js 中包含另一个文件中的 JavaScript 类定义

    我正在为 Node js 编写一个简单的服务器 并且使用我自己的类 名为User看起来像 function User socket this socket socket this nickname null just the typical
  • 如何精确缩放已翻译的d3地图

    我有一张已翻译的地图 以使其正确适合画布 我正在尝试实现一种缩放它的方法 它确实有效 但是当您放大时它会远离中心 而不是以鼠标甚至画布为中心 这是我的代码 function map data total views var xy d3 ge
  • mocha.opts 已弃用,如何迁移到 package.json?

    我正在开发一个大型项目 自从上周我更新了摩卡以来 现在我们收到警告 DeprecationWarning 通过 mocha opts 进行的配置已被弃用并且 将从 Mocha 的未来版本中删除 使用 RC 文件或 改为 package js
  • setTimeout 用于加载下拉列表中的项目

    我在用setTimeout克服 中提到的缓慢处理脚本警告 禁用 Internet Explorer 中的长时间运行脚本消息 https stackoverflow com questions 4460263 disabling the lo
  • 有没有办法将 Google 文档分割成多个 PDF?

    我想在 Google Scripts VBA 代码中复制我为 Word 文档编写的代码 基本上 它通过搜索我插入文档中的标签 将文档 切片 为多个 PDF 文件 目的是允许合唱团使用 forScore 管理乐谱的应用程序 在切片点插入先前注
  • Javascript 无法正确排序 DECIMAL 数字

    我有一些代码可以按字母顺序对名称进行排序 我遇到的问题是它处理小数的方式 它对名称进行排序 如下所示 我宁愿它按数字递增 DOG 1 0510 DOG 1 1031 DOG 11 1792 DOG 12 0920 DOG 12 1170 D
  • 光标:IE 8 和 9 中的自动行为

    我想要的是为整个正文标记指定cursor pointer 这样页面的背景是可点击的 但我也希望页面的其余部分像以前一样工作 所以我尝试为div设置cursor auto 其中包含这一页 在 FF Chrome 和 safari 中 它工作得
  • 如何将查询参数添加到守卫中的路由并将其传递给 Angular 4 中的组件?

    我在我的 Angular 4 应用程序中使用路由保护 如果条件满足并返回 true 我想向路由添加一个查询参数 这是我一直在研究的代码 Injectable export class ViewGuardService implements
  • “move(-1)”作为 AngularJS 表达式有什么问题吗?

    我收到此错误 parse ueoe Unexpected end of expression move 从这段代码来看
  • 获取输入图像类型选择的图片并加载到图像标签中

    所以 我有一个用于上传 img 文件的输入框 我想要做的是从该数据 或选定的源 中获取数据并将其路由到图像标签的 src 属性中 像这样的东西 http jsfiddle net QC2c4 http jsfiddle net QC2c4
  • Google 地图 Javascript v3 折线点击事件

    我正在尝试显示一张地图 其中有多条路线布置为折线 单击多段线时 我想显示特定于该线的数据 将数据与线关联不是问题 但无论单击哪条线 显示的数据都会与最近绘制的线关联 就好像每条新折线都会覆盖最后一条线一样 我有一个数据库 其中包含 gpx
  • 如何使用 Node.js 解析 JSON? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我应该如何使用 Node js 解析 JSON 是否有一些模块可以安全地验证和解析 JSON 你可以简单地使用JSON parse h
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • React Router Tabs——保持组件安装

    我使用 React Router 创建了选项卡 每个选项卡都有不同的路线 但是 我想通过保持隐藏选项卡的安装来维护选项卡转换之间的选项卡状态 我该如何实现这一目标 每次路由切换时 React 路由器都会重新安装每个组件 已经有人问过这个问题
  • 如何在react.js中将/n替换为换行符?

    我正在尝试更换每一个 n to a br tag in ReactJS In my note note对象有一个包含多个的字符串 n in it 示例注释 注释 test ntest ntest 我尝试过的ReactJS note note
  • javascript从字符串创建不区分大小写的正则表达式

    我试图通过以不区分大小写的方式将输入与正则表达式匹配来进行验证 正则表达式作为对象上的字符串从服务中下来 我可能会得到类似的东西 regex ane 我可以执行以下操作 var rx new RegExp object regex The
  • 为什么 phantomjs 不能在 MacOS Sierra 中工作?

    我们正在使用phantomjs 1 9 1 macosx phantomjs 2 0 0 macosx哪一个工作得很好OS X 埃尔卡皮坦更新后macOS 塞拉利昂它会引发以下错误 phantomjs 1 9 1 macosx phanto
  • 尽管 getBoundingClientRect() 是假的,但如何将事件坐标转换为 SVG 坐标?

    我正在尝试根据鼠标的位置在 SVG 元素上动态绘制内容 不幸的是 我很难将 mousemove 事件中的鼠标坐标转换为 SVG 元素的坐标空间 这是我一直在测试的一个有缺陷的函数 CylinderDemo prototype handleM
  • 加载谷歌地图控件时是否有事件?

    我知道tilesloaded 但控件似乎在该事件之后加载 我基本上希望能够通过 jQuery 获取控件 但甚至找不到正确的监听 我也刚刚处理了 没有类似的事件 在控件可见之前空闲和tilesloaded触发 因此 基本上将 特殊控制 类添加

随机推荐