
npm install echarts -D
// "echarts": "^5.3.2", [推荐版本]
// "zrender": "^5.3.2" [如果报错的话就安装这个]
<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>