# @vtj/charts 图表库 — AI 使用指南 > 本文档帮助 AI 理解 `@vtj/charts` 图表库的构成、组件属性和在 Vue 组件中的使用规范。 --- ## 一、库概述 `@vtj/charts` 是基于 ECharts 5.x 封装的 Vue 3 图表组件库,提供开箱即用的图表组件和组合式 API。 | 内容 | 说明 | | ---------- | --------------------------------------------- | | 基础依赖 | `echarts` `~5.6.0` | | 核心组件 | `XChart`(通用图表)、`XMapChart`(地图图表) | | 组合式 API | `useChart`、`useMapChart` | | 自动特性 | 响应式 option、自动 resize、事件代理 | --- ## 二、安装与注册 ### 2.1 安装依赖 ```json { "dependencies": { "@vtj/charts": "latest" } } ``` ### 2.2 全局注册(推荐) ```typescript import { createApp } from 'vue'; import Charts from '@vtj/charts'; const app = createApp(App); app.use(Charts); // 注册 XChart、XMapChart 为全局组件 ``` 全局注册后,模板中可直接使用 `` 和 `` 标签。 ### 2.3 按需导入 ```vue ``` --- ## 三、XChart 通用图表组件 ### 3.1 Props | 属性 | 类型 | 默认值 | 说明 | | -------- | --------------- | ----------- | -------------------------- | | `width` | `string` | `'100%'` | 图表容器宽度 | | `height` | `string` | `'400px'` | 图表容器高度 | | `option` | `EChartsOption` | `undefined` | ECharts 配置项,响应式更新 | ### 3.2 Exposed 属性 通过模板 ref 可访问以下属性: | 名称 | 类型 | 说明 | | ----------- | ---------------------------- | --------------------- | | `elRef` | `HTMLElement` | 图表容器 DOM 引用 | | `option` | `EChartsOption` | 当前 option | | `instance` | `Ref` | ECharts 实例引用 | | `getEChart` | `() => ECharts \| undefined` | 获取 ECharts 实例方法 | ### 3.3 事件 组件接收 ECharts 事件监听器,通过 Vue 的 `v-on` 或属性传递,支持以下格式: - **kebab-case 事件名:** `:on-click="handler"`、`:on-dblclick="handler"` - 引擎自动转换 kebab-case 事件名为 camelCase 后注册到 ECharts 实例 ### 3.4 基础用法 ```vue ``` ### 3.5 动态更新 Option `option` 是响应式属性,变更后图表自动更新: ```vue ``` ### 3.6 通过 ref 访问 ECharts 实例 ```vue ``` --- ## 四、XMapChart 地图图表组件 ### 4.1 Props | 属性 | 类型 | 默认值 | 说明 | | --------- | ------------------ | ----------------------------------------------------------------- | ------------------------------------ | | `geoJson` | `string \| object` | `'https://unpkg.com/vtj-geojson@0.1.3/geo/100000/100000.geoJson'` | GeoJSON 数据或 URL,默认中国省级地图 | | `name` | `string` | `'china'` | 地图注册名称 | 其余 ECharts option 通过 `v-bind="$attrs"` 透传,需在 option 中配置地图相关的 series 或 geo。 ### 4.2 Emits | 事件名 | 参数 | 说明 | | ------- | --------- | ---------------------- | | `ready` | `geoJSON` | 地图数据加载完成后触发 | ### 4.3 Exposed 属性 | 名称 | 类型 | 说明 | | ------------- | ----------------------------------- | ------------------------ | | `chartRef` | `XChart 实例` | 内部 XChart 组件引用 | | `instance` | `ComputedRef` | 计算属性,ECharts 实例 | | `option` | `Ref` | 当前 option | | `getEChart` | `() => ECharts \| undefined` | 获取 ECharts 实例方法 | | `getChartRef` | `() => XChart 实例` | 获取内部 XChart 组件引用 | | `geoJSON` | `ShallowRef` | 已加载的 GeoJSON 数据 | ### 4.4 基础用法 提供 `geoJson` 数据源后,组件自动注册地图并通过 `v-bind="$attrs"` 透传的 option 渲染: ```vue ``` ### 4.5 使用自定义 GeoJSON ```vue ``` ### 4.6 使用 geo 组件而非 series-map 若配置 `option.geo` 而非 `series-map`,组件会自动将 `option.geo.map` 设为当前 `name`: ```vue ``` --- ## 五、组合式 API ### 5.1 useChart 用于在非组件场景下创建 ECharts 图表实例: ```typescript import { ref, onMounted } from 'vue'; import { useChart } from '@vtj/charts'; import type { ChartOption } from '@vtj/charts'; // 模板中:
const chartContainer = ref(); const chartOption = ref({ xAxis: { type: 'category', data: ['A', 'B', 'C'] }, yAxis: { type: 'value' }, series: [{ type: 'line', data: [10, 20, 15] }] }); const { instance, getEChart } = useChart(chartContainer, chartOption, {}); onMounted(() => { console.log('ECharts 实例:', getEChart()); }); ``` **参数说明:** | 参数 | 类型 | 说明 | | -------- | --------------------------------- | ---------------------------------- | | `el` | `MaybeRef` | 图表容器元素引用 | | `option` | `Ref` | ECharts option 响应式引用 | | `attrs` | `Record` | 事件监听器(如 `{ onClick: fn }`) | **返回值:** | 名称 | 类型 | 说明 | | ----------- | ---------------------------- | ----------------------- | | `instance` | `Ref` | ECharts 实例 | | `getEChart` | `() => ECharts \| undefined` | 获取 ECharts 实例的方法 | **自动能力:** - `onMounted` 时初始化 ECharts 实例并注册事件和 option - `option` 变化时自动 `setOption` - `useResizeObserver` 自动 resize(防抖 150ms) - `onUnmounted` 时自动 dispose 实例 ### 5.2 useMapChart 用于自定义地图场景: ```typescript import { ref } from 'vue'; import { useMapChart } from '@vtj/charts'; const mapName = ref('china'); const geoJson = ref('https://unpkg.com/vtj-geojson@0.1.3/geo/100000/100000.geoJson'); const { chartRef, geoJSON, option } = useMapChart(mapName, geoJson, { option: { series: [{ type: 'map', map: 'china', data: [...] }] } }); ``` **参数说明:** | 参数 | 类型 | 说明 | | --------- | --------------------- | ------------------------ | | `name` | `Ref` | 地图注册名称 | | `geoJson` | `Ref` | GeoJSON 数据或 URL | | `attrs` | `Record` | 透传属性(含 option 等) | **返回值:** | 名称 | 类型 | 说明 | | ---------- | ------------------ | --------------------- | | `chartRef` | `Ref` | 内部 XChart 组件引用 | | `geoJSON` | `ShallowRef` | 已加载的 GeoJSON 数据 | | `option` | `Ref` | 合并后的 option | **自动能力:** - name / geoJson 变化时自动重新加载和注册地图 - 加载过程中自动显示 / 隐藏 ECharts loading 状态 - 自动将 option 中的 series-map 和 geo.map 设为当前 name --- ## 六、VTJ Composition API 完整示例 ### 6.1 通用图表 - 柱状图 + 折线图混合 ```vue ``` ### 6.2 饼图 ```vue ``` ### 6.3 地图图表 ```vue ``` ### 6.4 异步数据加载 ```vue ``` --- ## 七、图表类型快速参考 以下列出 ECharts 支持的常用图表配置模式,可直接在 `option.series` 中使用: ### 7.1 折线图 ```typescript { type: 'line', data: [10, 20, 15], smooth: true, areaStyle: {} } ``` ### 7.2 柱状图 ```typescript { type: 'bar', data: [10, 20, 15], barWidth: '40%' } ``` ### 7.3 饼图 ```typescript { type: 'pie', data: [{ value: 100, name: 'A' }], radius: '50%' } ``` ### 7.4 散点图 ```typescript { type: 'scatter', data: [[10, 20], [15, 25], [20, 15]] } ``` ### 7.5 雷达图 ```typescript { type: 'radar', data: [{ value: [80, 90, 70, 85], name: '预算分配' }] } // 需配合 radar 组件: // radar: { indicator: [{ name: '销售额', max: 100 }, ...] } ``` ### 7.6 地图 ```typescript { type: 'map', map: 'china', data: [{ name: '广东省', value: 800 }] } ``` --- ## 八、注意事项 1. **option 必须为响应式:** 推荐使用 `ref` 包裹 option 对象,使其变更时自动触发图表更新 2. **option 深度监听:** 引擎内部对 option 进行了 `{ deep: true }` 的 watch,修改深层属性也会触发更新 3. **高度设默认值:** `XChart` 默认高度 `400px`,务必根据需要显式设置 `height` 4. **地图需 GeoJSON:** `XMapChart` 内置默认中国省级地图 GeoJSON URL,使用其他地图需提供自定义 GeoJSON 5. **事件名 kebab-case:** 事件属性以 `:on-` 开头、kebab-case 命名,如 `:on-click="handler"`、`:on-dblclick="handler"` 6. **自动 resize:** 组件内部已集成 `ResizeObserver`,容器尺寸变化时图表自动 resize 7. **生命周期管理:** 组件卸载时自动 dispose ECharts 实例,无需手动清理 8. **类型导入:** 需要 ECharts 类型时可从 `@vtj/charts` 导入 `ChartOption` 和 `EChartsInstance` 9. **无需直接操作 echarts 实例:** 大多数场景通过 `:option` 响应式更新即可,避免直接调用 `setOption` 10. **无需耗时搜索 ECharts 配置:** ECharts 的 option 配置语法遵循官方的 ECharts Option 规范,上述示例覆盖了最常用的图表类型和模式 --- ## 九、VTJ 设计器 Composition API 规范示例 > 以下示例展示在 VTJ 设计器中使用 Composition API(` ``` ### 9.2 GeoJSON 地图层级路径说明 `XMapChart` 的 `geo-json` 属性支持按行政区划编码逐级获取 GeoJSON 数据,当更换 `geo-json` 路径时需同步更新 `name` 属性: | 层级 | 示例 GeoJSON URL | `name` 值 | 说明 | | -------- | ------------------------------------------------------------------------- | ---------- | ---------------- | | 全国 | `https://unpkg.com/vtj-geojson@0.1.3/geo/100000.geoJson` | `'100000'` | 中国全国地图 | | 省级 | `https://unpkg.com/vtj-geojson@0.1.3/geo/100000/440000.geoJson` | `'440000'` | 广东省地图 | | 市级 | `https://unpkg.com/vtj-geojson@0.1.3/geo/100000/440000/440100.geoJson` | `'440100'` | 广州市地图 | | 省级含子 | `https://unpkg.com/vtj-geojson@0.1.3/geo/100000/100000.geoJson`(默认值) | `'china'` | 中国省级区划地图 | ```vue ``` > **注意:** 以上示例中的 `state` 和 `provider` 为 VTJ 设计器组件的标准模板代码,请保留。echarts 原始对象按需导入使用。