uniapp中使用echarts并且支持pc端的拖动、拖拽和其他交互事件

bash 复制代码
npm install echarts -D
​
// "echarts": "^5.3.2", [推荐版本]
// "zrender": "^5.3.2"  [如果报错的话就安装这个]
javascript 复制代码
<template>
  <view class="container">
    <view id="myChart" class="chart"></view>
  </view>
</template>
​
<script>
import * as echarts from 'echarts/dist/echarts.min.js';
​
// 开启触摸事件支持,用于适配移动端触摸屏设备。
echarts.env.touchEventsSupported = true;
​
// 明确关闭微信小程序适配模式,因为当前是浏览器环境
echarts.env.wxa = false;
​
// 同时启用SVG和Canvas两种渲染模式,ECharts会根据浏览器能力自动选择:
// Canvas更适合大数据量场景
// SVG更适合交互操作和动画
echarts.env.svgSupported = true;
echarts.env.canvasSupported = true;
​
// 启用DOM操作支持,这是浏览器环境下图表渲染的基础能力
echarts.env.domSupported = true;
​
export default {
  data() {
    return {
      chart: null
    }
  },
​
  methods: {
    initChart() {
      let base = +new Date(1968, 9, 3);
      let oneDay = 24 * 3600 * 1000;
      let date = [];
      let data = [Math.random() * 300];
      for (let i = 1; i < 20000; i++) {
        var now = new Date((base += oneDay));
        date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
        data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
      }
​
      const option = {
        tooltip: {
          trigger: 'axis',
          position: function (pt) {
            return [pt[0], '10%'];
          }
        },
        title: {
          left: 'center',
          text: 'Large Area Chart'
        },
        toolbox: {
          feature: {
            dataZoom: {
              yAxisIndex: 'none'
            },
            restore: {},
            saveAsImage: {}
          }
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: date
        },
        yAxis: {
          type: 'value',
          boundaryGap: [0, '100%']
        },
        dataZoom: [
          {
            type: 'inside',
            start: 0,
            end: 10
          },
          {
            type: 'slider',
            start: 0,
            end: 10,
            height: 20,
            bottom: 10,
            handleSize: '100%'
          }
        ],
        series: [
          {
            name: 'Fake Data',
            type: 'line',
            symbol: 'none',
            sampling: 'lttb',
            itemStyle: {
              color: 'rgb(255, 70, 131)'
            },
            areaStyle: {
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                {
                  offset: 0,
                  color: 'rgb(255, 158, 68)'
                },
                {
                  offset: 1,
                  color: 'rgb(255, 70, 131)'
                }
              ])
            },
            data: data
          }
        ]
      };
​
      // 确保 DOM 渲染完成后再初始化图表
      this.$nextTick(() => {
        const chartDom = document.getElementById('myChart');
        if (chartDom) {
          this.chart = echarts.init(chartDom);
          this.chart.setOption(option);
​
​
          // 手动绑定触摸事件
          this.bindTouchEvents(chartDom);
        }
      });
    },
​
    bindTouchEvents(element) {
      let startX = 0;
      let startY = 0;
​
      element.addEventListener('touchstart', (e) => {
        if (e.touches.length === 1) {
          startX = e.touches[0].clientX;
          startY = e.touches[0].clientY;
        }
      }, {passive: false});
​
      element.addEventListener('touchmove', (e) => {
        // 阻止默认滚动行为
        e.preventDefault();
      }, {passive: false});
    },
​
    handleResize() {
      if (this.chart) {
        this.chart.resize();
      }
    }
  },
​
  mounted() {
    // 延迟初始化确保 DOM 完全加载
    this.initChart();
​
    window.addEventListener('resize', this.handleResize);
  },
​
  beforeDestroy() {
    if (this.chart) {
      this.chart.dispose();
    }
    window.removeEventListener('resize', this.handleResize);
  }
}
</script>
​
<style scoped>
.container {
  width: 100%;
  height: 100%;
}
​
.chart {
  width: 100vw;
  height: 400px;
  touch-action: none; /* 关键:禁用浏览器默认的触摸行为 */
}
</style>
相关推荐
游戏开发爱好者812 小时前
苹果 App 上架流程,结合 Xcode、CI 等常见工具
macos·ios·ci/cd·小程序·uni-app·iphone·xcode
2501_9151063212 小时前
用 HBuilder 上架 iOS 应用时如何管理Bundle ID、证书与描述文件
android·ios·小程序·https·uni-app·iphone·webview
2501_9159090612 小时前
资源文件混淆在 iOS 应用安全中的实际价值
android·安全·ios·小程序·uni-app·iphone·webview
2501_9159184112 小时前
iOS App 性能测试中常被忽略的运行期问题
android·ios·小程序·https·uni-app·iphone·webview
毕设源码-邱学长12 小时前
【开题答辩全过程】以 基于uni-app的装修现场管理小程序设计与实现为例,包含答辩的问题和答案
uni-app
向宇it12 小时前
【unity游戏开发——网络】unity对接steam,并上传发布游戏版本——Steamworks.NET
游戏·unity·游戏引擎·.net·交互
郑州光合科技余经理14 小时前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
xiangxiongfly9151 天前
ECharts 使用总结
echarts
2501_915106321 天前
HTTP 协议详解,HTTP 协议在真实运行环境中的表现差异
网络·网络协议·http·ios·小程序·uni-app·iphone
@AfeiyuO1 天前
Vue3 热力图
vue·echarts