vue3+ts+echars实现中国为中心中文版世界地图(包含配置文件)

<template>
  <div class="world-map">
    <div id="worldMap" ref="worldMap" class="map-wrap"></div>
  </div>
</template>
<script lang="ts" setup>
  import { onMounted, onActivated, watch } from 'vue';
  import * as echarts from 'echarts';
  import appData from '@/assets/continent_geo.json';

  const props = defineProps({
    mapData: {
      type: Array,
      default() {
        return [];
      },
    },
  });

  // const a = props.mapData;
  // console.log(a);
  // const data = [
  //   {
  //     name: '中国',
  //     value: 100,
  //   },
  //   {
  //     name: '美国',
  //     value: 200,
  //   },
  // ];
  let myChart: echarts.ECharts | null = null;
  let max = 0;
  let min = 1000;

  const initMap = () => {
    echarts.registerMap('continent', appData);
    myChart = echarts.init(document.getElementById('worldMap')!);
    props.mapData.forEach((item) => {
      if (item.value > max) {
        max = item.value;
      }
      if (item.value < min) {
        min = item.value;
      }
    });
    myChart.setOption({
      tooltip: {
        trigger: 'item',
        // eslint-disable-next-line consistent-return
        formatter(params: any) {
          if (params.data) {
            const dom = `
            <div> ${params.data.name} </div>
            <div>渠道统计 ${Number(params.data.value).toFixed(2)} </div>
          `;
            return dom;
          }
        },
      },
      visualMap: {
        type: 'continuous',
        min,
        max,
        bottom: '0',
        left: '0',
        textStyle: { color: '#73747E' },
        // pieces: props.pieces,

        inRange: {
          // 渐变颜色,从小到大
          color: ['#EDF5FF', '#66A6FD'],
        },
      },
      series: [
        {
          type: 'map',
          mapType: 'continent', // 自定義擴展圖表類型
          zoom: 1.1,
          aspectScale: 1.1, // 长宽比
          itemStyle: {
            normal: { label: { show: false } },
            emphasis: { label: { show: true } },
          },
          data: props.mapData,
        },
      ],
    });
  };
  initMap();

  // onMounted(() => {
  //   initMap();
  // });

  onActivated(() => {
    if (myChart) {
      setTimeout(() => {
        myChart.resize();
      }, 200);
    }
  });
  watch(
    () => props.mapData,
    () => {
      initMap();
    },
    { deep: true }
  );
</script>
<style scoped>
  .map-wrap {
    width: 100%;
    height: 400px;
  }
</style>

配置文件也已上传csdn可供下载。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要安装 EchartsVue3,可以通过以下命令进行安装: ``` npm install echarts vue@next ``` 然后,在你的 Vue3 项目中,创建一个组件,例如 `DoubleLineChart.vue`,并在模板中添加一个 div 元素,用于渲染 Echarts 图表: ```html <template> <div ref="chart" style="height: 500px"></div> </template> ``` 在组件中,你需要引入 Echarts 和定义图表的配置选项: ```typescript import { defineComponent } from 'vue'; import * as echarts from 'echarts'; export default defineComponent({ name: 'DoubleLineChart', props: { data: { type: Object, required: true, }, }, mounted() { const chart = echarts.init(this.$refs.chart as HTMLDivElement); const option = { // 配置选项 }; chart.setOption(option); }, }); ``` 在配置选项中,你需要定义两个 y 轴,分别对应两条折线: ```typescript const option = { tooltip: { trigger: 'axis', }, legend: { data: ['销量', '访问量'], }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true, }, xAxis: { type: 'category', boundaryGap: false, data: this.data.xData, }, yAxis: [ { type: 'value', name: '销量', axisLabel: { formatter: '{value} 件', }, }, { type: 'value', name: '访问量', axisLabel: { formatter: '{value} 次', }, }, ], series: [ { name: '销量', type: 'line', yAxisIndex: 0, data: this.data.y1Data, }, { name: '访问量', type: 'line', yAxisIndex: 1, data: this.data.y2Data, }, ], }; ``` 其中,`data` 属性是一个对象,包含了 x 轴和两个 y 轴的数据: ```typescript export default defineComponent({ name: 'DoubleLineChart', props: { data: { type: Object, required: true, }, }, mounted() { const chart = echarts.init(this.$refs.chart as HTMLDivElement); const option = { tooltip: { trigger: 'axis', }, legend: { data: ['销量', '访问量'], }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true, }, xAxis: { type: 'category', boundaryGap: false, data: this.data.xData, }, yAxis: [ { type: 'value', name: '销量', axisLabel: { formatter: '{value} 件', }, }, { type: 'value', name: '访问量', axisLabel: { formatter: '{value} 次', }, }, ], series: [ { name: '销量', type: 'line', yAxisIndex: 0, data: this.data.y1Data, }, { name: '访问量', type: 'line', yAxisIndex: 1, data: this.data.y2Data, }, ], }; chart.setOption(option); }, }); ``` 最后,在父组件中,你可以使用 `DoubleLineChart` 组件,并传递数据给它: ```html <template> <div> <double-line-chart :data="chartData" /> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import DoubleLineChart from '@/components/DoubleLineChart.vue'; export default defineComponent({ name: 'App', components: { DoubleLineChart, }, data() { return { chartData: { xData: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'], y1Data: [120, 200, 150, 80, 70, 110, 130], y2Data: [220, 180, 290, 130, 220, 200, 150], }, }; }, }); </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值