在Vue的mounted中仍然加载渲染不出echarts的方法问题

 更新时间:2024年03月06日 10:38:07   作者:没有头发的战斗暴龙兽  
这篇文章主要介绍了在Vue的mounted中仍然加载渲染不出echarts的方法问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题

问题的主要原因是在mounted中无法获取到dom元素

<template>
  <div>
    <div ref="echarts"></div>
  </div>
</template>
 
<script>
  export default {
    mounted () {
      console.log(this.$$refs.echarts);  // undefined
    },
  }
</script>

知道了问题在哪里,那就从根源下手:

这是因为某些因素使得在mounted中还并没有生成dom,所以结果自然就是undefined,那怎样才能获取到这个dom元素?

解决方法1(完美解决+超简单)

直接把初始化方法写在updated生命周期中

    methods: {
      initEcharts() {
        echarts.init(this.$refs.echarts).setOption(option);
      }
    },
    updated() {
      this.initEcharts();
    }

解决方法2(完美解决+复杂)

使用自定义指令

我们自己设置一个自定义属性,去监测dom是什么时候生成的,在dom生成的时候立刻将echarts渲染到页面上。

这个方法完美解决了加定时器有延时的缺点。

<template>
  <div>
    <div ref="echarts" v-init="option"></div>
  </div>
</template>
 
<script>
import * as echarts from 'echarts';
  export default {
    data() {
      return {
        option: {
          title: {
          text: 'ECharts 入门示例'
        },
        tooltip: {},
        legend: {
          data: ['销量']
        },
        xAxis: {
          data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
        },
        yAxis: {},
        series: [
          {
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
        }
      }
    },
    directives: {
      init: {
        // inserted: 在dom元素成功插入父节点时的钩子函数
        inserted(el, binding) {
          echarts.init(el).setOption(binding.value);
        }
      }
    },
  }
</script>

解决方法3(有缺陷+超简单)

在初始化方法外面套一层定时器

在初始化方法外面套一层定时器:等dom生成了之后我们再去获取这个dom元素

    methods: {
      initEcharts() {
        echarts.init(this.$refs.echarts).setOption(option);
      }
    },
    mounted () {
      setTimeout(() => {
        this.initEcharts();
      }, 500)
    },

这个方法有一个很大的缺点,就是我们要自己去设置定时器的时间,就有可能会造成页面的渲染和echarts的渲染不同步,页面显示出来了之后echarts可能要过一会儿才会出现。

总结

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

相关文章

  • 浅析Vue为什么需要同时使用Ref和Reactive

    浅析Vue为什么需要同时使用Ref和Reactive

    这篇文章主要想来和大家一起探讨一下Vue为什么需要同时使用Ref和Reactive,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-08-08
  • Vue.js组件高级特性实例详解

    Vue.js组件高级特性实例详解

    这篇文章主要介绍了Vue.js组件高级特性,结合实例形式详细分析了vue.js组件递归、模板、动态加载、渲染等相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • vue router导航守卫(router.beforeEach())的使用详解

    vue router导航守卫(router.beforeEach())的使用详解

    导航守卫主要用来通过跳转或取消的方式守卫导航。这篇文章主要介绍了vue-router导航守卫(router.beforeEach())的使用,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Vue.js中轻松解决v-for执行出错的三个方案

    Vue.js中轻松解决v-for执行出错的三个方案

    v-for标签可以用来遍历数组,将数组的每一个值绑定到相应的视图元素中去,下面这篇文章主要给大家介绍了关于在Vue.js中轻松解决v-for执行出错的三个方案,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • vue+elementui 实现新增和修改共用一个弹框的完整代码

    vue+elementui 实现新增和修改共用一个弹框的完整代码

    Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是Mint UI ,今天给大家普及vue+elementui 实现新增和修改共用一个弹框的完整代码,一起看看吧
    2021-06-06
  • el-select选择器组件下拉框增加自定义按钮的实现

    el-select选择器组件下拉框增加自定义按钮的实现

    本文主要介绍了el-select选择器组件下拉框增加自定义按钮的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 详解Vue3 SFC 和 TSX 方式调用子组件中的函数

    详解Vue3 SFC 和 TSX 方式调用子组件中的函数

    在使用 .vue 定义的组件中,setup 中提供了 defineExpose() 方法,该方法可以将组件内部的方法暴露给父组件,这篇文章主要介绍了Vue3 SFC 和 TSX 方式调用子组件中的函数,需要的朋友可以参考下
    2022-10-10
  • Vue中动画与过渡的使用教程

    Vue中动画与过渡的使用教程

    最近在写vue的一个项目要实现过渡的效果,虽然vue动画不是强项,库也多,但是基本的坑还是得踩扎实,下面这篇文章主要给大家介绍了关于Vue中实现过渡动画效果的相关资料,需要的朋友可以参考下
    2023-01-01
  • 如何在Vue3中使用视频库Video.js实现视频播放功能

    如何在Vue3中使用视频库Video.js实现视频播放功能

    在Vue3项目中集成Video.js库,可以创建强大的视频播放功能,这篇文章主要介绍了如何在Vue3中使用视频库Video.js实现视频播放功能,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • Vue3中页面跳转方式总结

    Vue3中页面跳转方式总结

    Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,它提供了多种方法来实现页面之间的导航,本文将详细介绍 Vue 3 中的各种页面跳转方式,有需要的小伙伴可以参考一下
    2024-12-12

最新评论