框架适配器
在 React、Vue、Angular、Svelte 和 SolidJS 中使用 Sixtyfold Charts 的折线图和股票图。
Sixtyfold 的框架包是在相同的 LineChart 和 StockChart 引擎之上的轻量生命周期适配器。它们不重复渲染逻辑、不重塑数据、不添加运行时遥测,也不会将每个图表强制拉入您的应用。
安装一个适配器以及您使用的引擎。仅导入其 /line 或 /stock 入口点:
pnpm add @sixtyfold/react@1 @sixtyfold/line@1import { SixtyfoldLineChart } from "@sixtyfold/react/line";将 react 替换为 vue、angular、svelte 或 solid。对于股票图,安装 @sixtyfold/stock 并导入 /stock。图表引擎是适配器的可选对等依赖项,因此安装折线图不会同时安装股票图。
共享适配器契约
所有适配器在组件挂载后创建图表,等待 initialize(),应用响应式输入,并在卸载时调用 destroy()。这也会终止图表 Worker 并释放观察器、监听器和大型缓冲区引用。在 SSR 期间组件只输出其画布宿主;当服务器必须绘制图表像素时使用 @sixtyfold/ssr。
每个适配器都会报告就绪、构造和属性安装错误、渲染器与覆盖层错误,以及渲染统计。折线适配器还报告 SeriesVisibilityChangeEvent。每个框架通过其常规 ref 或组件 API 暴露底层 LineChart 或 StockChart 实例,因此不常见的命令式操作仍然可用。
就绪(Readiness)表示初始 props 已被接受,并不意味着其第一帧 Canvas 已被绘制。ready 回调中以命令式方式所做的更改不会被延迟的初始 prop 批次覆盖。
处理图表故障
适配器错误钩子接受 unknown,因为 JavaScript 构造错误并不要求使用特定类。Sixtyfold 渲染器发出的失败是 ChartRendererError 实例。覆盖解析或渲染器传递失败是 ChartOverlayError 实例。在读取结构化字段之前请先缩小值的类型:
import {
ChartOverlayError,
ChartRendererError,
} from "@sixtyfold/line";
export function reportChartError(error: unknown) {
if (error instanceof ChartRendererError) {
console.error(error.phase, error.message);
return;
}
if (error instanceof ChartOverlayError) {
console.error("Overlay sources failed:", error.sources);
return;
}
console.error(error);
}在仅库存(stock-only)应用中从 @sixtyfold/stock 使用相同导入。error.phase 要么是 "initialization" 要么是 "runtime"。渲染器失败会销毁该图表实例;如果应用选择恢复,请重新挂载适配器。覆盖失败是非致命的:已成功的项目保持已安装;如果每个请求的项目都失败,则保留先前渲染的覆盖。
被拒绝的响应式属性安装会报告错误并且延后发送初始就绪通知。提供更正后的属性以在不重新挂载的情况下重试。已成功安装的数据在随后某次属性失败时不会再次传输。此恢复不适用于需要重新挂载的不可恢复的渲染器错误。
批量类型化数组会传输到 Worker。将每个数据对象视为一次性使用:不要就地修改,应为每次更新分配包含新缓冲区的新对象。这样可保留针对数百万点数据集的零拷贝路径。
React
import { useMemo, useRef } from "react";
import {
SixtyfoldLineChart,
type LineChartHandle,
} from "@sixtyfold/react/line";
export function Signals() {
const chartRef = useRef<LineChartHandle>(null);
const data = useMemo(() => ({
x: new Float64Array([0, 1, 2, 3]),
y: new Float64Array([3, 7, 4, 9]),
length: 4,
}), []);
return (
<SixtyfoldLineChart
ref={chartRef}
data={data}
aria-label="Signal history"
onError={console.error}
/>
);
}该组件接受常规 canvas 属性。其 ref 暴露 ref.current?.chart。初始构造在微任务中延后,因此 React Strict Mode 的开发生命周期探针不会导致初始数据被传输两次。
React 19.2+ Activity 可以在不重新创建渲染器或重新传输数据的情况下隐藏和显示图表。属性安装以及就绪/错误通知会等待到显示时才进行;统计和序列可见性回调在隐藏时被断开。保留的 Worker 和缓冲区会在组件实际卸载时释放,包括在隐藏状态下的卸载。
React 在隐藏时会断开转发的 ref。先前捕获的句柄在显示前也会从 .chart 返回 null。React 18 和 React 19.2 之前的 React 19 版本通过被动清理在卸载时销毁图表,这包括被重新挂起的 Suspense 边界隐藏的图表。
Vue
<script setup lang="ts">
import { shallowRef } from "vue";
import { SixtyfoldLineChart } from "@sixtyfold/vue/line";
const data = shallowRef({
x: new Float64Array([0, 1, 2, 3]),
y: new Float64Array([3, 7, 4, 9]),
length: 4,
});
</script>
<template>
<SixtyfoldLineChart
:data="data"
aria-label="Signal history"
@error="console.error"
/>
</template>对于批量数据请使用 shallowRef 或 markRaw,而非 Vue 的深层代理。组件会发出 ready、error 和 stats;折线图还会发出 seriesVisibilityChange。模板 ref 会暴露其浅层 chart ref。
统计收集遵循响应式监听器。唯一的 @stats.once 监听器在首次事件后禁用收集;普通的 @stats 监听器则保持启用。已消费的 .once 监听器在该组件生命周期内保持已消费状态。
Angular
Angular 20–22 包使用独立组件和 Angular 包格式的次级入口点。
import { Component } from "@angular/core";
import { SixtyfoldLineChartComponent } from "@sixtyfold/angular/line";
@Component({
standalone: true,
imports: [SixtyfoldLineChartComponent],
template: `
<sixtyfold-line-chart
[data]="data"
ariaLabel="Signal history"
(chartError)="reportError($event)"
/>
`,
})
export class Signals {
data = {
x: new Float64Array([0, 1, 2, 3]),
y: new Float64Array([3, 7, 4, 9]),
length: 4,
};
reportError(error: unknown) {
console.error(error);
}
}输入遵循共享表格并包含聚焦无障碍字段与 canvasAttributes。输出为 chartReady、chartError 和 stats;折线组件还会发出 seriesVisibilityChange。组件引用会公开其公共 chart。
仅在存在活跃订阅者能够接收 stats 输出时才启用统计收集。包括 take(1) 在内的最后一个订阅者退订后即停止,或在该输出完成、出现错误或被关闭时停止。
Angular 的应用构建器不会转换包自有的 Vite worker URL。将应用使用的引擎添加到构建目标的 assets 数组,位于 angular.json 中:
[
{ "glob": "**/*", "input": "node_modules/@sixtyfold/line/dist/assets", "output": "assets" },
{ "glob": "**/*", "input": "node_modules/@sixtyfold/stock/dist/assets", "output": "assets" }
]图表构建受 isPlatformBrowser 保护,因此 Angular SSR 不会触及浏览器全局对象。
Svelte
<script lang="ts">
import LineChart from "@sixtyfold/svelte/line";
const data = {
x: new Float64Array([0, 1, 2, 3]),
y: new Float64Array([3, 7, 4, 9]),
length: 4,
};
</script>
<LineChart
{data}
ariaLabel="Signal history"
onError={console.error}
/>chart 可通过绑定进行命令式访问。额外的 Svelte 属性为 onReady、onError、onStats、onSeriesVisibilityChange(用于折线图)、以及 canvasClass、canvasStyle、ariaLabel。
SolidJS
import { SixtyfoldLineChart } from "@sixtyfold/solid/line";
const data = {
x: new Float64Array([0, 1, 2, 3]),
y: new Float64Array([3, 7, 4, 9]),
length: 4,
};
export function Signals() {
return (
<SixtyfoldLineChart
data={data}
canvasProps={{ "aria-label": "Signal history" }}
chartRef={(chart) => console.log(chart)}
onError={console.error}
/>
);
}chartRef 接收已挂载的图表,随后在清理期间接收 null。canvasProps 传递原生画布属性。所有其他属性遵循共享契约。
完整示例
公共代码库包含每个受支持框架的最小响应式应用示例。每个示例展示了所需的包、数据结构、图表设置以及清理步骤,以重现折线图和股票图两种图表。