Skip to content

基础 UI 组件 ​

@mbjia/ui

基础 UI 组件

@mbjia/ui 提供模板加业务中常用的基础 React 组件。它不是完整替代 Ant Design,而是在 AntD 4 和内部业务样式基础上封装按钮、弹窗、输入框、浮层、分页、上传触发等能力。

可单独接入React 17AntD 4

何时使用 ​

适合普通 React 页面里使用统一的模板加基础交互组件,例如按钮、弹窗、输入框、下拉、浮层、分页、文件选择入口。

如果要接入素材管理、全局上传、AI 搜索、支付权益等强业务能力,应查看 业务组件。

公共能力 ​

能力说明
AntD 继承Button、Modal、Pagination、SolidArrowSelect 等组件继承或组合 AntD 4 能力。
主题样式Button 支持模板加主题、普通主题、渐变样式和定制主题样式。
弹层能力Popup 提供 click、hover、focus、right-click 等触发方式,DropDown 基于 Popup 封装。
受控能力部分组件支持受控值,例如 Pagination.page、Popup.open、SolidArrowSelect.value。
回调出参组件通过 onChange、action、onClose、onConfirm 等回调向业务侧返回值。
样式依赖需要业务项目能处理 Less、CSS Modules、styled-components 和 AntD 样式。

同页接入参考 ​

工程前置条件

基础 UI 的接入门槛低于业务组件,但仍需要业务项目满足 React、AntD 和样式编译要求。

项目要求说明
React~17.0.0当前源码按 React 17 开发和验证。
Ant Design4.24.x多个组件继承或组合 AntD 4。
样式Less / CSS Modules / styled-components组件源码混合使用这些样式方案。
常用数据类型

基础 UI 常见类型主要来自组件回调和选项数据。业务素材模型、上传任务等大型结构见 公共数据结构。

类型用途结构
OptionItemTypeDropDown 选项{ type, title?, value?, disabled?, checked? }
BreadcrumbItemBreadCrumb 路径项{ id: string; title: string }
PopupActionsPopup refopen / close / toggle / isOpen
事件和回调规则

基础 UI 主要通过组件回调返回数据,不依赖全局事件协议。业务组件的跨模块事件见 事件协议。

组件回调返回值
InputonChangeChangeEvent<HTMLInputElement>
DropDownonChangestring | number
PaginationonChangenumber
UploadactionFile[] | FileList

组件总览 ​

组件详情 ​

Button ​

封装 AntD Button,增加模板加主题、尺寸和渐变样式。

效果预览 ​

确定
宽度120
高度42

交互预览 — 拖拽控件查看效果

通过 mbjia、gradient、normal、w、h 控制按钮样式。Props 表见下方。

使用示例 ​

tsx
import { Button } from '@mbjia/ui'

export default function Demo() {
  return (
    <Button mbjia w={120} h={42} onClick={() => console.log('click')}>
      确定
    </Button>
  )
}

Props ​

字段类型必填默认值说明
wnumber | string否120按钮宽度。传 100% 时外层容器也会设置为 100%。
hnumber | string否42按钮高度,同时影响圆角尺寸。
gradient'light' | 'dark' | 'none'否null渐变样式。
mbjiaboolean否false使用模板加主题按钮样式。
normalboolean否false使用普通按钮样式。
themeboolean否false使用定制主题样式。
containerClassnamestring否-外层容器 class。

其余属性继承 AntD ButtonProps,例如 onClick、disabled、loading、type。

回调出参 ​

回调出参说明
onClickMouseEvent继承 AntD Button 点击事件。

封装 AntD Modal,默认隐藏 footer,适合业务自己控制操作按钮。

效果预览 ​

打开弹窗
点击按钮打开弹窗,点击遮罩或 × 关闭

交互预览 — 点击体验弹窗行为

继承 AntD Modal 能力,额外支持圆角和关闭按钮外置样式。

使用示例 ​

tsx
import { Modal } from '@mbjia/ui'

<Modal open title="标题" onCancel={onClose}>
  内容
</Modal>

Props ​

字段类型必填默认值说明
roundedboolean否true是否使用圆角弹窗样式。
closeIconOutsideboolean否false关闭图标是否展示在弹窗外侧。

其余属性继承 AntD ModalProps。组件内部固定 footer={null},并隐藏 cancel 按钮。

回调出参 ​

回调出参说明
onCancelMouseEvent继承 AntD Modal 关闭回调。
onOkMouseEvent可透传,但默认无 footer,通常由业务按钮自行触发。

Input ​

封装 AntD Input,内置本地输入状态,并支持错误态、ghost、小尺寸、自动聚焦和防抖回调。

效果预览 ​

实时输入预览
onChange 输出:(空)

交互预览 — 切换 Props 查看效果

输入值由组件内部 useInputChange 维护,业务通过 onChange 接收输入事件。

使用示例 ​

tsx
import { Input } from '@mbjia/ui'

<Input
  placeholder="搜索素材"
  debounceDelay={200}
  onChange={(event) => console.log(event.target.value)}
/>

Props ​

字段类型必填默认值说明
onChange(e: ChangeEvent<HTMLInputElement>) => void是-输入变化回调。
placeholderstring是''占位文本。
customStyleCSSProperties否-外层容器样式。
ghostboolean否-是否使用 ghost 样式。
smallboolean否-是否使用小尺寸样式。
errMsgstring否''有值时显示错误样式。
hstring | number否34px输入框高度。
debounceDelaynumber否0onChange 防抖延迟,单位毫秒。
maxLengthnumber否50最大输入长度。
focusboolean否false挂载后自动聚焦。

其余属性继承 AntD InputProps。

回调出参 ​

回调出参说明
onChangeChangeEvent<HTMLInputElement>可通过 event.target.value 读取当前输入值。

注意事项 ​

源码类型中存在历史字段 maxlength,实际传给 AntD 的是 maxLength。

基于 Popup 封装的业务下拉选择,支持分割线、禁用项、自定义渲染和弹层样式。

效果预览 ​

点击"最新"按钮展开下拉菜单,再次点击关闭

交互预览 — 点击展开下拉菜单

适合排序、筛选、简单菜单选择。分割线、禁用态、选中态一目了然。

使用示例 ​

tsx
import { DropDown } from '@mbjia/ui'

<DropDown
  value="new"
  options={[
    { type: 'option', title: '最新', value: 'new' },
    { type: 'dash' },
    { type: 'option', title: '最热', value: 'hot' },
  ]}
  onChange={(value) => console.log(value)}
/>

Props ​

字段类型必填默认值说明
optionsOptionItemType[]是-下拉选项。
onChange(v: string | number) => void否-点击选项回调。
valuestring | number | string[] | number[]否''当前值。源码类型写作 never,实际运行中会调用 value?.includes?.(...)。
titlestring否-自定义触发器标题。
disabledboolean否false禁用下拉。
titleGreyboolean否false标题置灰。
wrapperStyleCSSProperties否{}弹层内容样式。
customStyleCSSProperties否{}触发器样式。
itemStyleCSSProperties否{}选项样式。
popupRefRefObject<PopupActions>否-Popup ref。
alignLeftboolean否false选项左对齐。
renderItem(data: OptionItemType) => ReactNode否null自定义选项渲染。
zIndexnumber否3002弹层层级。

回调出参 ​

回调出参说明
onChangestring | number当前点击选项的 value。禁用项不会触发。

数据类型 ​

ts
type OptionItemType = {
  type: 'dash' | 'option'
  disabled?: boolean
  checked?: boolean
  title?: string
  value?: string | number
}

通用浮层组件,支持 hover、click、focus、右键触发,也支持受控打开。

效果预览 ​

Hover 触发
Click 触发

Hover 触发(左)和 Click 触发(右),支持 top/bottom/left/right/center 定位

交互预览 — Hover 和 Click 两种触发方式

适合菜单、提示、右键操作等轻量浮层场景。

使用示例 ​

tsx
import { Popup } from '@mbjia/ui'

<Popup trigger={<button>打开</button>} position="bottom center">
  <div>弹层内容</div>
</Popup>

Props ​

字段类型必填默认值说明
childrenReactNode是-弹层内容。
triggerJSX.Element | (isOpen: boolean) => JSX.Element否null触发元素;为空时按 modal 行为处理。
onEventType | EventType[]否['click']触发方式。
positionPopupPosition | PopupPosition[]否'bottom center'弹层位置。
defaultOpenboolean否false默认打开。
openboolean否-受控打开。
disabledboolean否false禁用。
nestedboolean否false是否嵌套弹层。
arrowboolean否true是否显示箭头。
modalboolean否false是否按 modal 行为渲染。
lockScrollboolean否falsemodal 时锁定 body 滚动。
closeOnDocumentClickboolean否true点击外部关闭。
closeOnEscapeboolean否trueESC 关闭。
repositionOnResizeboolean否true窗口尺寸变化时重新定位。
mouseEnterDelaynumber否100hover 打开延迟。
mouseLeaveDelaynumber否200hover 关闭延迟。
contentStyleCSSProperties否{}弹层内容样式。
overlayStyleCSSProperties否{}遮罩样式。
arrowStyleCSSProperties否{}箭头样式。
classNamestring否''弹层 class。
keepTooltipInsideboolean | string否false是否限制在容器内。

回调与 ref ​

名称出参 / 返回值说明
onOpen(event?: SyntheticEvent) => void打开后回调。
onClose(event?: SyntheticEvent | KeyboardEvent | TouchEvent | MouseEvent) => void关闭后回调。
ref.open()void打开弹层。
ref.close()void关闭弹层。
ref.toggle()void切换打开状态。
ref.isOpen()boolean返回当前打开状态。

数据类型 ​

ts
type EventType = 'hover' | 'click' | 'focus' | 'right-click'
type PopupPosition =
  | 'top left' | 'top center' | 'top right'
  | 'right top' | 'right center' | 'right bottom'
  | 'bottom left' | 'bottom center' | 'bottom right'
  | 'left top' | 'left center' | 'left bottom'
  | 'center center'

type PopupActions = {
  open: () => void
  close: () => void
  toggle: () => void
  isOpen: () => boolean
}

面包屑组件,用于展示目录或页面层级。超过 maxCount 时会保留前两个和后两个,中间用 ... 浮层展示。

效果预览 ​

首页 > 素材管理 > 图片素材

面包屑

适合目录层级、素材路径、管理后台路径展示。

使用示例 ​

tsx
import { BreadCrumb } from '@mbjia/ui'

<BreadCrumb
  maxCount={5}
  list={[
    { id: 'root', title: '首页' },
    { id: 'asset', title: '素材管理' },
  ]}
  onChange={(id, name) => console.log(id, name)}
/>

Props ​

字段类型必填默认值说明
listBreadcrumbItem[]是-面包屑列表。
maxCountnumber是-超过后折叠中间项。
onChange(id: string, name?: string) => void是-点击面包屑回调。

数据类型 ​

ts
interface BreadcrumbItem {
  title: string
  id: string
}

回调出参 ​

回调出参说明
onChangeid: string, name?: string点击项的 id 和标题。折叠项点击时源码中部分路径只传 id。

横向可拖动的层级面包屑,基于 AntD Breadcrumb 和 react-indiana-drag-scroll。适合目录层级较长、需要横向滚动查看的场景。

效果预览 ​

全部素材 > 品牌素材 > 直播间素材 > 商品图

横向面包屑

当层级较多时可横向拖动,长文本会截断并通过 Tooltip 展示完整名称。

使用示例 ​

tsx
import { BreadCrumbLevels } from '@mbjia/ui'

<BreadCrumbLevels
  items={[
    { id: 'root', name: '全部素材', type: 'all' },
    { id: 'brand', name: '品牌素材', type: 'brand' },
  ]}
  changeTabs={(item) => console.log(item)}
/>

Props ​

字段类型必填默认值说明
itemsBreadcrumbLevelsItem[]是[]面包屑层级列表。
changeTabs(item: BreadcrumbLevelsItem) => void否-点击项后的外部回调。
separatorReactNode否'>'分隔符。
maxChartLengthnumber否6名称超过该长度时截断并显示 Tooltip。

数据类型 ​

ts
interface BreadcrumbLevelsItem {
  id: string
  name: string
  onClick?: (item: BreadcrumbLevelsItem) => void
  className?: string
  [propName: string]: unknown
}

回调和事件 ​

名称出参说明
item.onClickBreadcrumbLevelsItem点击当前项时先触发。
changeTabsBreadcrumbLevelsItem点击当前项后触发。
eventBus.emit('global:updateFolderType')item.type组件内部会发出该全局事件。

Pagination ​

封装 AntD Pagination,固定隐藏 pageSize 切换和快速跳转。

效果预览 ​

...

基础分页

适合素材列表、管理后台列表等分页场景。

使用示例 ​

tsx
import { Pagination } from '@mbjia/ui'

<Pagination
  page={1}
  pageSize={20}
  total={100}
  onChange={(page) => console.log(page)}
/>

Props ​

字段类型必填默认值说明
pagenumber是-当前页。
pageSizenumber否-每页数量,传给 AntD defaultPageSize。
totalnumber是-总数。
onChange(value: number) => void是-页码变化回调。
disabledboolean否false是否禁用。

组件内部固定 hideOnSinglePage、showSizeChanger={false}、showQuickJumper={false}。

回调出参 ​

回调出参说明
onChangenumber当前页码。

Upload ​

文件选择触发组件,内部调用 @mbjia/utils 的 showPicker。

效果预览 ​

未选择文件

点击触发真实的系统文件选择器,文件名和大小实时显示

交互预览 — 真实的系统文件选择器

点击 children 后打开系统文件选择器,选择完成后通过 action 返回文件。

使用示例 ​

tsx
import { Upload } from '@mbjia/ui'

<Upload accept="video/*" mimeType="video" action={(files) => console.log(files)}>
  <button>选择视频</button>
</Upload>

Props ​

字段类型必填默认值说明
childrenReactNode是-触发内容。
action(files: File[] | FileList) => void是-文件选择后回调。
acceptstring是-文件类型。传 video/* 时内部会把 mimeType 当作 video。
mimeType'music' | 'media' | 'excle' | 'img' | 'video'否'media'选择器类型。
multipleboolean否true是否多选。

回调与 ref ​

名称出参 / 返回值说明
actionFile[] | FileList文件选择结果。
ref.dispatch()void主动打开文件选择器。

Skeleton ​

基于 styled-components 的骨架屏占位组件。

效果预览 ​

骨架屏

占满父容器宽高,带透明度脉冲动画。

使用示例 ​

tsx
import { Skeleton } from '@mbjia/ui'

<div style={{ width: 240, height: 80 }}>
  <Skeleton />
</div>

Props ​

Skeleton 是 styled div,没有额外业务 Props。常用方式是在父容器上控制宽高。

SolidArrowSelect ​

基于 AntD Dropdown 的多级选择组件,支持受控值、默认值、菜单项和选中项文本溢出 Tooltip。

使用示例 ​

tsx
import { SolidArrowSelect } from '@mbjia/ui'

<SolidArrowSelect
  defaultValue={1}
  options={[
    { key: 1, label: '全部' },
    { key: 2, label: '图片' },
  ]}
  onChange={(value, keyPath, item) => console.log(value, keyPath, item)}
/>

Props ​

字段类型必填默认值说明
optionsAntD Menu items是-菜单选项,支持 children。
defaultValuenumber[] | number是-默认选中值。
valuenumber[] | number否-受控值。
trigger'hover' | 'click'否-样式标识;当前源码中没有控制 Dropdown open 状态。
overlayClassNamestring否-弹层 class。
hideboolean否-隐藏样式。
onChange(value: number, keyPath: string[], item: any) => void否-菜单项点击回调。

其余属性会透传给 AntD Dropdown。

回调出参 ​

回调出参说明
onChangevalue: number当前选中项 key 转为数字。
onChangekeyPath: string[]AntD 菜单 keyPath。
onChangeitem: any根据 keyPath 在 options 中找到的选项。

HeadlessBaseBtn ​

无样式基础按钮容器,源码是一个 styled.div,只设置了 cursor: pointer。适合业务需要完全自定义视觉,但希望保持可点击指针样式的场景。

效果预览 ​

自定义可点击区域

无样式按钮

组件本身不提供颜色、尺寸、边框,只提供 pointer cursor。

使用示例 ​

tsx
import { HeadlessBaseBtn } from '@mbjia/ui'

<HeadlessBaseBtn onClick={() => console.log('click')}>
  自定义内容
</HeadlessBaseBtn>

Props ​

HeadlessBaseBtn 是 styled div,没有额外业务 Props。可使用普通 div 支持的属性,例如 className、style、onClick。


相关文档 ​

MBJIA Tools 文档