导出 PNG
handle.toDataURL({ scale })(默认 2x):SVG 序列化(补 xmlns/宽高)→ Image 载入 → canvas 光栅化 → PNG dataURL,按渲染内容缓存(同 scale 再次调用即时返回)。
导出当前折线为 PNG(2x 光栅化)——真实浏览器中第二次取值即得 dataURL
…
<p class="demo-label" style="margin:0 0 10px">导出当前折线为 PNG(2x 光栅化)——真实浏览器中第二次取值即得 dataURL</p><div class="icen-toolbar" style="margin:0 0 10px"> <button class="icen-btn icen-btn-sm icen-btn-primary" type="button" id="charts-export-btn">导出 PNG</button></div><div class="icen-chart" id="demo-charts-export" style="border:1px solid var(--icen-token-line-soft);border-radius:var(--icen-radius-md);padding:12px"></div><p class="demo-label" id="charts-export-status" style="margin-top:8px">…</p>
行为与接口说明
handle.toDataURL({ scale })(默认 2x):SVG 序列化(补 xmlns/宽高)→ Image 载入 → canvas 光栅化 → PNG dataURL,按渲染内容缓存(同 scale 再次调用即时返回)。诚实不抛:SSR/无 canvas 环境、纯 DOM 图型(vbar 等根下无 SVG)返回 undefined;SVG→Image 异步——首次调用触发绘制返回 undefined,完成后(或下帧)同 scale 再取。典型接法:点「导出」→ 首调 undefined → rAF/setTimeout 后再取 → a[download] 落盘。
安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 用法
const handle = renderChart(el, { type: 'line', labels, values });btn.addEventListener('click', () => { const first = handle.toDataURL?.({ scale: 2 }); // 首次:触发光栅化,可能 undefined(诚实) setTimeout(() => { const url = handle.toDataURL?.({ scale: 2 }); // 缓存命中:PNG dataURL if (!url) return; // 无 canvas / 纯 DOM 图型:undefined 不抛 const a = document.createElement('a'); a.href = url; a.download = 'chart.png'; a.click(); }, 60);});