@kxliu/dvc-ui
@kxliu/dvc-ui
数据大屏(Data Visualization Container)组件库。以 1920 × 1080 为默认设计稿基准,内容按设计稿 px 尺寸开发,容器自动等比例缩放适配任意屏幕,无需为每种分辨率单独调试。
基于 Vue 3 + TypeScript,零运行时依赖(vue 为 peerDependency)。
特性
- 默认 1920×1080:与常见大屏设计稿基准一致,直接还原设计稿
- 自动等比例缩放:
ResizeObserver监听容器尺寸,等比缩放并居中,窗口变化实时适配 - 自定义背景:支持背景颜色、背景图片及尺寸 / 重复 / 定位配置
- 多缩放模式:
uniform(等比)/stretch(铺满拉伸)/none(原始尺寸),或手动指定比例 - 全屏能力:容器提供全屏方法,父级可直接调用,插槽内的子模块也可注入后调用
- TypeScript:全量类型定义,支持组件与
useScreenScale组合式 API
安装
npm install @kxliu/dvc-ui
# yarn add @kxliu/dvc-ui
# pnpm add @kxliu/dvc-ui
快速开始
引入组件与样式后即可使用:
<script setup lang="ts">
import { DvScreen } from '@kxliu/dvc-ui'
import '@kxliu/dvc-ui/dist/style.css'
</script>
<template>
<!-- 外层父容器需要有明确宽高,如 100vw / 100vh -->
<div class="screen-wrapper">
<DvScreen>
<!-- 内部一律按 1920 * 1080 设计稿尺寸写死像素 -->
<div class="board">安全生产监测大屏</div>
</DvScreen>
</div>
</template>
<style>
.screen-wrapper {
width: 100vw;
height: 100vh;
}
.board {
width: 1920px;
height: 1080px;
font-size: 48px;
}
</style>
注意:
DvScreen的外层父容器需要有明确宽高(如100vw / 100vh),否则无法计算缩放比例。样式文件通过import '@kxliu/dvc-ui/dist/style.css'引入,建议在应用入口处引用一次。
组件
DvScreen 大屏容器
默认插槽内容按 width × height 的固定设计稿尺寸渲染,外层容器自动等比缩放居中。
<template>
<DvScreen :width="1920" :height="1080" bg-color="#0b1e3f" bg-image="/bg.png">
<YourDashboard />
</DvScreen>
</template>
API
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| width | 设计稿宽度 | number |
1920 |
| height | 设计稿高度 | number |
1080 |
| scaleMode | 缩放模式:uniform 等比缩放;stretch 拉伸铺满;none 不缩放 |
ScaleMode |
uniform |
| scale | 手动缩放比例,大于 0 时自动适配失效 |
number |
- |
| bgColor | 背景颜色 | string |
- |
| bgImage | 背景图片地址 | string |
- |
| bgSize | 背景图尺寸 | CSSProperties['backgroundSize'] |
cover |
| bgRepeat | 背景图重复方式 | CSSProperties['backgroundRepeat'] |
no-repeat |
| bgPosition | 背景图定位 | CSSProperties['backgroundPosition'] |
center |
Events
| 事件名 | 回调参数 | 说明 |
|---|---|---|
| scale-change | (scale: number) => void |
缩放比例变化回调,可用于联动图表 / 地图实例 resize |
| fullscreen-change | (fullscreen: boolean) => void |
全屏状态变化回调,进入 / 退出全屏时触发(含 Esc 退出) |
Methods
通过组件实例(ref)调用:
| 方法名 | 类型 | 说明 |
|---|---|---|
| enterFullscreen | () => Promise<boolean> |
进入全屏,Promise 值表示是否已进入全屏 |
| exitFullscreen | () => Promise<boolean> |
退出全屏,Promise 值表示是否仍处于全屏 |
| toggleFullscreen | () => Promise<boolean> |
切换全屏 / 退出全屏 |
<script setup lang="ts">
import { DvScreen } from '@kxliu/dvc-ui'
const screen = ref<InstanceType<typeof DvScreen>>()
const onToggle = () => screen.value?.toggleFullscreen()
</script>
<template>
<DvScreen ref="screen" @fullscreen-change="(v) => console.log('fullscreen:', v)">
<YourDashboard />
</DvScreen>
</template>
Slots
| 名称 | 说明 |
|---|---|
| default | 大屏内容,内部一律按设计稿尺寸(width × height)书写 |
子模块调用全屏
插槽内的子模块(面板、图表卡片等)通过 useScreenFullscreen() 注入外层容器的全屏能力,
即可让子模块自身控制整个大屏的全屏 / 退出全屏:
<script setup lang="ts">
import { useScreenFullscreen } from '@kxliu/dvc-ui'
// 必须在 DvScreen 插槽内调用
const { isFullscreen, toggle } = useScreenFullscreen()
</script>
<template>
<button @click="toggle()">{{ isFullscreen ? '退出全屏' : '全屏' }}</button>
</template>
原生 Fullscreen API 不可用或被拒绝时(如页面嵌在未授权
allowfullscreen的 iframe 内), 会自动降级为容器固定定位铺满视口,保证全屏按钮始终可用。
useScreenScale
可脱离组件单独使用的组合式 API,返回 Ref<{ x, y }> 缩放比例。
import { useScreenScale } from '@kxliu/dvc-ui'
const root = ref<HTMLElement | null>(null)
const scale = useScreenScale(root, () => ({ width: 1920, height: 1080 }))
// scale.value.x / scale.value.y
useScreenFullscreen
在 DvScreen 插槽内的子模块中调用,获取外层容器的全屏能力,返回
{ isFullscreen, fallback, supported, enter, exit, toggle }:
import { useScreenFullscreen } from '@kxliu/dvc-ui'
// 需在 DvScreen 插槽内调用
const { isFullscreen, supported, enter, exit, toggle } = useScreenFullscreen()
| 字段 | 类型 | 说明 |
|---|---|---|
| isFullscreen | Readonly<Ref<boolean>> |
是否处于全屏状态 |
| fallback | Readonly<Ref<boolean>> |
是否使用降级全屏(原生 API 不可用时铺满视口) |
| supported | boolean |
是否支持原生全屏 API |
| enter / exit / toggle | () => Promise<boolean> |
进入 / 退出 / 切换全屏 |
DvHeaderNavy 深蓝科技风头部
深蓝科技风大屏头部,高度 80px,三栏布局:标题 / 左对齐导航(超出收纳进「更多」)/ 主页、清屏、全屏图标与实时时钟。
<script setup lang="ts">
import { DvScreen, DvHeaderNavy } from '@kxliu/dvc-ui'
const nav = [
{ label: '运营总览', key: 'overview' },
{ label: '综合治理', key: 'govern' },
]
</script>
<template>
<DvScreen bg-color="#030a1c">
<DvHeaderNavy title="深蓝科技风可视化数据大屏" :nav="nav" active="govern" />
<!-- 业务内容 -->
</DvScreen>
</template>
API
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| title | 主标题 | string |
'深蓝科技风可视化数据大屏' |
| nav | 导航列表,超出可用宽度时收纳进「更多」 | DvHeaderNavyNavItem[] |
[] |
| active | 当前选中的导航 key,默认第一项(v-model:active) |
string |
- |
| height | 头部高度(设计稿 px) | number |
80 |
| showHome / showClear / showFullscreen / showClock | 是否显示主页 / 清屏 / 全屏图标与时钟 | boolean |
true |
| cleared | 清屏状态(v-model:cleared) |
boolean |
false |
| theme | 主题预设(背景 + 主色),十套可选,见下方说明 | DvThemePresetKey |
'techBlue' |
| color | 主色覆盖(十六进制),其余颜色自动推断 | string |
取预设主色 |
| bgColor | 背景色覆盖(十六进制) | string |
取预设背景色 |
DvHeaderNavyNavItem:{ label: string; key?: string; disabled?: boolean }
Events
| 事件名 | 回调参数 | 说明 |
|---|---|---|
| nav-click | (item, index) => void |
点击导航项 |
| home | () => void |
点击主页图标 |
| clear | (cleared: boolean) => void |
点击清屏图标,参数为切换后的状态 |
| fullscreen-toggle | (fullscreen: boolean) => void |
全屏状态变化 |
全屏图标置于
DvScreen内时控制整个大屏;单独使用时全屏当前页面。
DvHeaderSafety 流动光效头部
左侧粗体渐变标题,中部斜切导航,右侧为 #extra 信息位、主页 / 清屏 / 全屏图标与时钟;底部为流光轨道。
<DvScreen bg-color="#0A1428">
<DvHeaderSafety title="安全生产监管平台" :nav="nav" v-model:active="active" theme="techBlue" />
</DvScreen>
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| title | 主标题(左侧) | string |
'安全生产监管平台' |
| nav | 导航列表,超出收进「更多」 | DvHeaderSafetyNavItem[] |
[] |
| active | 选中导航 key(v-model:active) |
string |
- |
| height | 头部高度(设计稿 px) | number |
80 |
| theme | 主题预设(背景 + 主色) | DvThemePresetKey |
'techBlue' |
| color / bgColor | 主色 / 背景色覆盖(十六进制),其余颜色自动推断 | string |
取预设 |
| showHome / showClear / showFullscreen / showClock | 图标与时钟显隐 | boolean |
true |
| cleared | 清屏状态(v-model:cleared) |
boolean |
false |
插槽:title、extra(图标左侧,最宽 360px,不裁剪溢出)。事件:nav-click、home、clear(cleared)、fullscreen-toggle(fullscreen)。
主题预设(theme,只设置背景与主色,其余发光、边框、高亮色自动推断):techBlue 科技蓝(默认)、commandBlue 指挥蓝、iceCyan 冰青、deepPurple 暗夜紫、cyberCyan 赛博青、ecoGreen 生态绿、matrixGreen 矩阵绿、financeBlue 金融蓝、redGold 红金、neonPink 霓虹粉。也可以通过 dvThemePresets 获取完整列表。
字体
大屏主标题(DvHeaderNavy、DvHeaderSafety)使用 阿里妈妈数黑体(Alimama ShuHeiTi),随包发布子集化的 woff2(dist/fonts/alimama-shuheiti-subset.woff2,约 677KB)。
- 子集范围:GB2312 全部汉字、ASCII 字母数字与常用中文标点。范围外的字符会回退到苹方 / 微软雅黑。
- 版权:阿里巴巴(中国)有限公司,版本 1.005(beta)。使用协议以阿里妈妈官方声明为准(https://fonts.alibabagroup.com/):可用于商业用途,不得单独出售字体文件,不得作为商标或 logo 字,不得二次创作。
DvHeaderGold的牌匾标题保留宋体系字体,不使用数黑体。
大屏表单组件
DvTreeSelect 树形下拉筛选
大屏风格的树形下拉,单选,任意层级节点均可选中,适用于行政区划、组织架构等筛选。支持搜索过滤、自定义字段名、显示完整路径。
<script setup lang="ts">
import { ref } from 'vue'
import { DvTreeSelect } from '@kxliu/dvc-ui'
// 接口字段为 name / code / sub 时,用 field-names 直接映射
const regions = [{ name: '浙江省', code: 33, sub: [{ name: '杭州市', code: 3301 }] }]
const value = ref<string | number | null>(3301)
</script>
<template>
<DvTreeSelect v-model="value" :options="regions" :field-names="{ label: 'name', value: 'code', children: 'sub' }" show-path />
</template>
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| modelValue | 选中值(v-model) |
string | number | null |
null |
| options | 树形数据 | DvTreeSelectNode[] |
[] |
| fieldNames | 自定义字段名 | { label?, value?, children?, disabled? } |
label / value / children / disabled |
| placeholder | 占位文字 | string |
'请选择' |
| clearable / filterable | 是否可清除 / 可搜索 | boolean |
true |
| defaultExpandAll | 打开时展开全部节点 | boolean |
false |
| showPath / pathSeparator | 触发框显示完整路径 / 分隔符 | boolean / string |
false / ' / ' |
| width / panelMaxHeight | 触发框宽度 / 面板最大高度(设计稿 px) | number |
200 / 280 |
| disabled | 是否禁用 | boolean |
false |
| theme | 主题预设(背景 + 主色) | DvThemePresetKey |
'techBlue' |
| color / bgColor | 主色 / 背景色覆盖(十六进制) | string |
取预设 |
事件:update:modelValue、change(value, node, path)、clear、visible-change(open)。
下拉面板就地渲染(随
DvScreen一起缩放),若祖先元素设置了overflow: hidden会裁剪面板;暂不含虚拟滚动,节点数过万请分级加载。
DvInput 文本框
大屏搜索条用文本框,支持可清除、最大长度、前后缀插槽;回车触发 search。
<DvInput v-model="keyword" placeholder="设备名称" :width="180" @search="onSearch" />
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| modelValue | 输入值(v-model) |
string |
'' |
| placeholder | 占位文字 | string |
'请输入' |
| clearable / disabled | 是否可清除 / 禁用 | boolean |
true / false |
| maxlength | 最大长度 | number |
- |
| width / color / bgColor | 宽度(设计稿 px)/ 主题色 / 背景色 | number / string |
180 / '#1ec8ff' / '#030a1c' |
插槽:prefix、suffix。事件:update:modelValue、change(value)、search(value)、clear。
DvSelect 下拉框
单选下拉,扁平选项,支持搜索(命中高亮)、禁用项、自定义字段名。
<DvSelect v-model="status" :options="[{ label: '正常', value: 'run' }, { label: '告警', value: 'warn', disabled: true }]" />
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| modelValue | 选中值(v-model) |
string | number | null |
null |
| options | 选项列表 | DvSelectOption[] |
[] |
| fieldNames | 自定义字段名 | { label?, value?, disabled? } |
label / value / disabled |
| placeholder / clearable / filterable | 占位 / 可清除 / 可搜索 | string / boolean |
'请选择' / true / true |
| width / panelMaxHeight | 触发框宽度 / 面板最大高度(设计稿 px) | number |
200 / 280 |
| disabled / color / bgColor | 禁用 / 主题色 / 背景色 | - | false / '#1ec8ff' / '#030a1c' |
事件:update:modelValue、change(value, option)、clear、visible-change(open)。
DvDatePicker 日期框
支持单日期、月、年以及范围选择,只使用原生 Date。值为字符串:日 YYYY-MM-DD、月 YYYY-MM、年 YYYY;范围为两个字符串组成的数组。
<DvDatePicker v-model="day" /> <!-- 2026-10-14 -->
<DvDatePicker v-model="month" type="month" /> <!-- 2026-10 -->
<DvDatePicker v-model="range" range min="2026-01-01" max="2026-12-31" /> <!-- ['2026-10-01', '2026-10-20'] -->
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| modelValue | 选中值(v-model) |
string | [string, string] | null |
null |
| type | 粒度 | 'date' | 'month' | 'year' |
'date' |
| range | 是否范围选择 | boolean |
false |
| min / max | 可选区间,格式与 type 一致 | string |
- |
| placeholder / clearable / disabled | 占位 / 可清除 / 禁用 | - | '请选择日期' / true / false |
| width / color / bgColor | 宽度(设计稿 px)/ 主题色 / 背景色 | - | 200 / '#1ec8ff' / '#030a1c' |
范围选择:先点开始日期,面板顶部提示「→ 请选择结束」,再点结束日期完成;结束早于开始会自动交换。「今天」按钮仅在单日期模式下显示。事件:update:modelValue、change(value)、clear、visible-change(open)。
DvSearchBar 搜索条
横排容器,表单项放在默认插槽里,右侧为「查询」「重置」。容器不持有表单值,重置时需在 reset 事件中自行清空。
<DvSearchBar @search="query" @reset="clearForm">
<DvInput v-model="keyword" :width="160" />
<DvSelect v-model="status" :options="statusOptions" :width="140" />
<DvDatePicker v-model="range" range :width="240" />
</DvSearchBar>
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| gap | 表单项间距(设计稿 px) | number |
16 |
| showReset | 是否显示重置 | boolean |
true |
| searchText / resetText | 按钮文字 | string |
'查询' / '重置' |
| color / bgColor | 主题色 / 背景色 | string |
'#1ec8ff' / '#030a1c' |
事件:search(点击查询,或在表单项内回车;打开下拉的回车不触发)、reset。
表单类组件的下拉面板同样是就地渲染,随
DvScreen缩放,祖先元素的overflow: hidden会裁剪面板。
生态与约定
- 内部图表、表格等子组件同样按设计稿 px 开发,放置于
DvScreen内即随大屏一起缩放 - 使用 ECharts 等 canvas 类库时,可通过
scale-change事件或useScreenScale同步触发实例resize
本地开发
# 仓库根目录
npm install
npm run dev # 启动文档站
npm run build # 构建组件库 + 文档站
发布
npm run publish:lib
License
MIT
Related Packages
Vue 3 component library for industrial dashboards, data visualization, forms and...
Composable Vue 3 SVG plot layers for building charts from small, focused compone...
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.1.5 | >=3.2.0 | MIT | |
| 0.1.4 | >=3.2.0 | MIT | |
| 0.1.2 | >=3.2.0 | MIT | |
| 0.1.0 | >=3.2.0 | MIT |
Pre-releases (1)
| Version | Released | License |
|---|---|---|
| 0.0.0-stage |