# lh-ui-vue2 **Repository Path**: lh-ui/vue2 ## Basic Information - **Project Name**: lh-ui-vue2 - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-09 - **Last Updated**: 2026-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # @lh-ui/vue2 **lh-ui 家族的 Vue 2.7 UI 层 —— 企业级国风水墨组件库。一个框架无关的 core,每个框架一个 UI 层。** 简体中文 | [English](./README.en-US.md) --- ## 这是什么 `@lh-ui/vue2` 是 [lh-ui](../README.zh-CN.md) 多端组件库家族的 **Vue 2.7** UI 层。家族的设计本意是 **一个 core,各框架只是 UI 层**:组件逻辑(状态机、校验、popper 计算、focus trap、i18n 等)只写一份, 作为纯函数存在于 [`@lh-ui/share`](../lh-ui-share);本库只写响应式胶水、SFC 模板、install 与命令式服务, **不持有任何 core / 样式 / 文案副本**。 - 唯一运行时依赖:`@lh-ui/share`;peer:`vue@^2.7.0` - 明确不支持 Vue 2.6 及以下、不支持 IE11 - 姐妹库:[`lh-ui-plus`](../lh-ui-plus)(Vue 3 旗舰版) ## 特性 - **一个 core,多端复用** —— 行为在 `@lh-ui/share` 里写一次、测一次,UI 层直接消费。 - **国风 / 水墨设计语言** —— 以 CSS 变量主题系统表达的东方水墨美学。 - **CSS 变量主题定制** —— 每个令牌都是 `--lh-*` 变量,可全局覆盖、按 `ConfigProvider` 覆盖, 或通过组件的 `themeVars` prop 覆盖;内置明暗模式与多套预设主题。 - **国际化(i18n)** —— 语言包随 `@lh-ui/share` 发布,内置 `zh-CN` 与 `en-US`。 - **Tree-shaking 友好** —— ESM / CJS / UMD 产物,支持按组件按需引入与 `.install()`。 - **TypeScript 优先** —— 全库 `strict: true`,产物附生成的类型声明。 ## 安装 ```bash npm install @lh-ui/vue2 # 或 pnpm add @lh-ui/vue2 # 或 yarn add @lh-ui/vue2 ``` `@lh-ui/vue2` 的唯一运行时依赖是 `@lh-ui/share`(共享层:core 纯函数 / theme / constants / locales / types / 组件样式源),会自动一并安装。 ### 私有服务器安装 若包托管在私有服务器而非公共 registry,按以下方式安装。 **方式一:tarball 直链**(服务器仅提供静态文件托管即可) ```bash npm install https://你的域名/pkg/lh-ui-vue2-1.0.0.tgz # 或 pnpm add https://你的域名/pkg/lh-ui-vue2-1.0.0.tgz # 或 yarn add https://你的域名/pkg/lh-ui-vue2-1.0.0.tgz ``` > tarball 直链方式下,`@lh-ui/share` 仍会从当前 registry 解析,需保证该包在公共 registry 或你的私有 registry 上可见。 **方式二:自建 registry**(如 Verdaccio,支持 semver 拉取与版本管理) 在项目根目录的 `.npmrc` 中按 scope 精准路由,不影响其他包的安装源: ```ini @lh-ui:registry=https://你的域名/ ``` 随后照常安装: ```bash pnpm add @lh-ui/vue2 ``` ## 快速上手 ### 全量引入 ```ts import Vue from 'vue' import LhUIVue2 from '@lh-ui/vue2' import '@lh-ui/vue2/theme.css' Vue.use(LhUIVue2) ``` ### 按需引入(推荐,利于 tree-shaking) ```ts import Vue from 'vue' import { LhButton, LhInput } from '@lh-ui/vue2' import '@lh-ui/vue2/theme.css' // 每组件样式单独引入 import '@lh-ui/vue2/style/button' import '@lh-ui/vue2/style/input' Vue.use(LhButton) Vue.use(LhInput) ``` ### 全局配置(可选) 用 `LhConfigProvider` 包裹应用根,统一配置尺寸、语言与主题变量: ```vue ``` ## 主题 - 令牌命名统一为 `--lh-*`,唯一源在 `@lh-ui/share/styles/theme/`,组件不得自行声明。 - **暗色模式**:引入 `@lh-ui/vue2/theme-dark.css` 并设 ``(亦支持 `.dark` class)。 - **预设主题**:`usePresetTheme`(青花瓷、松花绿等),`useLhTheme` 负责明暗切换并 localStorage 持久化。 - **局部覆盖优先级**:组件 `themeVars` prop > `ConfigProvider.componentTheme[name]` > 全局 `themeVars`。 ## 事件名约定(重要) 本库组件事件名为 **camelCase**(如 `@sort-change` 不可用,应写 `@sortChange`、`@rowClick`、`@update:expandedKeys`): - **SFC 模板 / JSX / render 函数**中正常工作(推荐用法); - **in-DOM 模板**(直接写在 HTML 里的模板)会被浏览器转小写导致事件失联——请避免 in-DOM 模板,或用 `.sync` / `v-on` 对象语法(`v-on` 对象的键不受浏览器小写化影响); - 双向绑定统一走 `.sync`(编译器会自动 camel 化 `update:xxx`),不受此限制。 ## 组件 58 个组件,六大组(与文档站导航一致,完整清单见[在线文档](https://lh-ui.lhgb.top/vue2/)): | 分类 | 组件 | | --- | --- | | 基础 | ConfigProvider、Button、Icon、Tag、Divider、Space、Card | | 布局 | Grid(Row/Col)、Layout、Collapse、Descriptions | | 数据录入 | Input、InputNumber、Select、Checkbox、CheckboxGroup、Radio、RadioGroup、Switch、Slider、Rate、Segmented、Form、FormItem、Upload、Transfer、TimePicker、DatePicker、Cascader、AutoComplete | | 数据展示 | Badge、Avatar、Spin、Table、Tag、Skeleton、Empty、Statistic、Timeline、Image、Carousel、Collapse、Descriptions、Tree、TreeSelect | | 反馈 | Alert、Progress、Message、Notification、Loading、Dialog、Drawer、Tooltip、Popover、Popconfirm、Image | | 导航 | Breadcrumb、Pagination、Tabs、Steps、Dropdown、Menu、Anchor、Backtop、Affix | ## 开发 | 任务 | 命令 | | --- | --- | | 开发沙箱(端口 5174) | `pnpm dev` | | 文档站点 | `pnpm docs:dev` | | 单测 / 监听 | `pnpm test` / `pnpm test:watch` | | Lint / 自动修复 | `pnpm lint` / `pnpm lint:fix` | | 类型检查 | `pnpm typecheck` | | 构建(esm + cjs + umd + styles + dts) | `pnpm build` | | 发版说明 | `pnpm changeset` | 文档站点基于 VuePress 1.x(Vue 2.7 原生),组件示例由 DemoBlock 直接活渲染 `dev/demos/index.ts` 注册表(与 dev 沙箱同源),docs:dev 下改 demo 即时热更新。 ## 发布 发布侧统一用 `npm publish`(pnpm 无 publish 命令,yarn v2+ 已移除);包管理器差异只在消费侧安装。 **发版顺序硬约束:`@lh-ui/share` 先发版**(`dependencies` 语义版本已发布才可发)。 ```bash # 0. 一次性:登录 npm,并拥有 @lh-ui scope(在 npm 创建 organization 或个人 scope) npm login # 1. 先发 share(硬约束) cd ../lh-ui-share pnpm build && pnpm verify:dts && pnpm verify:styles npm publish --access public # 发布 @lh-ui/share@0.1.0 # 2. 再发 vue2 cd ../lh-ui-vue2 pnpm install # 重新解析 @lh-ui/share ^0.1.0,生成新 pnpm-lock.yaml pnpm changeset version # 消费 changeset → 打版本号 + 生成 CHANGELOG.md pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm verify:dts # 完整回归 npm pack --dry-run # 检查 files 白名单 npm publish --access public # 触发 prepublishOnly(build + verify:dts) ``` > **版本协调陷阱**:share 仓库可能还有未消费的 changeset。**发版前不要在 share 仓库跑 > `pnpm changeset version`**——那会把 share bump 到 0.2.0,而本库依赖锁死在 `^0.1.0` > (semver `^0.1.0` = `>=0.1.0 <0.2.0`,major 为 0 时 caret 锁死 minor),会匹配不到。 > 正确做法:share 直接发当前已 versioned 的 0.1.0;待那批 changeset 消费出 0.2.0 时, > 本库同步把依赖改为 `^0.2.0` + 回归 + 再发版。 发布私有服务器(如 Verdaccio)时加 `--registry` 指向私有源,或先把 `npm pack` 产出的 `lh-ui-vue2-x.y.z.tgz` 上传到服务器静态目录后按上文「私有服务器安装」使用。 ## 约定与规范 - 统一使用 pnpm;注释、文档、提交信息一律中文。 - 类名遵循 BEM `lh-*`;CSS 变量一律来自 share 的 theme 源。 - 每次改动附 `.changeset/*.md` 发版说明;**发版顺序硬约束:`@lh-ui/share` 先发版**。 - 动手前请先阅读 [AGENTS.md](./AGENTS.md) —— 含 Vue2 红线(响应式、无 Teleport 的弹层方案、 过渡类名双写、透传写法等)与完整目录说明。 ## 文档 - 在线文档: - 家族总纲:[`docs/多端组件库规划.md`](../docs/多端组件库规划.md) - Vue2 细节:[`docs/vue2/vue2组件库计划.md`](../docs/vue2/vue2组件库计划.md)