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>
相关推荐
雨季66612 分钟前
Flutter 三端应用实战:OpenHarmony “专注时光盒”——在碎片洪流中守护心流的数字容器
开发语言·前端·安全·flutter·交互
方见华Richard1 小时前
整数阶时间重参数化:基于自适应豪斯多夫维数的偏微分方程正则化新框架
人工智能·笔记·交互·原型模式·空间计算
郑州光合科技余经理3 小时前
可独立部署的Java同城O2O系统架构:技术落地
java·开发语言·前端·后端·小程序·系统架构·uni-app
小哥Mark3 小时前
各种Flutter拖拽交互组件助力鸿蒙应用个性化
flutter·交互·harmonyos
雪芽蓝域zzs3 小时前
uniapp 取消滚动条
uni-app
zhyongrui4 小时前
SnipTrip 菜单 Liquid Glass 实现方案:结构、材质、交互与深浅色策略
ios·性能优化·swiftui·交互·开源软件·材质
2401_865854884 小时前
Uniapp和Flutter哪个更适合企业级开发?
flutter·uni-app
雪芽蓝域zzs5 小时前
uniapp 省市区三级联动
前端·javascript·uni-app
总爱写点小BUG5 小时前
UniApp 图标方案终极排坑:告别 FontClass,拥抱真 SVG 组件化
前端框架·uni-app
灰灰勇闯IT5 小时前
Flutter for OpenHarmony:卡片式 UI(Card Widget)设计 —— 构建清晰、优雅的信息容器
flutter·交互