vue2项目如何优雅封装echarts地图

这篇文章主要介绍“vue2项目如何优雅封装echarts地图”,在日常操作中,相信很多人在vue2项目如何优雅封装echarts地图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2项目如何优雅封装echarts地图”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在长乐等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、成都做网站 网站设计制作按需规划网站,公司网站建设,企业网站建设,品牌网站建设,营销型网站建设,成都外贸网站制作,长乐网站建设费用合理。

vue2项目如何优雅封装echarts地图

能学到的知识

  • 1、echarts地图模块封装,可复用

  • 2、echarts地图自定义弹窗(显示自定义样式、自定义数据、自定义图片),其它图表的自定义弹窗可参考。

  • 3、echarts地图自定义弹窗动态展示接口数据

  • 4、基于姐姐篇实现的,这个地图模块也是自适应的

  • 5、基于vue2vue cli3echarts 5

效果图

先上个效果图吧,说明下实现的效果。

  • 1、广州区域地图

  • 2、自定义弹窗,显示选中地区的名称、区号,弹窗加了个小图片

  • 3、基本上图片、视频什么的,都可以在自定义弹窗上显示,这里只展示下自定义弹窗加图片的方式,视频同理的,不介绍了,有兴趣自己随便试试就好

  • 4、弹窗数据是从模拟接口取的

vue2项目如何优雅封装echarts地图

注意

1、vue中echarts 5.x以下版本和5.x以上版本引入的区别

5.x以下版本
import echarts from 'echarts'
5.x以上版本
import * as echarts from 'echarts'

2、记得在vue.config.js中开启运行时编译功能

runtimeCompiler: true

实现

数据准备

|-- public
	|-- data
		|-- 4401.json
		|-- mapdata.json
	|-- images
		|-- map-ic.png
  • 1、4401.json是广州区域的geojson数据,用来给echarts显示广州的区域地图

  • 2、mapdata.json是模拟接口请求的假数据,自己随便自定义了,在获取数据后,看情况处理下传到封装好的echarts地图模块就行,这里模拟接口请求的知识可参考这里: https://juejin.cn/post/6995147964427534373/

  • 3、map-ic.png地图自定义弹窗用到的图片

echarts地图模块封装

|-- src
    |-- components
        |-- chart
            |-- options    // 存放各种图表的option
                |-- map    // 地图option
                    |-- index.js

具体代码如下:

import * as echarts from 'echarts'

const getSimpleMap = (jsonMap, data, config) => {
  if (!echarts.getMap(jsonMap.mark)) {
    echarts.registerMap(jsonMap.mark, jsonMap.json)
  }
  const defaultConfig = {
    tooltip: {
      // 窗口外框
      trigger: 'item',
      padding: 0,
      borderWidth: 0,
      borderColor: '#FFFFFF',
      backgroundColor: '#FFFFFF',
      formatter: (params) => {
        const { data } = params
        const str = `
                    
                        ${data.name}
                    
                                                                                                           区号:
                                ${data.hoverObj == null ? '' : data.hoverObj.adcode}
                            
                                                              `         return str       }     },     geo: {       map: jsonMap.mark,       type: 'map',       layoutCenter: ['50%', '50%'],       layoutSize: '150%',       zoom: 0.65,       roam: false,       itemStyle: {         normal: {           areaColor: 'rgba(201, 229, 255, 1)',           shadowColor: 'rgba(142, 201, 255, 1)',           shadowOffsetX: -5,           shadowOffsetY: 12         }       }     },     series: [       {         type: 'map',         map: jsonMap.mark, // 自定义扩展图表类型         zoom: 0.65, // 缩放         animationDuration: 1200,         itemStyle: {           // 地图样式           normal: {             borderColor: '#FFFFFF',             borderWidth: 3,             areaColor: 'rgba(201, 229, 255, 1)'           }         },         label: {           show: true,           color: '#666666',           fontSize: 12,           fontWeight: 400         },         emphasis: {           // 鼠标移入动态的时候显示的默认样式           label: {             show: true,             color: '#FFFFFF',             fontSize: 15,             fontWeight: 600           },           itemStyle: {             areaColor: 'rgba(102, 182, 255, 1)',             borderColor: '#FFFFFF',             borderWidth: 2           }         },         layoutCenter: ['50%', '50%'],         layoutSize: '150%',         data: data       }     ]   }   const opt = Object.assign({}, defaultConfig, config)   const { legend, tooltip, series, geo, grid } = opt   const chartOpt = {     grid,     legend,     tooltip,     geo,     series   }   return chartOpt } export default {   getSimpleMap }

自定义弹窗主要是在tooltipformatter里面实现,自定义好html弹窗,把params里要显示的数据显示到对应的地方就OK了。

个人喜欢直接纯html实现好设计给的弹窗样式,然后直接复制到formatter里面。每次遇到不同的设计,就修改下formatter里面的html和匹配下要显示的数据就行了。这里可以进一步封装的,有兴趣的可以试试。

页面调用

接口数据处理

initMap(url) {
    mapRequest(url).then((res) => {
        const mapData = res.data
        const jsonMap = { mark: this.mapName, json: mapData }

        const data = mapData.features.map((item) => {
          const { name, adcode } = item.properties

          let hoverObj = {}

          const objIndex = findElem(this.mapPopData, 'adcode', adcode)
          if (objIndex !== -1) {
            hoverObj = this.mapPopData[objIndex]
          } else {
            hoverObj = null
          }
          return {
            name,
            hoverObj: hoverObj
          }
        })
        this.mapOpt = this.$eChartFn.getSimpleMap(jsonMap, data)
    }).catch((err) => {
        console.log(err, '加载地图失败')
    })
}

这里对地图geojson数据和接口返回数据进行匹配处理,达到弹窗数据是对应地区数据的效果。

地图geojson数据是必有adcode字段的,所以接口数据mapPopData最好也是加上此字段,用来匹配。 上面代码里的hoverObj是匹配好的每个区域的数据,最终形成数组data,通过以下代码给封装的echarts模块传参

this.mapOpt = this.$eChartFn.getSimpleMap(jsonMap, data)

具体代码可以参考echartMapTest文件夹里面的index.js文件

代码总览

涉及的文件如下(具体参考代码):

|-- public
	|-- data
		|-- 4401.json
		|-- mapdata.json
	|-- images
		|-- map-ic.png
|-- src
	|-- api
		|-- map.js    // 获取地图geojson数据、地图弹窗接口模拟数据
    |-- components
        |-- chart
            |-- index.vue    // 图表单文件组件,供界面调用
            |-- index.js    // 实现自动化导入options里的图表option
            |-- options    // 存放各种图表的option
                |-- map    // 地图option
                    |-- index.js
    |-- views
        |-- echartMapTest    // 实例所在
            |-- index.vue
            |-- index.scss
            |-- index.js
	|-- utils
		|---utils.js
|-- main.js    // 全局引入echarts图表

到此,关于“vue2项目如何优雅封装echarts地图”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


本文标题:vue2项目如何优雅封装echarts地图
URL地址:http://myzitong.com/article/goghip.html

其他资讯