在Vue的mounted中仍然加载渲染不出echarts的方法问题
作者:没有头发的战斗暴龙兽
这篇文章主要介绍了在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可能要过一会儿才会出现。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。