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>
相关推荐
_院长大人_11 小时前
Vue + ECharts 实现价格趋势分析图
前端·vue.js·echarts
自然 醒12 小时前
uni-app开发微信小程序,如何使用towxml去渲染md格式和html标签格式的内容?
微信小程序·uni-app·html
CHB14 小时前
uni-agent,你的数字员工来了
人工智能·uni-app·vibecoding
h_jQuery14 小时前
uniapp使用canvas实现逐字书写任意文字内容,后合成一张图片提交
前端·javascript·uni-app
困困的果果头14 小时前
【uniapp】解决H5嵌套在web-view中时打包页面与状态栏重叠
前端·uni-app
前端 贾公子14 小时前
Uniapp 使用 UQRCode 创建二维码
uni-app
Rattenking14 小时前
uni-app组件开发----自定义数字键盘组件
前端·javascript·uni-app
人机与认知实验室15 小时前
人机之间的有概念交互与无概念交互
交互
笨笨狗吞噬者15 小时前
代理的妙用:uni-app 小程序是怎样用 `Proxy` 和 `wrapper` 抹平平台差异的
前端·微信小程序·uni-app
软希网分享源码2 天前
中英双语言量化交易投资源码/跟单搬砖区块链交易所源码/前端uniapp纯源码+后端
前端·uni-app·区块链·中英双语言量化交易投资源码