@cimom-ui/standard-ui

中文文档
1.1.24发布于 2026/11/09MITCommonJS近 30 天下载 2319

标准组件库:基于 Vue 2.6 + Element UI 2.x + vxe-table 3.24.x 的通用业务组件(按钮、弹窗、筛选栏、表单、表格、树、分割条等)

原始使用文档
文档目录30 节
  1. 安装
  2. 注册方法
  3. 全局注册(推荐)
  4. 局部注册
  5. 注意事项
  6. 组件总览
  7. 组件说明
  8. StandardButton 标准按钮
  9. StandardInput 标准输入框
  10. StandardSelect 标准下拉
  11. StandardTimePick 标准时间选择
  12. StandardDialog 标准弹窗
  13. StandardContainer 标准布局容器
  14. StandardFilterbar 标准筛选栏
  15. StandardForm / StandardFormItem 标准表单
  16. StandardHalfArea 标准半区
  17. StandardPage 标准页面骨架
  18. StandardSplitter 标准分割条
  19. StandardTable 标准表格
  20. StandardTabs / StandardTabPane 标准页签
  21. StandardTree 标准树
  22. 页面骨架
  23. 标准列表页(listPage)
  24. 多层级树表格页(multiListPage)
  25. 左右联动页(linkPage)
  26. 树 + 列表联动页(treeLinkPage)
  27. 工具栏查询列表页(toolbarQueryPage)
  28. 开发与构建
  29. vxe-table 3.24 说明
  30. 发布

@cimom-ui/standard-ui

标准组件库:基于 Vue 2.6 + Element UI 2.x + vxe-table 3.24.x 的通用业务组件,供其它项目复用。

共 14 个顶层组件。StandardForm、StandardFilterbar、StandardTable、StandardTabs 会连带注册子组件。StandardAdvancedQuery 只给筛选栏的「高级查询」使用,不单独暴露。

属性表里的名字是模板写法(kebab-case),与代码里的 camelCase 一一对应,例如 number-only 对应 numberOnly。事件名也是 kebab-case。

安装

npm i @cimom-ui/standard-ui

使用方必须先安装并注册这些依赖:

包版本要求说明
vue^2.6.0
element-ui^2.15.0全部组件依赖,并引入 element-ui/lib/theme-chalk/index.css
vxe-table^3.24.0仅 StandardTable 依赖,并引入 vxe-table/lib/style.css
@vxe-ui/core^3.4.24vxe-table 3.24 的运行时依赖。本包 dependencies 已声明,随本包安装
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'

Vue.use(ElementUI)
Vue.use(VXETable)

组件自身的样式已经打进 JS 产物,使用方不用再引一份组件 css。vxe-table 的样式仍由使用方引入。

注册方法

全局注册(推荐)

入口注册一次后,页面直接写标签,不用再 import。

// src/main.js
import StandardComponents from '@cimom-ui/standard-ui'
import axios from '@/util/api.request'

Vue.use(StandardComponents, {
  // 模块编码,和页面编码、表格编码一起定位表头配置
  moduleCode: process.env.VUE_APP_MODULE_CODE,
  // 业务项目自己的请求方法。接口路径固定,IP 和端口来自该方法的 baseURL
  request: (config) => axios.request(config)
})

Vue.use 会注册全部顶层组件,并连带注册这些子组件:

父组件一并注册的标签
StandardFilterbar<standard-filterbar-item>
StandardForm<standard-form-item>
StandardTable<standard-column>、<standard-toolbar-left>、<standard-toolbar-right>、<standard-toolbar-query>、<standard-toolbar-empty>、<standard-footer-left>、<standard-footer-right>、<standard-footer-empty>
StandardTabs<standard-tab-pane>

局部注册

lib 构建产物只保留默认导出,组件挂在默认导出对象上。子组件挂在父组件的静态属性上。

import StandardComponents from '@cimom-ui/standard-ui'

export default {
  components: {
    'standard-table': StandardComponents.StandardTable,
    'standard-column': StandardComponents.StandardTable.Column,
    'standard-toolbar-left': StandardComponents.StandardTable.ToolbarLeft,
    'standard-toolbar-right': StandardComponents.StandardTable.ToolbarRight,
    'standard-toolbar-query': StandardComponents.StandardTable.ToolbarQuery,
    'standard-footer-right': StandardComponents.StandardTable.FooterRight,
    'standard-filterbar': StandardComponents.StandardFilterbar,
    'standard-filterbar-item': StandardComponents.StandardFilterbar.Item,
    'standard-form': StandardComponents.StandardForm,
    'standard-form-item': StandardComponents.StandardForm.Item,
    'standard-tabs': StandardComponents.StandardTabs,
    'standard-tab-pane': StandardComponents.StandardTabs.TabPane
  }
}

局部注册不会走库的 install,表头配置的 moduleCode 和 request 不会自动注入。需要「调整」列配置持久化时,使用全局注册。

注意事项

  • 先 Vue.use(ElementUI)、Vue.use(VXETable),再注册本库。按钮、输入框、下拉、时间选择内部固定 size="mini",页面传 size 不会改掉。
  • 全局注册请带上 moduleCode 和 request。表格渲染从浏览器本地存储 TableSetting 读取表头,按「模块编码/页面编码/表格编码」取对应 CLAYOUT,不再逐表调用 GetConfig。保存和恢复默认仍调用 /api/Migration/UserTableColumn/SaveConfig、ResetConfig,成功后回写 TableSetting 里的对应项。GetConfig 不接收模块、页面、表格参数,返回当前用户全部布局,由其它程序调用后写入 TableSetting。没传 request 时不访问服务端,仍可读已有缓存。同一页面里每个表格的 table-code 必须唯一;不传时用组件 ref,ref 也没有则不读写配置。page-code 不传时用当前路由 name,没有 name 时用去掉查询参数的 path。
  • <standard-filterbar> 必须接 @search,否则校验失败、整块不渲染,并在控制台输出 [StandardFilterbar] 错误。筛选值写在传入对象的属性上,运行中不要整体替换 searchBar 或 searchVariable。
  • 筛选栏默认插槽里只认 <standard-filterbar-item>。插槽项排在 searchCondition 前面,一个插槽项算一条条件。首行放不下的进「更多」或「高级查询」。isMain 可以写在配置里,不再决定谁在首行。
  • <standard-dialog> 的 @confirm 不关闭弹窗,业务成功后再改 v-model。点击遮罩默认不关闭。标题栏默认可拖拽,再次打开回到居中。
  • <standard-toolbar-query> 只能放在 <standard-toolbar-right> 里面。放错位置不渲染,并 console.warn。右上角「调整」由 <standard-table show-adjustment> 控制,默认显示;写在 standard-toolbar-right 上不生效。
  • <standard-form-item> 必须放在 <standard-form> 里,:span 用数字绑定(:span="12")。字符串 span="12" 不会按栅格计算。
  • 树形表格同时传 tree-config 和 row-config。节点列加 tree-node。row-config.keyField 与 tree-config.rowField 用同一个字段。
  • 页面根节点用 <standard-page>。左右分栏加 vertical。拖完分割条后对两侧表格调用 recalculate()。
  • 弹窗里的表格要给明确高度(例如 style="height: 420px")。表格位于 el-dialog 内、右键菜单被挡住时,给表格传 z-index(大于弹窗层级,如 3000),或在使用方执行 VXETable.setup({ zIndex: 5000 })。本库 install 里的 zIndex: 5000 只作用于打进产物的那份 vxe-table。

组件总览

组件标签形态说明
StandardButton<standard-button>单/双标签标准按钮,固定 mini,其余透传 el-button
StandardInput<standard-input>单/双标签标准输入框,自动 trim,可仅数字
StandardSelect<standard-select>单标签标准下拉,单选/多选、远程搜索
StandardTimePick<standard-time-pick>单标签标准时间选择,年月日或年月日时分秒
StandardDialog<standard-dialog>双标签标准弹窗,确定不自动关闭,可拖拽
StandardContainer<standard-container>双标签布局容器,只排方向和尺寸
StandardFilterbar<standard-filterbar>单/双标签筛选栏。子组件 <standard-filterbar-item>
StandardForm<standard-form>双标签标准表单。子组件 <standard-form-item>
StandardHalfArea<standard-half-area>双标签半区,left / right,可透明
StandardPage<standard-page>双标签页面骨架
StandardSplitter<standard-splitter>单标签左右分割条,px 或 percent
StandardTable<standard-table>双标签标准表格。8 个子组件,见下文
StandardTabs<standard-tabs>双标签标准页签。子组件 <standard-tab-pane>
StandardTree<standard-tree>单标签标准树,搜索、节点、底部展开收起

组件说明

StandardButton 标准按钮

单标签用 label,双标签用默认插槽。插槽有内容时优先于 label。内部固定 size="mini"。loading、disabled、@click 等透传 el-button。

属性类型默认值说明
labelString''按钮文案
iconString''图标类名,如 el-icon-search
typeString''primary / success / warning / danger / info / text

插槽:默认插槽,按钮文案。

<standard-button label="查询" type="primary" icon="el-icon-search" :loading="loading" @click="onSearch" />
<standard-button type="danger" @click="onDelete">删除</standard-button>

StandardInput 标准输入框

v-model 绑值,输入时自动 trim。内部固定 size="mini"、可清空,宽度 175px。class、disabled、@focus、@blur、@clear 等透传。

属性类型默认值说明
valueString / Number''v-model
placeholderString'请输入'占位文案
number-onlyBooleanfalse只保留 0-9

事件:@input(v-model)、@enter(回车)。其余透传。

插槽:

插槽说明
默认插槽输入框右侧附加内容(el-input 的 append),常用于单位
prepend左侧附加
prefix前缀图标位
suffix后缀图标位
<standard-input v-model="keyword" placeholder="请输入关键字" @enter="onSearch" />
<standard-input v-model="form.qty" number-only>个</standard-input>

StandardSelect 标准下拉

单选绑定任意值。multiple 时绑定值必须是数组,组件会兜底成 []。内部固定 size="mini"、可清空,宽度 175px。远程模式强制 filterable 和 reserve-keyword。

属性类型默认值说明
valueString / Number / Array''v-model
optionsArray[]静态选项。[{ label, value }],或配 option-props 的对象数组,也接受 ['A','B']
option-propsObject{ label: 'label', value: 'value' }选项字段映射
remoteString / Function''远程方法。函数直接调用;字符串沿父组件链找同名方法。入参为关键字
multipleBooleanfalse多选
filterableBooleantrue可筛选。远程模式强制开启
clearableBooleantrue可清空
disabledBooleanfalse禁用
placeholderString'请选择'占位文案

事件:@input、@change、@visible-change。其余透传 el-select。

插槽:默认插槽,写在自动生成的 el-option 之后,可追加选项。

远程方法返回 Promise。返回值可以是数组,或带 Datas / data / data.Datas / list 的响应。组件防抖 300ms,自己管 loading,首次挂载以及下拉展开且没有数据时会拉取。

<standard-select v-model="form.type" :options="typeOptions" />
<standard-select v-model="form.types" multiple :options="typeOptions" />
<standard-select
  v-model="form.deptId"
  remote="remoteDeptList"
  :option-props="{ label: 'DEPT_NAME', value: 'DEPT_ID' }"
  placeholder="请选择部门"
/>

StandardTimePick 标准时间选择

type 只认 date(默认,年月日)和 datetime(年月日时分秒)。内部固定 size="mini"、可清空、弹出面板右对齐,宽度 175px。

属性类型默认值说明
valueString / Date / Array''v-model
typeString'date'date / datetime
value-formatString''不传时按类型用 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
placeholderString''不传时为「请选择日期」或「请选择时间」
clearableBooleantrue可清空
disabledBooleanfalse禁用
picker-optionsObjectnull同 el-date-picker 的 picker-options

事件:@input。其余透传。无插槽。

<standard-time-pick v-model="form.checkDate" />
<standard-time-pick v-model="form.checkTime" type="datetime" />

StandardDialog 标准弹窗

双标签。v-model 控制显隐。宽度随内容撑开,最小 300px,最宽 80vw;最高 80vh,超出后内容区内部滚动。底部按钮固定为「取消」「确定」,都是 mini。

属性类型默认值说明
visibleBooleanfalsev-model
titleString''标题
show-cancelBooleantrue显示取消
show-confirmBooleantrue显示确定
confirm-loadingBooleanfalse确定按钮加载态
close-on-click-modalBooleanfalse点击遮罩是否关闭。默认关闭,需要时传 true
draggableBooleantrue按住标题栏拖动。全屏时不拖。传 false 关闭
show-fullscreenBooleanfalse关闭按钮左侧显示全屏切换
default-fullscreenBooleanfalse打开即全屏,并固定显示全屏按钮。关闭再打开恢复全屏
fullscreenBooleanfalse打开时的初始全屏。不强制显示切换按钮

width、append-to-body、show-close、custom-class 等经 $attrs 传给 el-dialog。

事件:

事件说明
@confirm点击确定。不关闭弹窗
@cancel点击取消,并关闭
@close右上角关闭,透传 el-dialog
@update:visiblev-model
@update:fullscreen全屏状态变化

插槽:默认插槽,弹窗内容。标题和底部按钮不开放插槽。

<standard-dialog v-model="visible" title="新增" :confirm-loading="saving" @confirm="submit" @close="close">
  <standard-form ref="editForm" :model="form" :rules="rules"><!-- 表单项 --></standard-form>
</standard-dialog>

StandardContainer 标准布局容器

双标签。没有边框、背景和内边距,只负责方向和尺寸。子项不放大、不压缩,交叉轴拉伸填满。

属性类型默认值说明
directionString'column'column 纵向 / row 横向
sizeNumber100占父容器主轴的百分比,0–100。父级是纵向容器时作用于高度,横向时作用于宽度。顶层容器按纵向处理
heightNumber / Stringnull显式高度。数字按 px。优先级高于 size
widthNumber / Stringnull显式宽度。数字按 px。优先级高于 size

插槽:默认插槽。

放进弹窗时,百分比要生效,顶层容器需要显式高度或宽度。

<standard-container direction="row" width="400px">
  <standard-container><!-- 左 --></standard-container>
  <standard-container><!-- 右 --></standard-container>
</standard-container>

StandardFilterbar 标准筛选栏

单标签靠 v-model 配条件;双标签时,默认插槽里的 <standard-filterbar-item> 排在配置条件之前。首行按容器宽度排布,单项宽在 175–300px。放不下的进「更多」。show-advanced-query 时改为「高级查询」弹层,不再展开次行。

v-model 绑定:

searchBar: {
  searchCondition: [],   // 条件配置,可省略
  searchVariable: {},    // 键必须覆盖每条条件的 value,初始值就是重置目标
  mainConditionCount     // 可选。首行条数上限。不传则只受宽度限制
}
属性类型默认值说明
search-barObject必填v-model
show-exportBooleanfalse显示「导出」
show-expandBooleantrue显示「更多」。false 时未进首行的条件换行常显
show-advanced-queryBooleanfalse用「高级查询」代替「更多」
expand-upwardsBooleantrue「更多」向上展开。高级查询模式下无效
loadingBooleanfalse查询按钮加载态
reset-trigger-searchBooleanfalse重置后自动再派发 @search

事件:

事件说明
@search必接。查询按钮、文本回车、高级查询确定都会派发
@export点击导出。需 show-export
@reset已恢复为创建时的初始值
@render-error校验失败,参数为错误信息数组

插槽:默认插槽。只收集 <standard-filterbar-item>,其它节点忽略。

条件 type:

type控件说明
textel-input回车即查询,值会 trim
dateel-date-pickeryyyy-MM-dd
datetimeel-date-pickeryyyy-MM-dd HH:mm:ss
selectel-selectselectSource 或 remote
select-multiel-select 多选绑定值必须是数组

条件字段:label、value(必填,且必须已存在于 searchVariable)、type(必填)。可选 placeholder、clearable(默认 true)、width(数字 px 或 CSS 宽度)、selectSource、remote(函数或父组件方法名)、optionProps: { label, value }。远程返回值约定与 standard-select 相同,防抖 300ms。

<standard-filterbar
  v-model="searchBar"
  show-export
  reset-trigger-search
  :loading="loading"
  @search="onSearch"
  @export="onExport"
>
  <standard-filterbar-item label="车间">
    <el-select v-model="extra.workshop" size="mini" clearable placeholder="请选择车间" />
  </standard-filterbar-item>
</standard-filterbar>
searchBar: {
  searchCondition: [
    { label: '开始时间', value: 'startTime', type: 'datetime', clearable: false },
    { label: '关键字', value: 'keyword', type: 'text', placeholder: '请输入关键字' },
    { label: '部门', value: 'deptId', type: 'select', remote: 'remoteDeptList',
      optionProps: { label: 'DEPT_NAME', value: 'DEPT_ID' } },
    { label: '状态', value: 'status', type: 'select',
      selectSource: [{ label: '全部', value: '-1' }, { label: '启用', value: '1' }] }
  ],
  searchVariable: { startTime: '', keyword: '', deptId: '', status: '-1' }
}

插槽里的控件不进 searchVariable,重置按钮不会清它们。需要联动清空时听 @reset。

子组件 StandardFilterbarItem

放在 <standard-filterbar> 默认插槽里。标题在上、控件在下。一个组件算一条条件。

属性类型默认值说明
labelString''标题
widthNumber / Stringnull自定义宽度。不传则跟随首行统一宽度
layout-widthNumber0筛选栏测量后写入,页面不要传

插槽:默认插槽,放具体控件(el-select、el-input、standard-input 等)。

StandardForm / StandardFormItem 标准表单

双标签。label 宽度按全部表单项里最长的 label 计算:中文 15px/字 + 英文 10px/字 + 40px。控件尺寸默认 mini。表单项内控件样式为宽度 100%。

StandardForm

属性类型默认值说明
modelObject{}表单数据。可用 :model,也支持 v-model(update:model)
rulesObjectnull同 el-form
sizeString'mini'控件尺寸
label-positionString'right'left / right / top
widthNumber / Stringnull表单宽度。数字按 px。不传则撑满父级

label-width 由组件计算,不要再传。其余属性、事件透传 el-form。

对外方法(ref):validate、resetFields、clearValidate。

插槽:默认插槽,放 <standard-form-item>。

StandardFormItem

属性类型默认值说明
labelString''标签,参与 label 宽度计算
propString''校验字段,对应 rules 的 key
spanNumber24栅格 1–24。半行并排写 :span="12"

required 等其余属性透传 el-form-item。

插槽:默认插槽,放输入控件。

<standard-form ref="editForm" :model="form" :rules="rules" width="600px">
  <standard-form-item label="名称" prop="NAME" :span="12">
    <standard-input v-model="form.NAME" placeholder="请输入名称" />
  </standard-form-item>
  <standard-form-item label="备注">
    <el-input v-model.trim="form.REMARK" type="textarea" :rows="3" />
  </standard-form-item>
</standard-form>

StandardHalfArea 标准半区

双标签。默认是白底圆角卡片。左右分栏时和 <standard-splitter> 一起放在 <standard-page vertical> 里。

属性类型默认值说明
leftBooleanfalse左半区,flex: 0 0 auto,宽度由页面用 style 指定
rightBooleanfalse右半区,flex: 1 1 0% 占满剩余宽度
transparentBooleanfalse去掉卡片外观,只留布局。内部筛选栏、表格、树自己带卡片时使用

插槽:默认插槽。

<standard-half-area left :style="{ width: leftWidth + 'px' }"><!-- 左 --></standard-half-area>
<standard-splitter v-model="leftWidth" />
<standard-half-area right><!-- 右 --></standard-half-area>

StandardPage 标准页面骨架

双标签。自带 16px 内边距(宽度 ≤768px 时 12px)、白底、overflow: hidden、纵向 flex。页面本身不出现滚动条,滚动发生在表格等内容区。

属性类型默认值说明
clientBooleanfalsetrue 时高度 calc(100vh - 29px),否则 calc(100vh - 135px)
verticalBooleanfalse内容放进横向 flex 层,用于左树/左表 + 右内容

插槽:默认插槽,放筛选区、半区、表格、弹窗。

<standard-page :client="isClient">
  <standard-filterbar v-model="searchBar" @search="onSearch" />
  <standard-table :table-data="tableData" />
</standard-page>

StandardSplitter 标准分割条

单标签。拖拽改变左侧宽度。拖拽中禁止选中文字。

属性类型默认值说明
valueNumber260v-model,左侧宽度
unitString'px'px / percent
min-widthNumber200px 模式最小宽度
max-ratioNumber0.6px 模式最大占父容器比例
min-pixelNumber320percent 模式两侧最小像素
max-half-percentNumber45percent 模式单侧百分比上限

事件:@input(拖拽中)、@drag-start、@drag-end、@change(后两个在松手时派发,参数为最终宽度)。无插槽。

联动页在 @drag-end 里对两侧表格调用 recalculate()。

StandardTable 标准表格

双标签,基于 vxe-table。数据用 table-data,操作列用 table-operation。工具栏、分页、列都在默认插槽里声明,由表格拿到对应区域渲染。列组件本身不占布局。

属性类型默认值说明
table-dataArray[]表格数据
table-operationArray[]操作列。见下方按钮项
loadingBooleanfalse加载态
heightString / Number'100%'表格高度
show-footerBooleanfalse底部栏。出现 standard-footer-left 或 standard-footer-right 时自动显示
show-update-timeBooleantrue底部左侧「数据更新时间」。只在 show-footer 为 true、且没有 footer-left 子组件和 footer-left 插槽时显示
show-checkboxBooleanfalse首列多选
show-adjustmentBooleantrue右上角「调整」列设置。传 false 隐藏
show-context-menuBooleanfalse单元格右键菜单。默认不拦截,走浏览器菜单。表头右键(排序、固定列)不受此开关影响
footer-methodFunctionnull表尾合计,原样交给 vxe-table
menu-configObjectnull自定义右键菜单,原样交给 vxe-table。传入后不再使用内置菜单
tree-configObjectnull树形配置,原样透传
row-configObjectnull行主键。树表写 { keyField: 'id' }
edit-configObject / Booleannull不传时,只要有列开了编辑,就按点击单元格编辑。false 关闭。对象原样交给 vxe-table
z-indexNumbernull右键菜单、tooltip 的层级
table-codeString''表头配置里的表格编码。不传用 ref
page-codeString''表头配置里的页面编码。不传用路由

操作列每一项:

字段说明
text按钮文字
method函数,或父组件方法名。入参 (row, btn)
activetrue / false,或函数 (row, btn)。false 时按钮禁用,不隐藏
width参与操作列宽度合计,未写按 60px 估算
color文字颜色。删除常用 #f56c6c

按钮不超过 3 个时全部显示。超过 3 个时前 3 个直出,其余进「更多」。

事件:

事件说明
@current-change当前行变化,参数为 vxe-table 的参数
@selection-change多选变化,参数为已选行数组
@toggle-tree-expand树节点展开/收起
@op-click操作列点击,参数 (row, btn)
@menu-click右键菜单点击,参数为 vxe-table 的参数
@edit-activated / @edit-closed单元格编辑开始 / 结束

未传 menu-config 且 show-context-menu 为 true 时,单元格菜单为「复制」加上操作列按钮。

对外方法(ref):

方法说明
recalculate()容器尺寸变化后重算布局
setAllTreeExpand(expanded)树表全部展开或收起
getSelection()已勾选行
clearSelection()清空勾选
setCurrentRow(row)勾选某一行(多选)
setCurrentRecord(row)设为当前高亮行,不触发 current-change
exportData(options)转调 vxe-table 的 exportData

插槽:

插槽说明
默认插槽放下面的子组件。工具栏、分页、列会被抽到对应区域
footer-left底部栏左侧自定义内容。仅当 show-footer 为 true,且没有 <standard-footer-left> 时显示

子组件 StandardToolbarLeft

放在 <standard-table> 默认插槽内,渲染到操作区左侧。

属性类型默认值说明
buttonsArray[]{ type, icon, text, title, method, show }。method 为函数或父组件方法名,入参为按钮对象。show: false 不渲染

事件:@toolbar-click,参数为按钮对象。

插槽:默认插槽,和 buttons 一起显示。插槽里的按钮自己绑事件。

子组件 StandardToolbarRight

放在 <standard-table> 默认插槽内,渲染到操作区右侧、「调整」按钮之前。

无需要页面传入的属性。插槽:默认插槽,放按钮或 <standard-toolbar-query>。

子组件 StandardToolbarQuery

只能作为 <standard-toolbar-right> 的子组件。从左到右是输入框、查询;show-export 时再加导出。间距 6px。回车与点击查询相同。

属性类型默认值说明
valueString / Number''v-model,查询关键字
placeholderString'请输入关键字'占位
query-methodFunction / String''查询方法,入参为当前关键字
export-methodFunction / String''导出方法,约定同上。需 show-export
show-exportBooleanfalse显示导出
loadingBooleanfalse查询按钮加载态

事件:@input、@query、@export。后两个参数都是当前关键字。传了 method 仍会派发事件。无插槽。

子组件 StandardToolbarEmpty

操作区没有任何左右工具栏时,表格会自己留出一块 10px 间距。页面一般不用写。写了 <standard-toolbar-empty /> 也是同一块占位。左右工具栏有其一则不占位。无属性、无插槽。

子组件 StandardColumn

声明列,必须放在 <standard-table> 内(可以隔着 tabs 等中间层)。自身不显示。

属性类型默认值说明
fieldString''字段名。与 type 至少给一个
column-keyString''表头配置主键。不传按 field 或 type 生成。同一字段出现两列,或字段以后会改名时必须指定,指定后不要再改
typeString''vxe 内置列,如 seq
titleString''列标题
widthString / Numbernull列宽
min-widthString / Numbernull最小列宽。不传时:有 width 用 width,否则按标题估算(中文 15px、英文 10px,再加 40px)
fixedString'''' / left / right
alignString'left'left / center / right
sortableBooleanfalse可排序
show-overflowBooleantrue超出省略
resizableBooleantrue可拖列宽
tree-nodeBooleanfalse树节点列,显示展开图标
formatterFunctionnull({ row, column, $index }) => 显示值。优先级低于插槽
editableBooleanfalse点击单元格文本编辑
edit-renderObjectnullvxe 编辑器,如 { name: 'input' }。优先于 editable

插槽:

插槽说明
默认插槽单元格。需要行数据时用作用域插槽,参数来自 vxe-table,常用 row、seq、column
edit编辑态内容,作用域同上。有此插槽时该列可编辑

子组件 StandardFooterLeft

底部栏左侧文本。出现后底部栏自动显示,并占用「数据更新时间」的位置。

属性类型默认值说明
textString''左侧文字

无插槽。自定义结构用表格的 footer-left 插槽,并打开 show-footer。

子组件 StandardFooterRight

底部栏右侧分页。出现后底部栏自动显示。

属性类型默认值说明
current-pageNumber1当前页,由页面维护
page-sizeNumber20每页条数,由页面维护
page-sizesArray[10, 20, 50, 100, 200, 500]每页条数选项
totalNumber0总条数
layoutString'sizes, prev, pager, next, total'同 el-pagination

事件:@page-change,参数 { currentPage, pageSize, type }。type 为 page(翻页)或 size(改每页条数,此时 currentPage 为 1)。无插槽。

子组件 StandardFooterEmpty

没有左右底部内容时,用来留出与底部栏相同的 10px 上间距。左右底部子组件有其一则不占位。无属性、无插槽。

<standard-table
  ref="mainTable"
  table-code="main"
  :table-data="tableData"
  :table-operation="tableOperation"
  :loading="loading"
  :show-update-time="false"
>
  <standard-toolbar-left>
    <standard-button type="primary" icon="el-icon-plus" label="新增" @click="onAdd" />
  </standard-toolbar-left>
  <standard-toolbar-right>
    <standard-toolbar-query v-model="keyword" query-method="onQuery" :loading="loading" />
  </standard-toolbar-right>
  <standard-footer-left :text="footerText" />
  <standard-footer-right
    :current-page="pageParams.currentPage"
    :page-size="pageParams.pageSize"
    :page-sizes="[10, 20, 50, 100]"
    :total="pageParams.totalResult"
    @page-change="onPageChange"
  />
  <standard-column type="seq" title="序号" :width="60" :min-width="60" fixed="left" />
  <standard-column field="CODE" title="编码" :min-width="120" sortable />
  <standard-column field="STATUS" title="状态" :width="100" :min-width="100" align="center">
    <template #default="{ row }"><!-- 状态标签 --></template>
  </standard-column>
</standard-table>

树形模式:

<standard-table
  :table-data="tableData"
  :tree-config="treeConfig"
  :row-config="rowConfig"
  @toggle-tree-expand="onToggleTreeExpand"
>
  <standard-column tree-node field="NAME" title="名称" :min-width="220" fixed="left" />
</standard-table>
treeConfig: { transform: true, rowField: 'id', parentField: 'parentId', trigger: 'row', showIcon: true, indent: 20 }
rowConfig: { keyField: 'id' }

StandardTabs / StandardTabPane 标准页签

双标签。头部和内容区是同一张卡片。type、tab-position、stretch 以及 @tab-click、@edit 等透传 el-tabs。

StandardTabs

属性类型默认值说明
valueString / Number''v-model,当前 pane 的 name
lazyBooleanfalse懒加载,作用于全部 pane。某个 pane 自己的 lazy 也会生效

插槽:默认插槽,放 <standard-tab-pane>。

StandardTabPane

继承 Element UI 的 TabPane。常用属性:label、name、closable、disabled、lazy。插槽:默认插槽,pane 内容。

全局注册名是 StandardTabPane,不会覆盖页面里的 <el-tab-pane>。

<standard-tabs v-model="activeTab" lazy @tab-click="onTabClick">
  <standard-tab-pane label="明细" name="detail">
    <standard-table :table-data="detailData" />
  </standard-tab-pane>
  <standard-tab-pane label="记录" name="record" />
</standard-tabs>

StandardTree 标准树

单标签。上为搜索,中为树,下为「全部展开 / 全部收起」。默认手风琴、高亮当前节点、点击节点展开。自带卡片外观。

属性类型默认值说明
tree-dataArray[]v-model,嵌套数据
tree-propsObject{ label: 'label', children: 'children' }字段映射
node-keyString'id'节点唯一键
default-expanded-keysArray[]默认展开的 key
search-placeholderString'请输入节点名称搜索'搜索框占位
transparentBooleanfalse去掉自身卡片并占满父级。放进半区时使用

事件:@node-click、@node-expand、@node-collapse。参数与 el-tree 相同:(data, node, tree)。

对外方法(ref):setCurrentKey(key) 设置或取消选中;filter(keyword) 按名称过滤。

无插槽。节点图标和文字由组件内部渲染。

<standard-tree
  ref="tree"
  v-model="treeData"
  node-key="id"
  :default-expanded-keys="[1]"
  transparent
  @node-click="onNodeClick"
/>
treeData: [
  { id: 1, label: '总部', children: [
    { id: 11, label: '技术部' },
    { id: 12, label: '财务部' }
  ]},
  { id: 2, label: '分公司' }
]

页面骨架

下面五种对应 Web 前端样板里的页面,只保留组件嵌套。样板目录:listPage、multiListPage、linkPage、treeLinkPage、toolbarQueryPage。

标准列表页(listPage)

筛选栏 + 表格(工具栏、底栏、列)+ 详情弹窗里的表格。

<standard-page :client="isClient">
  <standard-filterbar v-model="searchBar" show-export reset-trigger-search :loading="loading"
                      @search="onSearch" @export="onExport" />
  <standard-table ref="mainTable" :table-data="tableData" :table-operation="tableOperation"
                  :loading="loading" :show-update-time="false">
    <standard-toolbar-left>
      <standard-button type="primary" icon="el-icon-plus" label="新增" @click="onAdd" />
    </standard-toolbar-left>
    <standard-toolbar-right />
    <standard-footer-left :text="footerText" />
    <standard-footer-right :current-page="pageParams.currentPage" :page-size="pageParams.pageSize"
                           :page-sizes="[10, 20, 50, 100]" :total="pageParams.totalResult"
                           @page-change="onPageChange" />
    <standard-column type="seq" title="序号" fixed="left" />
    <standard-column field="CODE" title="编码" :min-width="120" sortable />
  </standard-table>

  <el-dialog :visible.sync="showDetail" :title="detailTitle" width="900px">
    <standard-table :table-data="detailData" :loading="detailLoading" :show-update-time="false"
                    style="height: 420px">
      <standard-toolbar-right>
        <standard-button type="primary" label="导出" @click="onDetailExport" />
      </standard-toolbar-right>
      <standard-column field="NAME" title="项目名称" :min-width="150" />
    </standard-table>
  </el-dialog>
</standard-page>

多层级树表格页(multiListPage)

筛选栏(可含插槽条件)+ 树表 + 弹窗。弹窗里用容器并排表单和表格。

<standard-page :client="isClient">
  <standard-filterbar v-model="searchBar" reset-trigger-search :loading="loading"
                      @search="onSearch" @reset="onResetExtra">
    <standard-filterbar-item label="车间">
      <el-select v-model="extra.workshop" size="mini" clearable />
    </standard-filterbar-item>
  </standard-filterbar>

  <standard-table ref="xTable" :table-data="tableData" :table-operation="tableOperation"
                  :loading="loading" :show-update-time="false"
                  :tree-config="treeConfig" :row-config="rowConfig"
                  @toggle-tree-expand="onToggleTreeExpand">
    <standard-toolbar-left>
      <standard-button type="primary" icon="el-icon-plus" label="新增" @click="onAdd" />
    </standard-toolbar-left>
    <standard-toolbar-right>
      <standard-button :label="expanded ? '收起' : '展开'" @click="toggleExpandAll" />
    </standard-toolbar-right>
    <standard-footer-empty />
    <standard-column tree-node field="NAME" title="名称" :min-width="220" fixed="left" />
    <standard-column field="CODE" title="编码" :width="110" :min-width="110" align="center" />
  </standard-table>

  <standard-dialog v-model="showEdit" :title="dialogTitle" :confirm-loading="saving"
                   @confirm="submit" @close="close">
    <standard-container direction="row" width="400px">
      <standard-container>
        <standard-form ref="editForm" :model="form" :rules="formRules">
          <standard-form-item label="名称" prop="NAME" :span="12">
            <standard-input v-model="form.NAME" />
          </standard-form-item>
        </standard-form>
      </standard-container>
      <standard-container>
        <standard-table :table-data="dialogTableData">
          <standard-toolbar-left>
            <standard-button type="primary" icon="el-icon-plus" label="新增" @click="onAddLine" />
          </standard-toolbar-left>
          <standard-footer-empty />
          <standard-column field="CODE" title="编码" />
        </standard-table>
      </standard-container>
    </standard-container>
  </standard-dialog>
</standard-page>

左右联动页(linkPage)

左右半区透明,中间百分比分割条。左侧筛选 + 表格;右侧筛选 + 页签,每个页签一张表。

<standard-page :client="isClient" vertical>
  <standard-half-area v-show="leftVisible" transparent :style="leftPanelStyle">
    <standard-filterbar v-model="leftSearchBar" show-advanced-query reset-trigger-search
                        :loading="leftLoading" @search="onLeftSearch" />
    <standard-table ref="leftTable" :table-data="leftTableData" :loading="leftLoading"
                    :show-update-time="false" @current-change="onLeftCurrentChange">
      <standard-toolbar-left :buttons="leftToolbarButtons" />
      <standard-footer-right :current-page="leftPage.currentPage" :page-size="leftPage.pageSize"
                             :page-sizes="[10, 20, 50, 100]" :total="leftPage.totalResult"
                             @page-change="onLeftPageChange" />
      <standard-column type="seq" title="序号" :width="60" :min-width="60" fixed="left" />
      <standard-column field="NAME" title="名称" :min-width="180" sortable />
    </standard-table>
  </standard-half-area>

  <standard-splitter v-show="leftVisible && rightVisible" v-model="leftPercent" unit="percent"
                     @drag-end="recalculateAll" />

  <standard-half-area v-show="rightVisible" right transparent>
    <standard-filterbar :key="activeTab" v-model="rightSearchBar" show-advanced-query
                        reset-trigger-search :loading="rightLoading" @search="onRightSearch" />
    <standard-tabs v-model="activeTab" lazy @tab-click="onTabClick">
      <standard-tab-pane label="明细" name="detail">
        <standard-table ref="detailTable" :table-data="detailData" :loading="rightLoading"
                        :show-update-time="false">
          <standard-toolbar-left :buttons="detailToolbarButtons" />
          <standard-footer-right :current-page="rightPage.currentPage" :page-size="rightPage.pageSize"
                                 :page-sizes="[10, 20, 50, 100]" :total="rightPage.totalResult"
                                 @page-change="onRightPageChange" />
          <standard-column type="seq" title="序号" :width="60" :min-width="60" fixed="left" />
        </standard-table>
      </standard-tab-pane>
      <standard-tab-pane label="记录" name="record" />
      <standard-tab-pane label="日志" name="log" />
    </standard-tabs>
  </standard-half-area>
</standard-page>

树 + 列表联动页(treeLinkPage)

左半区放树,分割条用像素宽度,右半区是带关键字查询的表格,弹窗里放表单。

<standard-page :client="isClient" vertical>
  <standard-half-area v-show="leftVisible" left :style="{ width: leftWidth + 'px' }">
    <standard-tree ref="tree" v-model="treeData" node-key="id" :default-expanded-keys="[1]"
                   transparent @node-click="onNodeClick" />
  </standard-half-area>

  <standard-splitter v-show="leftVisible" v-model="leftWidth" :min-width="200" :max-ratio="0.6" />

  <standard-half-area right>
    <standard-table ref="xTable" :table-data="tableData" :table-operation="tableOperation"
                    :loading="loading" show-footer :show-update-time="false">
      <standard-toolbar-left>
        <standard-button :label="leftVisible ? '收起' : '展开'" @click="toggleLeft" />
        <standard-button type="primary" icon="el-icon-plus" label="新增" @click="onAdd" />
        <standard-button icon="el-icon-upload" label="导出" @click="onExport" />
      </standard-toolbar-left>
      <standard-toolbar-right>
        <standard-input v-model="keyword" placeholder="请输入关键字" @enter="onSearch" />
        <standard-button type="primary" icon="el-icon-search" label="查询" :loading="loading" @click="onSearch" />
      </standard-toolbar-right>
      <template #footer-left><!-- 当前节点 --></template>
      <standard-footer-right :current-page="pageParams.currentPage" :page-size="pageParams.pageSize"
                             :page-sizes="[10, 20, 50, 100]" :total="pageParams.totalResult"
                             @page-change="onPageChange" />
      <standard-column type="seq" title="序号" :width="60" :min-width="60" fixed="left" />
      <standard-column field="CODE" title="编码" :min-width="140" sortable />
    </standard-table>
  </standard-half-area>

  <standard-dialog v-model="showEdit" :title="dialogTitle" :confirm-loading="saving"
                   @confirm="submit" @close="close">
    <standard-form ref="editForm" :model="form" :rules="formRules" width="400px">
      <standard-form-item label="编码" prop="CODE" :span="12">
        <standard-input v-model="form.CODE" />
      </standard-form-item>
    </standard-form>
  </standard-dialog>
</standard-page>

树表联动页若要显示 #footer-left,表格需要 show-footer。只放 <standard-footer-right> 时底部栏也会出现,此时左侧自定义内容仍要 show-footer。

工具栏查询列表页(toolbarQueryPage)

没有独立筛选栏。关键字查询放在表格右侧工具栏。

<standard-page :client="isClient">
  <standard-table ref="mainTable" :table-data="tableData" :loading="loading" :show-update-time="false">
    <standard-toolbar-left>
      <standard-button type="primary" icon="el-icon-plus" label="新增" @click="onAdd" />
      <standard-button icon="el-icon-refresh" label="刷新" @click="onRefresh" />
    </standard-toolbar-left>
    <standard-toolbar-right>
      <standard-toolbar-query v-model="keyword" placeholder="请输入编码/名称" query-method="onQuery"
                              show-export export-method="onExport" :loading="loading" />
    </standard-toolbar-right>
    <standard-footer-right :current-page="pageParams.currentPage" :page-size="pageParams.pageSize"
                           :page-sizes="[10, 20, 50, 100]" :total="pageParams.totalResult"
                           @page-change="onPageChange" />
    <standard-column type="seq" title="序号" :width="60" :min-width="60" fixed="left" />
    <standard-column field="CODE" title="编码" :min-width="140" sortable />
    <standard-column field="NAME" title="名称" :min-width="180" sortable />
  </standard-table>
</standard-page>

开发与构建

npm install
npm run build

使用 @vue/cli-service 的 lib 模式,产物在 dist/:standard-ui.common.js(CommonJS)和 standard-ui.umd.min.js(UMD)。样式打进 JS。vue 由构建工具 external。src/index.js 会 import vxe-table,因此 element-ui、vxe-table 及其运行时依赖 @vxe-ui/core 的部分代码会打进 dist。

vxe-table 3.24 说明

本包 peerDependencies 为 vxe-table ^3.24.0。使用方注册方式不变:import VXETable from 'vxe-table'、引入 vxe-table/lib/style.css、Vue.use(VXETable)。

  • vxe-table 3.24 运行时依赖 @vxe-ui/core,但其 package.json 未声明该依赖。本包已在 dependencies 中声明 @vxe-ui/core ^3.4.24。使用方若单独使用 vxe-table、不依赖本包,需要自己安装 @vxe-ui/core@^3.4.24。
  • 从 3.6 / 3.8 升到 3.24 时,使用方自己写的 vxe-table 需要注意:纵向/横向虚拟滚动默认关闭;tree-config 的 line / hasChild / children 更名为 showLine / hasChildField / childrenField(旧名仍兼容);图标 fixed / fixed-fill 更名为 fixed-left / fixed-left-fill。
  • 本库 install 时执行的 VXETable.setup({ zIndex: 5000 }) 只作用于产物内的副本。使用方自己的 vxe-table 要在 main.js 里另行 setup,或给 <standard-table> 传 z-index。
  • vxe-table 3.24 是 Vue 2 线的最后版本,Vue 2.6 可直接使用。

发布

npm run build
npm login
npm publish

files 只有 dist,发布内容是构建产物和 README。版本更新用 npm version patch|minor|major 后再 npm publish。

版本与发布记录

@cimom-ui/standard-ui 共发布 21 个版本,首次发布于 2026/09/28;过去 12 个月发布了 21 个版本。

版本发布日期距今
1.1.24latest2026/11/09今天
1.1.232026/11/063 天前
1.1.222026/11/063 天前
1.1.212026/11/063 天前
1.1.202026/11/054 天前
1.1.192026/11/054 天前

关于 @cimom-ui/standard-ui 的常见问题

@cimom-ui/standard-ui 是什么?

标准组件库:基于 Vue 2.6 + Element UI 2.x + vxe-table 3.24.x 的通用业务组件(按钮、弹窗、筛选栏、表单、表格、树、分割条等)

如何安装 @cimom-ui/standard-ui?

在项目目录运行 npm install @cimom-ui/standard-ui,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:vue(^2.6.0)、vxe-table(^3.24.0)、element-ui(^2.15.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@cimom-ui/standard-ui 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/cimom-ui__standard-ui 是否存在。

@cimom-ui/standard-ui 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@cimom-ui/standard-ui 可以商用吗?

@cimom-ui/standard-ui 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@cimom-ui/standard-ui 的下载量有多少?

根据 npm 官方下载统计,@cimom-ui/standard-ui 在 2026/10/10 – 2026/11/08 这 30 天内被下载 2,319 次,日均约 77 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cimom-ui/standard-ui 还在维护吗?

最新版本 1.1.24 发布于 2026/11/09(今天);至今共发布 21 个版本,其中过去 12 个月发布了 21 个;首次发布于 2026/09/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。