Skip to content

基础 UI 组件

@mbjia/ui

基础 UI 组件

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

可单独接入React 17AntD 4

何时使用

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

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

公共能力

能力说明
AntD 继承ButtonModalPaginationSolidArrowSelect 等组件继承或组合 AntD 4 能力。
主题样式Button 支持模板加主题、普通主题、渐变样式和定制主题样式。
弹层能力Popup 提供 click、hover、focus、right-click 等触发方式,DropDown 基于 Popup 封装。
受控能力部分组件支持受控值,例如 Pagination.pagePopup.openSolidArrowSelect.value
回调出参组件通过 onChangeactiononCloseonConfirm 等回调向业务侧返回值。
样式依赖需要业务项目能处理 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,增加模板加主题、尺寸和渐变样式。

效果预览

模板加主题
渐变按钮

基础按钮

通过 mbjiagradientwh 控制常用按钮样式。

使用示例

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

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

Props

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

其余属性继承 AntD ButtonProps,例如 onClickdisabledloadingtype

回调出参

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

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

效果预览

弹窗标题

默认隐藏 footer,内容区域由业务自行控制。

基础弹窗

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

使用示例

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

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

Props

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

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

回调出参

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

Input

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

效果预览

普通输入框
搜索输入框

输入框

输入值由组件内部 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 | number34px输入框高度。
debounceDelaynumber0onChange 防抖延迟,单位毫秒。
maxLengthnumber50最大输入长度。
focusbooleanfalse挂载后自动聚焦。

其余属性继承 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-自定义触发器标题。
disabledbooleanfalse禁用下拉。
titleGreybooleanfalse标题置灰。
wrapperStyleCSSProperties{}弹层内容样式。
customStyleCSSProperties{}触发器样式。
itemStyleCSSProperties{}选项样式。
popupRefRefObject<PopupActions>-Popup ref。
alignLeftbooleanfalse选项左对齐。
renderItem(data: OptionItemType) => ReactNodenull自定义选项渲染。
zIndexnumber3002弹层层级。

回调出参

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

数据类型

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

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

效果预览

弹层内容

基础浮层

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

使用示例

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

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

Props

字段类型必填默认值说明
childrenReactNode-弹层内容。
triggerJSX.Element | (isOpen: boolean) => JSX.Elementnull触发元素;为空时按 modal 行为处理。
onEventType | EventType[]['click']触发方式。
positionPopupPosition | PopupPosition[]'bottom center'弹层位置。
defaultOpenbooleanfalse默认打开。
openboolean-受控打开。
disabledbooleanfalse禁用。
nestedbooleanfalse是否嵌套弹层。
arrowbooleantrue是否显示箭头。
modalbooleanfalse是否按 modal 行为渲染。
lockScrollbooleanfalsemodal 时锁定 body 滚动。
closeOnDocumentClickbooleantrue点击外部关闭。
closeOnEscapebooleantrueESC 关闭。
repositionOnResizebooleantrue窗口尺寸变化时重新定位。
mouseEnterDelaynumber100hover 打开延迟。
mouseLeaveDelaynumber200hover 关闭延迟。
contentStyleCSSProperties{}弹层内容样式。
overlayStyleCSSProperties{}遮罩样式。
arrowStyleCSSProperties{}箭头样式。
classNamestring''弹层 class。
keepTooltipInsideboolean | stringfalse是否限制在容器内。

回调与 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 Breadcrumbreact-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'>'分隔符。
maxChartLengthnumber6名称超过该长度时截断并显示 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-页码变化回调。
disabledbooleanfalse是否禁用。

组件内部固定 hideOnSinglePageshowSizeChanger={false}showQuickJumper={false}

回调出参

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

Upload

文件选择触发组件,内部调用 @mbjia/utilsshowPicker

效果预览

文件选择

点击 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'选择器类型。
multiplebooleantrue是否多选。

回调与 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 支持的属性,例如 classNamestyleonClick

MBJIA Tools 文档