vue echarts map的使用,页面多图动态自适应

最近在vue中使用echarts时,遇到了一些坑,在此记录一下。

1:echarts map的使用

2:页面多图自适应,只有一个图生效

3:根据设备的dpr,动态的修改了meta标签中的initial-scale,导致引入的类似于echarts这样的外部插件的字体也产生了缩放

 

在echarts3.x后,echarts不在内置地图数据,地图的json数据需要单独下载引入。在vue中使用时,地图的json文件在node_modules中的echarts中,并不需要单独下载了。

代码如下:

<template>
    <div class="map" id="s-map">
        <div id="chartMap" class="chartGauge" :style="{height:height,width:width}"></div>
    </div>
</template>

<script type="text/ecmascript-6">
   // 在之前已经单独引入了echarts文件
   // 在此只需引入需要的地区的json文件 import gz from 'echarts/map/json/province/guizhou' export default { components: { }, data () { return { font: '24' } }, props: { width: { type: String, default: '200px' }, height: { type: String, default: '400px' } }, watch: {}, methods: { drawmap() { let chartMap = document.getElementById('chartMap'); let smap = document.getElementById('s-map');
          // 动态修改图表的宽高,达到自适应的效果  var resizeWorldMapContainer = function () { chartMap.style.width = smap.clientWidth +'px'; chartMap.style.height = smap.clientHeight + 'px'; }; resizeWorldMapContainer(); // 注册可用的地图 echarts.registerMap('guizhou', gz); let myChart = echarts.init(chartMap); myChart.setOption({ roam: false, series: [ { name: '', type: 'map', map: 'guizhou', mapType: '贵州', roam: false, zoom: 1.2, itemStyle:{ normal:{ areaColor: '#181d36', label:{ show:true, textStyle: { color: '#fff', fontSize: this.font } }, }, emphasis:{ areaColor: '#fff', label:{ show:true, textStyle: { color: '#398def', fontSize: this.font } } } }, data:[ {name: '贵州',value: Math.round(Math.random()*1000)} ] } ] }); /* // window的方法在一个页面只加载一次,window.onresize只在一个图表中发生一次,因此在一个页面多图时,只有一个图会自适应 window.onresize = function () { resizeWorldMapContainer(); myChart.resize(); }; */ window.addEventListener("resize", function(){ resizeWorldMapContainer(); myChart.resize(); }) } }, filters: {}, computed: {}, created () { }, mounted () { this.drawmap() }, destroyed () {} } </script> <style lang="scss" scoped> @function px2rem($px) { $rem: 75px; @return ($px / $rem) + rem; } </style>

 


 

同一页面多图都达到自适应的效果,如下图,我在同一个页面中引入了map和gauge,分别属于不同的组件,每个组件中都有对图表自适应的设置,然后通过window.onresize进行处理,但是发现只有一个图表会自适应拖动效果。

window.onresize = function () {
   resizeWorldMapContainer();
   myChart.resize();
};  

原因:wndow.onsize事件在同一页面中只会发生一次,因此会导致有点组件中window.onresize事件未发生

向window对象添加事件句柄

window.addEventListener("resize", function(){
   resizeWorldMapContainer();
   myChart.resize();
})

 

 


 

 

当修改了meta标签中的meta标签中的scale时,导致类似于echarts这样的库文字也会缩放,体验不好

动态修改meta中content的值,设置根节点字体大小

 

window.addEventListener('resize', () => {
    scale();
}, 300)

function scale(){
    let dpr = window.devicePixelRatio;
    
    let meta = document.getElementsByTagName("meta");
    //动态缩放
    meta[1].setAttribute('content', 'initial-scale=' + 1 / dpr + ', maximum-scale=' + 1/dpr + ', minimum-scale=' + 1/dpr + ', user-scalable=no')
    // 获取视窗宽度
    let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
        
    // 获取视窗高度
    let _html = document.getElementsByTagName('html')[0];
        
    _html.style.fontSize = htmlWidth / 10 + 'px';
}

scale();

 

思路是这样的,获取页面的dpr,动态设置图表的fontSize = dpr*12 + 'px'即可正常显示。  

转载于:https://www.cnblogs.com/sk-3/p/9173803.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Echarts 多图自适应的方法有多种,下面我列举其中两种常用的方法。 方法一:使用Vue的生命周期钩子函数进行自适应 1. 在 Vue 的 mounted 钩子函数中初始化 Echarts 图表,并将其保存为 Vue 组件的一个属性。 2. 在 Vueresized 钩子函数中监听窗口大小变化事件,并调用 Echartsresize 方法来实现图表的自适应。 示例代码如下: ``` <template> <div ref="chart" style="width: 100%; height: 400px;"></div> </template> <script> import * as echarts from 'echarts'; export default { data() { return { chart: null, }; }, mounted() { this.chart = echarts.init(this.$refs.chart); // 初始化图表数据 this.$nextTick(() => { this.chart.resize(); }); }, created() { window.addEventListener('resize', this.resized); }, destroyed() { window.removeEventListener('resize', this.resized); }, methods: { resized() { this.chart.resize(); }, }, }; </script> ``` 方法二:使用 Vue 监听属性变化进行自适应 1. 使用 Vue 的 watch 监听数据修改,当图表所需的数据发生变化时,调用 Echarts 的 setOption 方法更新图表。 2. 使用 Vue 的 mounted 钩子函数初始化 Echarts 图表。 示例代码如下: ``` <template> <div ref="chart" style="width: 100%; height: 400px;"></div> </template> <script> import * as echarts from 'echarts'; export default { data() { return { chart: null, chartData: {}, // 图表所需的数据 }; }, watch: { chartData: { handler() { this.chart.setOption(this.chartData); }, deep: true, }, }, mounted() { this.chart = echarts.init(this.$refs.chart); // 初始化图表数据 this.chart.setOption(this.chartData); }, }; </script> ``` 这两种方法都可以实现 Vue Echarts 图表的自适应,根据实际情况选择合适的方法即可。这样就能够保证当窗口大小变化时,图表能够自动调整和更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值