@amaster.ai/taro-echarts-ui 1.0.0-beta.51 → 1.0.0-beta.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +4 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
'use strict';var components=require('@tarojs/components'),
|
|
1
|
+
'use strict';var components=require('@tarojs/components'),O=require('@tarojs/taro'),react=require('react'),platform=require('zrender/lib/core/platform'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var O__default=/*#__PURE__*/_interopDefault(O);var k=null;function dt(){if(k)return k;try{k=O__default.default.createOffscreenCanvas({type:"2d",width:2,height:2})?.getContext("2d");}catch{}return k}function L(){O__default.default.getEnv()!==O__default.default.ENV_TYPE.WEB&&platform.setPlatformAPI({createCanvas:()=>{try{return O__default.default.createOffscreenCanvas({type:"2d",width:1,height:1})}catch{return {getContext:()=>null}}},measureText:(t,n)=>{let e=dt();if(!e)return {width:0};try{return e.font=n||"12px sans-serif",{width:e.measureText(t)?.width||0}}catch{return {width:0}}},loadImage:(t,n,e)=>{try{let r=O__default.default.createImage?.();if(!r)return e();r.onload=()=>n(r),r.onerror=e,r.src=t;}catch{e();}},requestAnimationFrame:t=>setTimeout(t,16),cancelAnimationFrame:t=>clearTimeout(t)});}function v(t,n){t.addEventListener||(t.addEventListener=()=>{}),t.removeEventListener||(t.removeEventListener=()=>{}),t.dispatchEvent||(t.dispatchEvent=()=>{});let e=t.getContext.bind(t);t.getContext=s=>s==="2d"||s==="2d-text"?n:e(s),t.style||(t.style={}),t.setAttribute||(t.setAttribute=()=>{}),t.getAttribute||(t.getAttribute=()=>null),t.removeAttribute||(t.removeAttribute=()=>{}),t.getBoundingClientRect||(t.getBoundingClientRect=()=>({top:0,left:0,width:t.width,height:t.height,right:t.width,bottom:t.height}));let r=t.devicePixelRatio||1,a=(s,h)=>{Object.getOwnPropertyDescriptor(t,s)||Object.defineProperty(t,s,{get:h});};return a("offsetWidth",()=>t.width/r),a("offsetHeight",()=>t.height/r),a("clientWidth",()=>t.width/r),a("clientHeight",()=>t.height/r),t}var D=null,V=false;async function _(){if(D)return D;L();let t=await import('echarts/core');if(!V){let{CanvasRenderer:n}=await import('echarts/renderers'),{PieChart:e,BarChart:r,LineChart:a,ScatterChart:s,RadarChart:h,MapChart:m,TreeChart:C,TreemapChart:y,GraphChart:l,GaugeChart:o,FunnelChart:R,ParallelChart:A,SankeyChart:T,BoxplotChart:b,CandlestickChart:x,EffectScatterChart:P,LinesChart:M,HeatmapChart:W,PictorialBarChart:z,ThemeRiverChart:i,SunburstChart:d,CustomChart:g}=await import('echarts/charts'),{TitleComponent:u,TooltipComponent:S,GridComponent:c,PolarComponent:f,RadarComponent:p,GeoComponent:I,SingleAxisComponent:w,ParallelComponent:E,CalendarComponent:j,GraphicComponent:q,ToolboxComponent:Q,AxisPointerComponent:U,BrushComponent:J,LegendComponent:K,DataZoomComponent:tt,DataZoomInsideComponent:et,DataZoomSliderComponent:rt,VisualMapComponent:nt,VisualMapContinuousComponent:ot,VisualMapPiecewiseComponent:it,TimelineComponent:st,AriaComponent:at,TransformComponent:ct,DatasetComponent:ut,MarkPointComponent:pt,MarkLineComponent:ht,MarkAreaComponent:lt}=await import('echarts/components');t.use([n,e,r,a,s,h,m,C,y,l,o,R,A,T,b,x,P,M,W,z,i,d,g,u,S,c,f,p,I,w,E,j,q,Q,U,J,K,tt,et,rt,nt,ot,it,st,at,ct,ut,pt,ht,lt]),V=true;}return D=t,t}function H(t,n){if(t==null||t==="")return n;if(typeof t=="number")return `${t}px`;let e=String(t),r=e.match(/^(-?\d+(?:\.\d+)?)(rpx)$/i);return r&&r[1]?`${parseFloat(r[1])/2}px`:e}function yt(t){if(!t||typeof t!="object")return {};let n={};for(let[e,r]of Object.entries(t))r!=null&&typeof r!="function"&&(typeof r!="string"&&typeof r!="number"||(typeof r=="string"&&r.includes("rpx")?n[e]=H(r,r):n[e]=r));return n}function gt(t){let n={},e=t.split(";");for(let r of e){let a=r.trim();if(!a)continue;let s=a.indexOf(":");if(s===-1)continue;let h=a.slice(0,s).trim(),m=a.slice(s+1).trim();if(h&&m){let C=h.replace(/-([a-z])/g,(y,l)=>l.toUpperCase());n[C]=m;}}return n}function St(t){return t?typeof t=="string"?gt(t):t:{}}var $={shadowBlur:0,shadowColor:"transparent",shadowOffsetX:0,shadowOffsetY:0};function F(t){if(!t||typeof t!="object")return t;if(Array.isArray(t))return t.map(e=>F(e));let n={};for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];e==="shadowBlur"||e==="shadowOffsetX"||e==="shadowOffsetY"?n[e]=0:e==="shadowColor"?n[e]="transparent":typeof r=="object"&&r!==null?n[e]=F(r):n[e]=r;}return n}function wt(t){if(!t||typeof t!="object")return t;let n=F(t);return n.tooltip&&typeof n.tooltip=="object"&&(n.tooltip={...n.tooltip,...$}),Array.isArray(n.series)&&(n.series=n.series.map(e=>e&&typeof e=="object"&&e.emphasis?{...e,emphasis:{...e.emphasis,itemStyle:{...e.emphasis.itemStyle||{},...$}}}:e)),n}function xt(t){return t?!t.endsWith("%")&&t!=="auto":false}function X({option:t,height:n="100%",width:e="100%",className:r="",style:a,defaultHeight:s="300px"}){let h=St(a),m=h.height,C=m||(xt(n)?n:void 0),y={width:e,height:m||n,...h},l=react.useMemo(()=>`chart_${Math.random().toString(36).slice(2,11)}`,[]),o=react.useRef(null),[R,A]=react.useState(false),T=react.useRef(null),b=O__default.default.getEnv()!==O__default.default.ENV_TYPE.WEB,x=react.useMemo(()=>wt(t),[t]);react.useEffect(()=>{if(!b){let u=true;(async()=>{try{let f=await _();if(!u)return;let p=document.getElementById(l);if(!p)return;o.current?.dispose(),o.current=f.init(p),o.current.setOption(x),A(!0);}catch(f){console.error("[ECharts] H5 init failed:",f);}})();let c=()=>o.current?.resize();return window.addEventListener("resize",c),()=>{u=false,window.removeEventListener("resize",c),o.current?.dispose(),o.current=null;}}let i=true,d=async(u=0)=>{i&&O__default.default.createSelectorQuery().select(`#${l}`).fields({node:true,size:true}).exec(async S=>{if(!i)return;if(!S?.[0]?.node){u<5&&setTimeout(()=>d(u+1),200*(u+1));return}let c=S[0].node,f=c.getContext("2d");if(!f)return;let p=O__default.default.getSystemInfoSync().pixelRatio,I=S[0].width,w=S[0].height;!C&&(w<=0||!w)&&(console.warn(`[ECharts] Warning: Container has no explicit height. ECharts will use default height (${s}), but the canvas may not be visible. To fix this, either:
|
|
2
|
+
1. Set parent container height: <View style={{ height: '300px' }}>
|
|
3
|
+
2. Set ECharts height prop: <ECharts height="300px" />
|
|
4
|
+
3. Set ECharts style: <ECharts style={{ height: '300px' }} />`),w=parseInt(s)||300),T.current=c,c.width=I*p,c.height=w*p,f.scale(p,p),c.devicePixelRatio=p,v(c,f),o.current?.dispose(),o.current=null;try{let E=await _();if(!i)return;o.current=E.init(c,null,{width:I,height:w,devicePixelRatio:p}),o.current.setOption(x),A(!0);}catch(E){console.error("[ECharts] Init failed:",E);}});},g=setTimeout(()=>d(),50);return ()=>{i=false,clearTimeout(g),o.current?.dispose(),o.current=null;}},[l,b]),react.useEffect(()=>{R&&o.current&&o.current.setOption(x,true);},[x,R]);let P=(i,d)=>{if(!o.current||!T.current)return;let g=i.touches[0]||i.changedTouches[0];if(!g)return;let u=T.current.getBoundingClientRect();o.current.getZr().handler.dispatch(d,{zrX:g.x-u.left,zrY:g.y-u.top,preventDefault:()=>{},stopPropagation:()=>{},stopImmediatePropagation:()=>{}});},M=i=>{P(i,"mousedown");},W=i=>P(i,"mousemove"),z=i=>{P(i,"mouseup"),P(i,"click");};if(!b){let i=C?H(C,s):H(n,"100%"),d={...yt(y),width:H(y.width,"100%"),height:i};return jsxRuntime.jsx("div",{id:l,className:r||void 0,style:d})}return jsxRuntime.jsx(components.Canvas,{id:l,type:"2d",className:r||void 0,style:{width:y.width||"100%",height:y.height||s},disableScroll:true,onTouchStart:M,onTouchMove:W,onTouchEnd:z})}exports.ECharts=X;exports.setupCanvasPolyfill=v;exports.setupWeappZrenderPlatform=L;//# sourceMappingURL=index.cjs.map
|
|
2
5
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","key","disableShadowInOption","option","series","ECharts","height","width","className","style","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","h5Style","jsx","Canvas"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n \n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度 */\n height?: string\n /** 图表宽度 */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties\n}\n\nexport default function ECharts({ \n option, \n height = '300px', \n width = '100%',\n className = '',\n style,\n}: EChartsProps) {\n const mergedStyle: CSSProperties = { width, height, ...style }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n const canvasWidth = res[0].width\n const canvasHeight = res[0].height\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n const h5Style: CSSProperties = {\n ...mergedStyle,\n width: convertRpx(mergedStyle.width, '100%'),\n height: convertRpx(mergedStyle.height, '300px'),\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || '300px' }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","cleanStyleForH5","style","cleaned","key","parseStyleString","styleStr","declarations","declaration","trimmed","colonIndex","property","camelProperty","_","letter","normalizeStyle","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","disableShadowInOption","option","series","hasExplicitHeight","height","ECharts","width","className","defaultHeight","normalizedStyle","styleHeight","explicitHeight","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","finalHeight","h5Style","jsx","Canvas"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n\n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 清理 style 对象,过滤掉无效值并转换 rpx(H5 模式专用) */\nfunction cleanStyleForH5(style: CSSProperties | undefined): CSSProperties {\n if (!style || typeof style !== 'object') return {}\n\n const cleaned: CSSProperties = {}\n for (const [key, value] of Object.entries(style)) {\n // 过滤掉 null、undefined、函数和非字符串/数字值\n if (value === null || value === undefined) continue\n if (typeof value === 'function') continue\n if (typeof value !== 'string' && typeof value !== 'number') continue\n\n // 转换 rpx 值\n if (typeof value === 'string' && value.includes('rpx')) {\n cleaned[key as keyof CSSProperties] = convertRpx(value, value) as any\n } else {\n cleaned[key as keyof CSSProperties] = value as any\n }\n }\n return cleaned\n}\n\n/** 将 CSS 字符串解析为 CSSProperties 对象 */\nfunction parseStyleString(styleStr: string): CSSProperties {\n const style: CSSProperties = {}\n const declarations = styleStr.split(';')\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim()\n if (!trimmed) continue\n\n const colonIndex = trimmed.indexOf(':')\n if (colonIndex === -1) continue\n\n const property = trimmed.slice(0, colonIndex).trim()\n const value = trimmed.slice(colonIndex + 1).trim()\n\n if (property && value) {\n // 将 kebab-case 转换为 camelCase\n const camelProperty = property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n ;(style as any)[camelProperty] = value\n }\n }\n\n return style\n}\n\n/** 统一处理 style 属性,支持对象和字符串形式 */\nfunction normalizeStyle(style: CSSProperties | string | undefined): CSSProperties {\n if (!style) return {}\n if (typeof style === 'string') return parseStyleString(style)\n return style\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */\n height?: string\n /** 图表宽度,默认 '100%' */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties | string\n /** 默认高度,当无法获取容器尺寸时使用,默认 300px */\n defaultHeight?: string\n}\n\n/** 检测是否有明确的非百分比高度设置 */\nfunction hasExplicitHeight(height: string | undefined): boolean {\n if (!height) return false\n // 排除百分比和 auto\n return !height.endsWith('%') && height !== 'auto'\n}\n\nexport default function ECharts({\n option,\n height = '100%',\n width = '100%',\n className = '',\n style,\n defaultHeight = '300px',\n}: EChartsProps) {\n const normalizedStyle = normalizeStyle(style)\n const styleHeight = normalizedStyle.height as string | undefined\n\n // 优先级:style.height > height prop > '100%'\n // 如果都是百分比或 auto,则需要后续通过测量获取实际尺寸\n const explicitHeight = styleHeight || (hasExplicitHeight(height) ? height : undefined)\n const mergedStyle: CSSProperties = { width, height: styleHeight || height, ...normalizedStyle }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n let canvasWidth = res[0].width\n let canvasHeight = res[0].height\n\n // 如果没有明确设置高度且获取到的尺寸为 0,使用默认高度\n if (!explicitHeight && (canvasHeight <= 0 || !canvasHeight)) {\n console.warn(\n `[ECharts] Warning: Container has no explicit height. ` +\n `ECharts will use default height (${defaultHeight}), ` +\n `but the canvas may not be visible. ` +\n `To fix this, either:\\n` +\n `1. Set parent container height: <View style={{ height: '300px' }}>\\n` +\n `2. Set ECharts height prop: <ECharts height=\"300px\" />\\n` +\n `3. Set ECharts style: <ECharts style={{ height: '300px' }} />`\n )\n // 转换默认高度(如果是 rpx 转为 px)\n const fallbackHeight = parseInt(defaultHeight)\n canvasHeight = fallbackHeight || 300\n }\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n // 如果没有明确高度且没有设置百分比高度,使用默认高度\n const finalHeight = explicitHeight\n ? convertRpx(explicitHeight, defaultHeight)\n : convertRpx(height, '100%')\n\n const h5Style: CSSProperties = {\n ...cleanStyleForH5(mergedStyle),\n width: convertRpx(mergedStyle.width, '100%'),\n height: finalHeight,\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n // style 保持使用百分比,让父容器决定尺寸\n // 如果父容器没有高度,init 时会使用 defaultHeight\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || defaultHeight }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -7,16 +7,18 @@ export { setupCanvasPolyfill } from './polyfill.cjs';
|
|
|
7
7
|
interface EChartsProps {
|
|
8
8
|
/** ECharts 配置项 */
|
|
9
9
|
option: EChartsOption;
|
|
10
|
-
/**
|
|
10
|
+
/** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */
|
|
11
11
|
height?: string;
|
|
12
|
-
/**
|
|
12
|
+
/** 图表宽度,默认 '100%' */
|
|
13
13
|
width?: string;
|
|
14
14
|
/** CSS 类名 */
|
|
15
15
|
className?: string;
|
|
16
|
-
/**
|
|
17
|
-
style?: CSSProperties;
|
|
16
|
+
/** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */
|
|
17
|
+
style?: CSSProperties | string;
|
|
18
|
+
/** 默认高度,当无法获取容器尺寸时使用,默认 300px */
|
|
19
|
+
defaultHeight?: string;
|
|
18
20
|
}
|
|
19
|
-
declare function ECharts({ option, height, width, className, style, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
declare function ECharts({ option, height, width, className, style, defaultHeight, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
24
|
* 小程序 ZRender 平台适配
|
package/dist/index.d.ts
CHANGED
|
@@ -7,16 +7,18 @@ export { setupCanvasPolyfill } from './polyfill.js';
|
|
|
7
7
|
interface EChartsProps {
|
|
8
8
|
/** ECharts 配置项 */
|
|
9
9
|
option: EChartsOption;
|
|
10
|
-
/**
|
|
10
|
+
/** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */
|
|
11
11
|
height?: string;
|
|
12
|
-
/**
|
|
12
|
+
/** 图表宽度,默认 '100%' */
|
|
13
13
|
width?: string;
|
|
14
14
|
/** CSS 类名 */
|
|
15
15
|
className?: string;
|
|
16
|
-
/**
|
|
17
|
-
style?: CSSProperties;
|
|
16
|
+
/** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */
|
|
17
|
+
style?: CSSProperties | string;
|
|
18
|
+
/** 默认高度,当无法获取容器尺寸时使用,默认 300px */
|
|
19
|
+
defaultHeight?: string;
|
|
18
20
|
}
|
|
19
|
-
declare function ECharts({ option, height, width, className, style, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
declare function ECharts({ option, height, width, className, style, defaultHeight, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
24
|
* 小程序 ZRender 平台适配
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
import {Canvas}from'@tarojs/components';import
|
|
1
|
+
import {Canvas}from'@tarojs/components';import O from'@tarojs/taro';import {useMemo,useRef,useState,useEffect}from'react';import {setPlatformAPI}from'zrender/lib/core/platform';import {jsx}from'react/jsx-runtime';var k=null;function dt(){if(k)return k;try{k=O.createOffscreenCanvas({type:"2d",width:2,height:2})?.getContext("2d");}catch{}return k}function L(){O.getEnv()!==O.ENV_TYPE.WEB&&setPlatformAPI({createCanvas:()=>{try{return O.createOffscreenCanvas({type:"2d",width:1,height:1})}catch{return {getContext:()=>null}}},measureText:(t,n)=>{let e=dt();if(!e)return {width:0};try{return e.font=n||"12px sans-serif",{width:e.measureText(t)?.width||0}}catch{return {width:0}}},loadImage:(t,n,e)=>{try{let r=O.createImage?.();if(!r)return e();r.onload=()=>n(r),r.onerror=e,r.src=t;}catch{e();}},requestAnimationFrame:t=>setTimeout(t,16),cancelAnimationFrame:t=>clearTimeout(t)});}function v(t,n){t.addEventListener||(t.addEventListener=()=>{}),t.removeEventListener||(t.removeEventListener=()=>{}),t.dispatchEvent||(t.dispatchEvent=()=>{});let e=t.getContext.bind(t);t.getContext=s=>s==="2d"||s==="2d-text"?n:e(s),t.style||(t.style={}),t.setAttribute||(t.setAttribute=()=>{}),t.getAttribute||(t.getAttribute=()=>null),t.removeAttribute||(t.removeAttribute=()=>{}),t.getBoundingClientRect||(t.getBoundingClientRect=()=>({top:0,left:0,width:t.width,height:t.height,right:t.width,bottom:t.height}));let r=t.devicePixelRatio||1,a=(s,h)=>{Object.getOwnPropertyDescriptor(t,s)||Object.defineProperty(t,s,{get:h});};return a("offsetWidth",()=>t.width/r),a("offsetHeight",()=>t.height/r),a("clientWidth",()=>t.width/r),a("clientHeight",()=>t.height/r),t}var D=null,V=false;async function _(){if(D)return D;L();let t=await import('echarts/core');if(!V){let{CanvasRenderer:n}=await import('echarts/renderers'),{PieChart:e,BarChart:r,LineChart:a,ScatterChart:s,RadarChart:h,MapChart:m,TreeChart:C,TreemapChart:y,GraphChart:l,GaugeChart:o,FunnelChart:R,ParallelChart:A,SankeyChart:T,BoxplotChart:b,CandlestickChart:x,EffectScatterChart:P,LinesChart:M,HeatmapChart:W,PictorialBarChart:z,ThemeRiverChart:i,SunburstChart:d,CustomChart:g}=await import('echarts/charts'),{TitleComponent:u,TooltipComponent:S,GridComponent:c,PolarComponent:f,RadarComponent:p,GeoComponent:I,SingleAxisComponent:w,ParallelComponent:E,CalendarComponent:j,GraphicComponent:q,ToolboxComponent:Q,AxisPointerComponent:U,BrushComponent:J,LegendComponent:K,DataZoomComponent:tt,DataZoomInsideComponent:et,DataZoomSliderComponent:rt,VisualMapComponent:nt,VisualMapContinuousComponent:ot,VisualMapPiecewiseComponent:it,TimelineComponent:st,AriaComponent:at,TransformComponent:ct,DatasetComponent:ut,MarkPointComponent:pt,MarkLineComponent:ht,MarkAreaComponent:lt}=await import('echarts/components');t.use([n,e,r,a,s,h,m,C,y,l,o,R,A,T,b,x,P,M,W,z,i,d,g,u,S,c,f,p,I,w,E,j,q,Q,U,J,K,tt,et,rt,nt,ot,it,st,at,ct,ut,pt,ht,lt]),V=true;}return D=t,t}function H(t,n){if(t==null||t==="")return n;if(typeof t=="number")return `${t}px`;let e=String(t),r=e.match(/^(-?\d+(?:\.\d+)?)(rpx)$/i);return r&&r[1]?`${parseFloat(r[1])/2}px`:e}function yt(t){if(!t||typeof t!="object")return {};let n={};for(let[e,r]of Object.entries(t))r!=null&&typeof r!="function"&&(typeof r!="string"&&typeof r!="number"||(typeof r=="string"&&r.includes("rpx")?n[e]=H(r,r):n[e]=r));return n}function gt(t){let n={},e=t.split(";");for(let r of e){let a=r.trim();if(!a)continue;let s=a.indexOf(":");if(s===-1)continue;let h=a.slice(0,s).trim(),m=a.slice(s+1).trim();if(h&&m){let C=h.replace(/-([a-z])/g,(y,l)=>l.toUpperCase());n[C]=m;}}return n}function St(t){return t?typeof t=="string"?gt(t):t:{}}var $={shadowBlur:0,shadowColor:"transparent",shadowOffsetX:0,shadowOffsetY:0};function F(t){if(!t||typeof t!="object")return t;if(Array.isArray(t))return t.map(e=>F(e));let n={};for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];e==="shadowBlur"||e==="shadowOffsetX"||e==="shadowOffsetY"?n[e]=0:e==="shadowColor"?n[e]="transparent":typeof r=="object"&&r!==null?n[e]=F(r):n[e]=r;}return n}function wt(t){if(!t||typeof t!="object")return t;let n=F(t);return n.tooltip&&typeof n.tooltip=="object"&&(n.tooltip={...n.tooltip,...$}),Array.isArray(n.series)&&(n.series=n.series.map(e=>e&&typeof e=="object"&&e.emphasis?{...e,emphasis:{...e.emphasis,itemStyle:{...e.emphasis.itemStyle||{},...$}}}:e)),n}function xt(t){return t?!t.endsWith("%")&&t!=="auto":false}function X({option:t,height:n="100%",width:e="100%",className:r="",style:a,defaultHeight:s="300px"}){let h=St(a),m=h.height,C=m||(xt(n)?n:void 0),y={width:e,height:m||n,...h},l=useMemo(()=>`chart_${Math.random().toString(36).slice(2,11)}`,[]),o=useRef(null),[R,A]=useState(false),T=useRef(null),b=O.getEnv()!==O.ENV_TYPE.WEB,x=useMemo(()=>wt(t),[t]);useEffect(()=>{if(!b){let u=true;(async()=>{try{let f=await _();if(!u)return;let p=document.getElementById(l);if(!p)return;o.current?.dispose(),o.current=f.init(p),o.current.setOption(x),A(!0);}catch(f){console.error("[ECharts] H5 init failed:",f);}})();let c=()=>o.current?.resize();return window.addEventListener("resize",c),()=>{u=false,window.removeEventListener("resize",c),o.current?.dispose(),o.current=null;}}let i=true,d=async(u=0)=>{i&&O.createSelectorQuery().select(`#${l}`).fields({node:true,size:true}).exec(async S=>{if(!i)return;if(!S?.[0]?.node){u<5&&setTimeout(()=>d(u+1),200*(u+1));return}let c=S[0].node,f=c.getContext("2d");if(!f)return;let p=O.getSystemInfoSync().pixelRatio,I=S[0].width,w=S[0].height;!C&&(w<=0||!w)&&(console.warn(`[ECharts] Warning: Container has no explicit height. ECharts will use default height (${s}), but the canvas may not be visible. To fix this, either:
|
|
2
|
+
1. Set parent container height: <View style={{ height: '300px' }}>
|
|
3
|
+
2. Set ECharts height prop: <ECharts height="300px" />
|
|
4
|
+
3. Set ECharts style: <ECharts style={{ height: '300px' }} />`),w=parseInt(s)||300),T.current=c,c.width=I*p,c.height=w*p,f.scale(p,p),c.devicePixelRatio=p,v(c,f),o.current?.dispose(),o.current=null;try{let E=await _();if(!i)return;o.current=E.init(c,null,{width:I,height:w,devicePixelRatio:p}),o.current.setOption(x),A(!0);}catch(E){console.error("[ECharts] Init failed:",E);}});},g=setTimeout(()=>d(),50);return ()=>{i=false,clearTimeout(g),o.current?.dispose(),o.current=null;}},[l,b]),useEffect(()=>{R&&o.current&&o.current.setOption(x,true);},[x,R]);let P=(i,d)=>{if(!o.current||!T.current)return;let g=i.touches[0]||i.changedTouches[0];if(!g)return;let u=T.current.getBoundingClientRect();o.current.getZr().handler.dispatch(d,{zrX:g.x-u.left,zrY:g.y-u.top,preventDefault:()=>{},stopPropagation:()=>{},stopImmediatePropagation:()=>{}});},M=i=>{P(i,"mousedown");},W=i=>P(i,"mousemove"),z=i=>{P(i,"mouseup"),P(i,"click");};if(!b){let i=C?H(C,s):H(n,"100%"),d={...yt(y),width:H(y.width,"100%"),height:i};return jsx("div",{id:l,className:r||void 0,style:d})}return jsx(Canvas,{id:l,type:"2d",className:r||void 0,style:{width:y.width||"100%",height:y.height||s},disableScroll:true,onTouchStart:M,onTouchMove:W,onTouchEnd:z})}export{X as ECharts,v as setupCanvasPolyfill,L as setupWeappZrenderPlatform};//# sourceMappingURL=index.js.map
|
|
2
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","key","disableShadowInOption","option","series","ECharts","height","width","className","style","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","h5Style","jsx","Canvas"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n \n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度 */\n height?: string\n /** 图表宽度 */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties\n}\n\nexport default function ECharts({ \n option, \n height = '300px', \n width = '100%',\n className = '',\n style,\n}: EChartsProps) {\n const mergedStyle: CSSProperties = { width, height, ...style }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n const canvasWidth = res[0].width\n const canvasHeight = res[0].height\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n const h5Style: CSSProperties = {\n ...mergedStyle,\n width: convertRpx(mergedStyle.width, '100%'),\n height: convertRpx(mergedStyle.height, '300px'),\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || '300px' }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","cleanStyleForH5","style","cleaned","key","parseStyleString","styleStr","declarations","declaration","trimmed","colonIndex","property","camelProperty","_","letter","normalizeStyle","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","disableShadowInOption","option","series","hasExplicitHeight","height","ECharts","width","className","defaultHeight","normalizedStyle","styleHeight","explicitHeight","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","finalHeight","h5Style","jsx","Canvas"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n\n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 清理 style 对象,过滤掉无效值并转换 rpx(H5 模式专用) */\nfunction cleanStyleForH5(style: CSSProperties | undefined): CSSProperties {\n if (!style || typeof style !== 'object') return {}\n\n const cleaned: CSSProperties = {}\n for (const [key, value] of Object.entries(style)) {\n // 过滤掉 null、undefined、函数和非字符串/数字值\n if (value === null || value === undefined) continue\n if (typeof value === 'function') continue\n if (typeof value !== 'string' && typeof value !== 'number') continue\n\n // 转换 rpx 值\n if (typeof value === 'string' && value.includes('rpx')) {\n cleaned[key as keyof CSSProperties] = convertRpx(value, value) as any\n } else {\n cleaned[key as keyof CSSProperties] = value as any\n }\n }\n return cleaned\n}\n\n/** 将 CSS 字符串解析为 CSSProperties 对象 */\nfunction parseStyleString(styleStr: string): CSSProperties {\n const style: CSSProperties = {}\n const declarations = styleStr.split(';')\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim()\n if (!trimmed) continue\n\n const colonIndex = trimmed.indexOf(':')\n if (colonIndex === -1) continue\n\n const property = trimmed.slice(0, colonIndex).trim()\n const value = trimmed.slice(colonIndex + 1).trim()\n\n if (property && value) {\n // 将 kebab-case 转换为 camelCase\n const camelProperty = property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n ;(style as any)[camelProperty] = value\n }\n }\n\n return style\n}\n\n/** 统一处理 style 属性,支持对象和字符串形式 */\nfunction normalizeStyle(style: CSSProperties | string | undefined): CSSProperties {\n if (!style) return {}\n if (typeof style === 'string') return parseStyleString(style)\n return style\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */\n height?: string\n /** 图表宽度,默认 '100%' */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties | string\n /** 默认高度,当无法获取容器尺寸时使用,默认 300px */\n defaultHeight?: string\n}\n\n/** 检测是否有明确的非百分比高度设置 */\nfunction hasExplicitHeight(height: string | undefined): boolean {\n if (!height) return false\n // 排除百分比和 auto\n return !height.endsWith('%') && height !== 'auto'\n}\n\nexport default function ECharts({\n option,\n height = '100%',\n width = '100%',\n className = '',\n style,\n defaultHeight = '300px',\n}: EChartsProps) {\n const normalizedStyle = normalizeStyle(style)\n const styleHeight = normalizedStyle.height as string | undefined\n\n // 优先级:style.height > height prop > '100%'\n // 如果都是百分比或 auto,则需要后续通过测量获取实际尺寸\n const explicitHeight = styleHeight || (hasExplicitHeight(height) ? height : undefined)\n const mergedStyle: CSSProperties = { width, height: styleHeight || height, ...normalizedStyle }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n let canvasWidth = res[0].width\n let canvasHeight = res[0].height\n\n // 如果没有明确设置高度且获取到的尺寸为 0,使用默认高度\n if (!explicitHeight && (canvasHeight <= 0 || !canvasHeight)) {\n console.warn(\n `[ECharts] Warning: Container has no explicit height. ` +\n `ECharts will use default height (${defaultHeight}), ` +\n `but the canvas may not be visible. ` +\n `To fix this, either:\\n` +\n `1. Set parent container height: <View style={{ height: '300px' }}>\\n` +\n `2. Set ECharts height prop: <ECharts height=\"300px\" />\\n` +\n `3. Set ECharts style: <ECharts style={{ height: '300px' }} />`\n )\n // 转换默认高度(如果是 rpx 转为 px)\n const fallbackHeight = parseInt(defaultHeight)\n canvasHeight = fallbackHeight || 300\n }\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n // 如果没有明确高度且没有设置百分比高度,使用默认高度\n const finalHeight = explicitHeight\n ? convertRpx(explicitHeight, defaultHeight)\n : convertRpx(height, '100%')\n\n const h5Style: CSSProperties = {\n ...cleanStyleForH5(mergedStyle),\n width: convertRpx(mergedStyle.width, '100%'),\n height: finalHeight,\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n // style 保持使用百分比,让父容器决定尺寸\n // 如果父容器没有高度,init 时会使用 defaultHeight\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || defaultHeight }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
package/package.json
CHANGED