具体项目下解决Echarts多端同步开发和维护的问题

news2024/12/28 2:55:53

具体问题场景

        PC端和移动端需要同时上线图表功能(没有多余工时)

        之后的版本迭代(功能、样式、配置等)默认双端同步,开发人员只希望维护一套代码

        Echarts在移动端有部分功能不兼容不支持

         

Echarts在移动端的坑

        ① 移动端页面使用echarts4 中的地图组件,并添加省份的点击事件,响应click无效,eharts也不支持tap事件。

        解决方法:自己代理echarts组件实例的click事件。或更新到echarts5版本

        ②地图组件有数据的省份高亮状态点击后消失。

        解决方法:劫持点击事件做判断

        ③dataZoom失效

dataZoom:{
  type: 'inside',
  start: 0,
  end: 50,
},

        解决方法:把传入的对象参数改成数组

dataZoom:[
   {
      type: 'inside',
      start: 0,
      end: 50,
    }
],

        ④ 图表组件的datazoom会阻碍页面的原生滑动事件,导致页面没办法正确上下滑。

        解决方法:添加preventDefaultMouseMove属性为false

        ⑤datazoom为inside时,多个图表在移动端上滑动失效

        解决方法:更新到最新版本echarts,但是还是会有部分机型存在这个问题

多端合一是比较理想的解决方案

        我们可以看到Echarts在移动端上还是存在很多不兼容的地方。而且Echarts官网时挂着的example都是PC端上的。为了避免各种坑爹问题,我在项目中还是选择了多端为一端的开发方案。

        核心思想就是通过Iframe让移动端的页面直接渲染PC的网页,同时微调一些样式以适配移动端的小屏。

图表部分

        这部分不是重点,因为页面用的还是PC端的页面。只需要调整部分样式大小就好。主要解决一个留存问题就是Iframe里面图表的内部滑动会影响移动端的页面滑动。

<mobileTouchView @touchInfo="updateTouchInfo" :touchRecord="true">
        <...>
          <m-dashboard-runtime-item
            v-for="item in layout"
            :key="item.pkId"
            :layout="item"
            :field="fieldMap[item.pkId]"
          />
        </...>
 </mobileTouchView>

        解决方法是套了个自定义的滑动层,并监听会出问题的几个操作

<!--mobileTouchView-->
<template>
  <div
    :class="$style.mobileTouchView"
    @touchstart="proxyStart"
    @touchmove="proxyMove"
    @touchend="proxyEnd"
    @touchcancel="proxyCancel"
  >
    <slot></slot>
  </div>
</template>

        核心思想是计算touch起点和终点的screenY/screenX的偏离来确定用户手势。具体可以看我的另外一篇推文。

通讯部分  

        代码分为两部分

 移动端部分

        主体

  <view class="dashboard-page">
      ....
      <!-- 内容 -->
      <view class="content" :class="{ showFilter: filterFields.length > 0 }">
        <iframe
          v-if="iframeUrl"
          ref="iframe"
          class="webview"
          :src="iframeUrl"
        ></iframe>
        <!-- 留白组件 -->
        <x-abnormal v-else :text="tips" class="tips" />
      </view>
</view>

        很简单的一个移动端页面中间嵌套了一个iframe页面

        监听加载

async getFormData() { 
    ....
    await this.$nextTick();
    this.$refs.iframe &&
    this.$refs.iframe.addEventListener('load', e => this.handleIframeLoad(e));
}

        发送讯息

        同时监听PC端发过来的讯息

// iframe加载完成
  handleIframeLoad(e) {
    // 先打开对PC讯息的监听器
    window.addEventListener('message', this.messageGateway);
    // 对PC建立握手
    this.handShake(5);
  }

        这里为什么要握手五次?其实这里可以填大一点。因为单方无法知道连接是否成功。 所以每500毫秒重新握手一次,直到收到回复。

        握手

handShake(t = 0) {
    if (this.connected || t < 1) {
      return;
    }
    // console.log('mobile: 开始建立握手');
    this.$refs.iframe.contentWindow.postMessage({ 
        type: 'ping', 
        data: {timeStamp:this.currentTime},
    }, '*');
    setTimeout(() => {
      this.handShake((t -= 1));
    }, 500);
  }

       收到回复后把this.connected改成true就好了

         

 Pc部分

        Iframe通讯

         PC上通过监听message来捕抓移动端发送过来的讯息

  created() {
    window.addEventListener('message', e => this.messageGateway(e));
  }

        这里可以过滤一下域名:

get allowOrigin() {
    return ['localhost:8080', 'm.xxx.com', 'mobile.xxx.com'];
}
  
messageGateway(e) {
    const findIndex = this.allowOrigin.findIndex(item =>
      e.origin.includes(item),
    );
    if (findIndex > -1) {
        ...
    }
  }

用户权限问题

        在移动端打开PC端的Iframe页面,需要传入token来验证登录状态和身份权限。

get iframeUrl() {
    return `${createModuleUrl('app')}/m-dashboard/${this.formId}?token=${
      this.token
    }`;
}

        iframe页面验证token后通过路由跳转到页面

const routes = [
    ...,
    {
        path: '/m-dashboard/:formId',
        component: () => import('@/views/dashboard/mobile')
    },
]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI与医疗保健:革命性技术如何拯救生命

文章目录 引言AI的应用领域1. 影像识别2. 疾病诊断3. 药物研发4. 个性化治疗 AI技术1. 机器学习2. 深度学习3. 自然语言处理4. 基因组学 实际案例1. Google Health的深度学习模型2. IBM Watson for Oncology3. PathAI的病理学分析 道德和隐私考虑结论 &#x1f389;欢迎来到AIG…

振弦采集仪和传感器在岩土工程中安装方法的关键要点

振弦采集仪和传感器在岩土工程中安装方法的关键要点 振弦采集仪和传感器在岩土工程中的安装方法是岩土工程中非常关键的过程。其安装质量的好坏直接影响实验数据的准确性&#xff0c;进而影响工程设计和施工效果。因此&#xff0c;在实际工作中&#xff0c;如何正确的安装振弦…

0基础学习VR全景平台篇 第100篇:美团酒店丨平台上传全景全流程

目前美团平台已经具备VR全景图在美团App客户端的展示能力&#xff0c;但目前E-Booking暂未开通上传通道&#xff0c;若商家您有全景图且有意愿上传至平台&#xff0c;需要签署授权书&#xff0c;并依照规定的格式要求发送邮件申请&#xff0c;由平台代为人工上传。具体规则和要…

一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了

一款非常容易上手的报表工具&#xff0c;简单操作实现BI炫酷界面数据展示&#xff0c;驱动支持众多不同类型的数据库&#xff0c;可视化神器&#xff0c;免开源了。 在互联网数据大爆炸的这几年&#xff0c;各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的…

循环神经网络——上篇【深度学习】【PyTorch】【d2l】

文章目录 6、循环神经网络6.1、序列模型6.1.1、序列模型6.1.2、条件概率建模6.1.2、代码实现 6.2、文本预处理6.2.1、理论部分6.2.2、代码实现 6.3、语言模型和数据集 6、循环神经网络 6.1、序列模型 6.1.1、序列模型 序列模型主要用于处理具有时序结构的数据&#xff0c; *…

OA 电子审批流程是什么?

公司中&#xff0c;最最最常见也是最最最多的就是——各种审批。 我当年第一次实习&#xff0c;在一家国企的行政部门&#xff0c;我们部门领导那个时候最主要的工作就是“打通流程”&#xff0c;咱也不知道他在打通什么流程&#xff0c;反正这个很重要就是了。 结果&#xf…

docker swarm集群

集群构建 不包含在任何 Swarm 中的 Docker 节点&#xff0c;称为运行于单引擎&#xff08;Single-Engine&#xff09;模式。一旦被加入 Swarm 集群&#xff0c;则切换为 Swarm 模式。第一步我们要做的就是初始化 Swarm。 初始化swarm集群 将本机作为manager节点 docker swar…

小谈设计模式(4)—单一职责原则

小谈设计模式&#xff08;4&#xff09;—单一职责原则 专栏介绍专栏地址专栏介绍 单一职责原则核心思想职责的划分单一变化原则高内聚性低耦合性核心总结 举例图书类&#xff08;Book&#xff09;用户类&#xff08;User&#xff09;图书管理类&#xff08;Library&#xff09…

强信创,高实用:SuperMap开发者线上训练营9月25日起航

当前&#xff0c;信创工作全面开展&#xff0c;从细分领域延展至所有领域&#xff0c;自主GIS技术也迈入新的发展阶段。2023年9月25日至9月27日&#xff0c;北京超图软件股份有限公司、917书院GIS学堂将主办以“强信创、高实用”为主题的SuperMap开发者训练营&#xff08;以下简…

路由器ip地址设置

当你使用路由器时&#xff0c;你可以按照以下步骤设置路由器的IP地址。这样可以确保你的网络连接正常并允许其他设备连接到你的路由器。 **步骤一&#xff1a;登录路由器管理界面** 首先&#xff0c;你需要登录到路由器的管理界面。打开你的浏览器&#xff0c;并输入路由器的…

【校招VIP】java语言考点之switch和default

考点介绍&#xff1a; switch、default是 校招Java岗位面试时常考的关键字组合之一。 java语言考点之switch和default-相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点试题 1、switch语句能否作用在byte上&#xff0c;能否作用在long上&#xff0c;能否作用…

ubuntu 22.04通过apt-get安装的apache2将http改造为https的方法

目录 一、安装apache2 二、启动apache2服务 三、访问http网页 四、改造https &#xff08;一&#xff09;查看apache2是否安装了ssl模块 &#xff08;二&#xff09;安装apache2-dev &#xff08;三&#xff09;配置SSL访问 1. 生成私有证书 2. 新增ssl配置文件 3. 重…

ubunutu20/18/22 编译android 5相关的问题汇总-千里马framework开源代码平板编译过程

hi&#xff0c;粉丝朋友们&#xff1a; 闲鱼50块钱淘到了一个开源平板&#xff0c;注意这个平板是有源码的&#xff0c;可以进行相关的编译修改。哈哈哈&#xff0c;马哥这边就体验了一下50块钱平板是否可以拿来做framework呢&#xff1f; 哈哈&#xff0c;说好就开干了&#x…

Android13 通知栏和设置显示中添加副屏亮度条,调节副屏亮度

由于台式的Android设备&#xff0c;存在着两个屏幕显示的情况&#xff0c;故需要对Android系统开发一个可以调节副屏亮度的功能。 提交副屏亮度调节的效果如下&#xff1a; 涉及修改的文件如下&#xff1a; frameworks/base/services/core/java/com/android/server/am/Acti…

扔掉你的开发板,跟我玩Mcore-全志h616

本文转载自WhyCan Forum(哇酷开发者社区)&#xff1a; https://whycan.com/t_10024.html 作者leefei 这是一个1.69寸触摸小电视。使用全志H616芯片&#xff0c;板上硬件有mpu6050陀螺仪&#xff0c;USB转ttl调试串口&#xff0c;一个USB接口&#xff0c;WIFI&蓝牙&#x…

Promethus(普罗米修斯)安装与配置(亲测可用)

1. 普罗米修斯概述 Prometheus(是由go语言(golang)开发)是一套开源的监控&报警&时间序列数 据库的组合。适合监控docker容器。 Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 。自2012年成立以来&#xff0c;许多公司和组织都采用了Prometheus&#…

Matlab图像处理-Lab模型

Lab模型 Lab模型是由CIE&#xff08;国际照明委员会&#xff09;制定的一种彩色模型。该模型与设备无关&#xff0c;弥补了RGB模型和CMYK模型必须依赖于设备颜色特性的不足&#xff1b; 另外&#xff0c;自然界中的任何颜色都可以在Lab空间中表现出来&#xff0c;也就是说RGB和…

http-server的安装、前端使用http-server启本地服务

http-server 简介 http-server 是一个简单的零配置的命令行http服务器&#xff0c;它足够强大便于生产和使用&#xff0c;用于本地测试和开发。 有时候我们打开一个文档使用file协议打开的时候&#xff0c;不能发送ajax请求&#xff0c;只能使用http协议才能请求资源&#xff…

河道水位监测,助力守护河流生态可持续发展

河流是地球生命的源泉&#xff0c;它们滋养着万物&#xff0c;为生态系统提供源源不断的能量。然而&#xff0c;随着全球气候变化和人类活动的加剧&#xff0c;河流面临的问题也日益严重&#xff0c;如水位剧烈波动、水质恶化等。河道水位监测对于保护河流生态环境&#xff0c;…

jsp tag文件使用入门

Tag文件是拓展名为.tag的文件&#xff0c;其内容中可以有普通的HTML标记符、某些特殊的指令标记、成员变量声明和方法的定义、java程序片和java表达示。 Tag文件可以实现代码的复用&#xff0c;即一个Tag文件可以被多个jsp页面使用。 在WEB服务目录下创建如下目录&#xff0c; …