Appearance
TrendChart 迷你趋势图
用于展示小型趋势、指标变化和概览图表。组件默认渲染为 100% 宽 × 60px 高的迷你图,适合放在仪表盘卡片、表格单元格和指标标签中。
与其它图表的分工
TrendChart 是迷你图:无坐标轴、无图例、单条曲线,用于卡片角落的形态提示。需要坐标轴读数或多系列对比时用 LineChart 折线图;完整的选择指引见图表总览。
基础用法
vue
<template>
<x-trend-chart :dataset="dataset" status="success" />
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
</script>不设置 height 时组件使用 60px 默认高度,无需外部容器样式。
尺寸与权重
迷你图的推荐高度是 40 ~ 60px。高度超过 80px 后曲线会显得空旷,观感更接近「一条没有坐标轴的大图」而不是角标趋势;这种场景应该改用 LineChart 折线图。
vue
<template>
<x-trend-chart :dataset="dataset" :height="40" />
<x-trend-chart :dataset="dataset" :height="60" />
<x-trend-chart :dataset="dataset" :height="80" />
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
</script>height 与 width 接受数字(按 px 处理)或 CSS 值。数字宽度下组件不再撑满父容器,适合固定尺寸的卡片角标。
卡片场景
迷你图的实际用法是在指标卡里当角标:卡片给数值,图表给形态。下面的例子把宽度收到 120px 左右,与数值并排。
今日请求量
12,480
平均延迟
218 ms
vue
<template>
<div class="metric-card">
<div>
<div class="metric-card-label">今日请求量</div>
<div class="metric-card-value">12,480</div>
</div>
<x-trend-chart :dataset="dataset" status="success" :height="40" :width="120" />
</div>
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
</script>
<style scoped>
.metric-card {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
width: 280px;
max-width: 100%;
padding: 12px 16px;
border: 1px solid var(--x-color-border-subtle);
border-radius: 8px;
}
.metric-card-value {
font-size: 20px;
font-weight: 500;
}
.metric-card-label {
color: var(--x-color-text-3);
font-size: 12px;
}
</style>状态主题
vue
<template>
<x-trend-chart :dataset="dataset" status="primary" :height="56" />
<x-trend-chart :dataset="dataset" status="warning" :height="56" />
<x-trend-chart :dataset="dataset" status="danger" :height="56" />
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
</script>不传 status 时使用主色;info 为中性次要指标语义,适合同一卡片里弱化的对比项。
曲线与填充
vue
<template>
<x-trend-chart :dataset="dataset" :smooth="false" :height="56" />
<x-trend-chart :dataset="dataset" :fill="false" :height="56" />
<x-trend-chart :dataset="dataset" :stroke="false" :height="56" />
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
</script>填充默认使用由描边色到透明的渐变;需要纯色块时通过 theme.fill.type="solid" 切换。
数据点显示
vue
<template>
<!-- 默认 auto:点距不足时自动隐藏普通点;show-points 强制常显 -->
<div class="chart-320">
<x-trend-chart :dataset="denseDataset" :height="80" />
</div>
<div class="chart-320">
<x-trend-chart :dataset="denseDataset" show-points :height="80" />
</div>
<div class="chart-320">
<x-trend-chart :dataset="dataset" :show-points="false" :height="80" />
</div>
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
const denseDataset = [
12, 18, 14, 24, 32, 28, 36, 42, 30, 22, 26, 34,
18, 26, 22, 30, 38, 34, 40, 46, 36, 28, 32, 44,
];
/* 延迟趋势:整体平稳、尾部抬头,用于卡片示例 */
const latencyDataset = [196, 205, 188, 214, 202, 221, 208, 236];
</script>
<style scoped>
.chart-320 {
width: 320px;
max-width: 100%;
}
</style>show-points 为 auto(默认)时,相邻点横向间距小于 18px 就自动隐藏普通点,避免小尺寸下点挤成一团;true 强制常显(点数多且空间窄时会显得拥挤,如上方第二例),false 完全隐藏。hover 时激活点始终可见。
纯形态,不带坐标轴
TrendChart 的 grid 与 labels 已废弃(1.8.0 起不渲染任何内容,props 声明保留到 2.0.0 移除)。这是有意的:带网格和坐标文字的图属于 LineChart 折线图,那里有类目轴、数值轴、多系列、图例和悬浮读数。
迷你图的职责只有一个——让用户一眼看出「在涨还是在跌、有没有异常尖峰」。加上坐标轴后,40~60px 的高度里曲线会被压扁,而标签又读不清,反而不如直接用折线图。
需要读数时:用 LineChart;想在这个尺寸下看具体数值,开 tooltip 悬浮即可(提示气泡会贴边收敛,不会被裁)。
交互事件
等待鼠标移动
vue
<template>
<x-trend-chart
:dataset="dataset"
interactive
tooltip
:height="120"
:tooltip-formatter="formatVolume"
@mouse-move="handleMouseMove"
/>
<p>{{ hoverInfo }}</p>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
const hoverInfo = ref('等待鼠标移动');
// tooltip 文本格式化函数放在 script 中,避免模板内联类型注解
const formatVolume = (value: number) => `${value} 单`;
const handleMouseMove = (event: { index: number; data: number } | null) => {
hoverInfo.value = event ? `index: ${event.index}, value: ${event.data}` : '已离开';
};
</script>tooltip 开启后 hover 会在激活点旁显示 tooltipFormatter 的返回值,无需业务自己画提示层;激活竖线只从当前数据点连到绘图区底部,不会穿过整张图表;mouse-move 在数据变化导致激活点越界时会补发 null,业务侧不用额外兜底。
数值区间
vue
<template>
<x-trend-chart :dataset="dataset" :min="20" :max="40" interactive tooltip />
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
</script>min / max 传入后即锁定可见区间,超出范围的数据会被裁剪在绘图区之外。适合「只看某个区间」或让同一组卡片统一 Y 轴口径。
自定义主题
vue
<template>
<x-trend-chart :dataset="dataset" :theme="customTheme" />
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
const customTheme = {
// 统一基础色:未单独指定颜色的层级都会继承
color: '#7c3aed',
// 默认权重:描边 1.5px、点半径 2px、激活竖线 1px
stroke: { width: 2 },
fill: { type: 'gradient', opacity: 0.16 },
// point.width 实际为半径
point: { width: 3 },
axisLine: { width: 1, opacity: 0.7 },
};
</script>主题会与状态主题按层级合并:只写 color 即可统一换色,单独设置 stroke.color 等字段可覆盖单层。
边界数据
等值数据
单点数据
空数据
vue
<template>
<x-trend-chart :dataset="[10, 10, 10, 10, 10]" :height="56" />
<x-trend-chart :dataset="[16]" :height="56" />
<x-trend-chart :dataset="[]" :height="56" />
</template>响应式尺寸
容器尺寸变化(侧边栏折叠、ResizeBox 拖动、Tab 切换)会由 ResizeObserver 自动触发重算,图表的点位和标签不会错位。拖动下面的右边缘或底边缘查看效果。
vue
<template>
<x-resize-box
v-model:width="resizeWidth"
v-model:height="resizeHeight"
:min-width="120"
:max-width="480"
:directions="['right', 'bottom']"
class="chart-box"
>
<x-trend-chart :dataset="dataset" :height="'100%'" status="primary" />
</x-resize-box>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
const resizeWidth = ref(320);
const resizeHeight = ref(56);
</script>
<style scoped>
.chart-box {
border: 1px solid var(--x-color-border-subtle);
border-radius: 6px;
}
</style>height 传 '100%' 时图表跟随父容器高度;容器尺寸变化无需监听 window.resize。
无障碍
vue
<template>
<x-trend-chart
:dataset="dataset"
:height="56"
aria-label="近七日订单量趋势"
interactive
tooltip
/>
</template>
<script setup lang="ts">
const dataset = [12, 18, 14, 24, 32, 28, 36, 42];
</script>设置 aria-label 后根节点会输出 role="img" 与可访问名称,屏幕阅读器可以播报图表用途。
按需导入
ts
import { TrendChart } from 'x-next';Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
dataset | 趋势数据集,非有限数字会被忽略 | number[] | [] |
status | 状态主题 | 'primary' | 'success' | 'warning' | 'strong' | 'danger' | 'info' | 'primary' |
grid | 已废弃(1.8.0 起不渲染),保留声明避免升级报错 | object | null | null |
labels | 已废弃(1.8.0 起不渲染),保留声明避免升级报错 | object | null | null |
height | 图表高度,数字按 px 处理 | number | string | 60 |
width | 图表宽度,数字按 px 处理 | number | string | '100%' |
max | 可见区间上界,传入后锁定并裁剪超出部分 | number | 数据最大值 |
min | 可见区间下界,传入后锁定并裁剪超出部分 | number | 数据最小值 |
padding | 绘制边距,支持 1-4 个非负数字字符串或单个非负数字;只表达呼吸空间,标签会自动排在它内侧 | string | number | '5' |
smooth | 是否使用平滑曲线 | boolean | true |
stroke | 是否渲染描边 | boolean | true |
fill | 是否渲染填充 | boolean | true |
showPoints | 数据点显示策略,auto 在点距不足时只保留激活点 | boolean | 'auto' | 'auto' |
interactive | 是否开启鼠标交互 | boolean | false |
tooltip | 是否在 hover 时显示数值提示 | boolean | false |
tooltipFormatter | 数值提示文本格式化 | (value: number) => string | (value) => \${value}`` |
ariaLabel | 无障碍名称,设置后输出 role="img" | string | - |
theme | 自定义主题,会与状态主题按层级合并 | Theme | {} |
Theme
| 字段 | 说明 | 类型 |
|---|---|---|
color | 基础色,未单独指定颜色的层级(描边、填充、点、激活线)都会继承 | string |
stroke.width | 描边宽度,默认 1.5 | number |
stroke.color | 描边颜色 | string |
stroke.opacity | 描边透明度 | number |
fill.type | 填充类型,gradient 由描边色渐变到透明 | 'solid' | 'gradient' |
fill.color | 填充颜色 | string |
fill.opacity | 填充透明度,gradient 时为峰值透明度 | number |
point.width | 数据点半径(激活时 +1),默认 2 | number |
point.color | 数据点颜色 | string |
point.opacity | 数据点透明度 | number |
axisLine.color | 交互激活竖线颜色 | string |
axisLine.width | 交互激活竖线宽度,默认 1 | number |
axisLine.opacity | 交互激活竖线透明度 | number |
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
mouse-move | 鼠标移动到图表时触发,interactive=true 时使用;离开或激活点失效时回调 null | { index: number; data: number } | null |
使用说明
- 默认高度 60px,无需外部容器样式;需要更高时通过
height指定。 - 不带网格与坐标轴(
grid/labels自 1.8.0 起废弃、不再渲染):需要读数请改用 LineChart,或在当前尺寸下开tooltip。 - 空数组会渲染空态文案,不会抛错。
- 单点数据会渲染为一个点,且不渲染填充。
- 所有值相同时,趋势线绘制在图表中线。
min/max锁定数据域后,超出部分被裁剪而非扩展区间,适合区间放大与多图对齐口径。- 容器尺寸变化会自动重算;初始隐藏在
display: none中的图表,在变为可见后同样会重新计算尺寸。