v0.1.9

ConfigProvider 全局配置

引入import { DEFAULT_CONFIG_CONTEXT, DefaultRenderEmpty } from '@apollo-design/ui';

为应用或特性子树提供当前主题、语言、尺寸、禁用、方向和组件默认配置。

代码演示

加载中…

前缀 #

默认类名前缀是 apollo,发布 CSS 仅包含该前缀。设置自定义前缀会更新 DOM 名称;样式需要构建期生成。

本示例的 prefix-cls.css 预先由 genComponentCss('empty', 'brand') 生成,作为静态文件引入。运行时只切换类名,不生成样式表。图标前缀独立由 iconPrefixCls 控制。

加载中…

语言包 #

locale 的替换、深更新和撤回保留业务节点。示例在 Empty 与 Pagination 上显示当前语言,同时保留输入草稿。

useLocale(name) 返回两个 ComputedRef,脚本用 .value。没有 Provider 时语言码为 undefined;分片浅合并,缺失字段回退 en_US。global.clear 在 en_US / zh_CN 有 Apollo 文案,其它语言沿用默认回退。

加载中…

组件级配置 #

精确别名 empty / divider / spin / form 与 components map 共用当前配置链。map 的键和字段以各组件支持的配置为准,不等于自动应用全部组件 props。

嵌套时不同组件名继承,同名配置整体替换;直接别名优先于同名 map 项,组件自身显式 props 最优先。示例同时展示 Empty / Divider 的语义样式与 components.button.shape。

加载中…

尺寸与全局禁用 #

componentSize 与 componentDisabled 是两条独立的 context(与 antd 同), 下游用 useSize() / useDisabled() / useConfig() 读取。

两条判据不同,不能统一(这是最容易写错的地方):

开关 判据 为什么
componentSize componentSize || 父级 未设置就继承
componentDisabled componentDisabled ?? 父级 false 必须能显式关闭父级的 true

⚠️ 返回值是 ComputedRef(要 .value),不是 antd 那样的裸值 —— 裸值在 Vue 里等于把配置在 setup 期定死(差异 D27)。

加载中…

主题 #

theme 支持 token、algorithm(单个或数组)、components、cssVarPrefix 和 inherit。示例使用显式 section 宿主,让完整内容与 Alias 变量在 SSR 同树;原生宿主 attrs/style 按原生规则合并。

默认无宿主时客户端向实际原生根投射变量,SSR 直接原生槽根可序列化;opaque 组件或纯文本需要显式宿主才能获得完整服务端 CSS 作用域。算法切换与 useTheme().config 可写 Ref 保留业务草稿,外部主题变更会恢复外部配置。组件令牌由各组件消费者落地,不在运行时生成 CSS 选择器。

加载中…

布局方向 #

通过 direction 切换整棵子树的 LTR / RTL 排列方向,输入框、按钮与间距会同步响应。

加载中…

组件尺寸 #

使用 componentSize 统一设置子树内 Input、Button 等组件的尺寸,下拉框可实时切换 small / middle / large。

加载中…

读取配置 #

在 ConfigProvider 内部调用 useConfig() 读取 componentSize 与 componentDisabled,并用外部下拉框和开关实时验证上下文同步。

见 demo/:前缀、语言、组件配置、尺寸与禁用、主题、动态尺寸、方向和 useConfig,共 8 个示例。

API

Props

参数 说明 类型 默认值
scopeTag 可选的原生作用域宿主;省略时不增加包装节点。选择符合 HTML / SVG 内容模型的标签 ConfigProviderScopeTag —
prefixCls 组件 DOM 类名前缀;自定义前缀需配套静态 CSS string 'apollo'
iconPrefixCls 图标前缀,独立于组件前缀 string 'apollo-icon'
getPopupContainer 浮层容器;函数随配置更新读取 (trigger?: HTMLElement) => HTMLElement | ShadowRoot —
getTargetContainer Affix / Anchor 等滚动感知组件的目标解析器 () => HTMLElement | Window —
renderEmpty 空状态内容工厂;返回 null、undefined、false 或空字符串可有意留空 RenderEmptyHandler,返回 VNodeChild 各消费者的默认空状态
locale 当前语言包;替换、深更新及撤回不会重挂业务内容 Locale 继承,分片缺失时回退英文
componentSize 控件默认尺寸;组件自己的 size 优先 'small' | 'medium' | 'middle' | 'large' 继承
componentDisabled 默认禁用;子级或组件显式 false 可覆盖父级 true boolean false
direction 布局方向 'ltr' | 'rtl' 继承
virtual 支持虚拟滚动的消费者的默认开关 boolean true
variant 输入、选择和表单控件的默认形态 'outlined' | 'borderless' | 'filled' | 'underlined' 继承
popupMatchSelectWidth Select / TreeSelect / Cascader 等的浮层宽度默认值;局部配置优先 boolean 消费者默认值
theme 主题预设、明暗模式、用户/组件令牌、算法及 CSS 变量前缀 ConfigProviderThemeConfig 继承
warning 开发告警行为;strict: false 聚合弃用告警 { strict?: boolean } {}
components 按各组件契约声明的默认配置,以消费者名称为键;不会自动应用任意组件 prop Record<string, ComponentConfigLike> —
divider Divider 的精确配置别名 DividerConfig —
empty Empty 的精确配置别名 EmptyConfig —
spin Spin 的精确配置别名 SpinConfig —
form 已接入 Form 的默认配置,含校验消息、必填标记、冒号、标签及语义样式等 FormConfig —

继承与内容

本层 undefined 回落到父级;撤回先前设置的值也会回落。components 按组件名合并,同名组件配置整体替换;divider / empty / spin / form 精确别名覆盖同名 map 项,组件自己的显式 prop 最优先。

theme.token 按键合并,theme.components 按组件名和令牌键合并;inherit: false 重置父级令牌和组件令牌,保留外层 CSS 变量前缀。表单校验消息按默认数据、父 FormProvider、本地语言和当前有效 form 配置合并;components.form.validateMessages 与 form.validateMessages 共用同一通道。

theme.preset 接受公开 ThemePreset 对象;内置预设分别从 @apollo-design/theme/presets/default、mono、material3 导入。mode 为 light/dark/system,与预设独立。预设基础配置及当前明暗配置先合并,用户 Seed 再进入算法,用户 Alias 和组件令牌保持最终优先。局部显式 algorithm 保留其原有完整链并替代继承 mode;局部 mode 替代继承 algorithm。此组件默认继承原始配置;基础包的 ThemeProvider 保留显式空主题重置,需 inherit:true 才继承。活跃 Provider 在 mounted 后跟随系统偏好并释放监听,SSR 的 system 默认亮色。完整变量由当前 Provider 投影,不必为 Mono 加载默认 tokens.css;UI 结构样式仍需引入。

默认插槽接收完整 Vue 内容,支持条件内容和多根。没有业务 emits、v-model 或 expose。默认无宿主时 Provider 的 class / style / id / 原生监听器等 attrs 不落到子节点;显式设置 scopeTag 时 attrs 落到该原生宿主,原生 style 优先于主题变量。scopeTag 是结构选择,改变标签遵循 Vue 原生根替换语义;切换 theme / locale 等配置不会改变内容的逻辑树。

主题、SSR 与样式

默认保持 renderless,主题变量在客户端投射到实际原生根,包括动态根和 Portal 内容;不会移动或重建业务节点。原生根自己的 CSS 变量声明优先,卸载或撤回时释放自己的写入并恢复原值。

SSR 会在直接原生槽根上序列化当前 Alias 变量。无法从外部自动给不透传 attrs 的 opaque 组件或纯文本建立服务端 CSS 作用域;需要完整首帧样式时,显式提供符合内容模型的宿主,例如 <ConfigProvider scope-tag="section" :theme="theme">。表格可用 <table><ConfigProvider scope-tag="tbody"><tr>…</tr></ConfigProvider></table>;默认无宿主也可以安全地位于既有 tbody、ul、select 或 SVG 内。水合时使用相同配置和内容。

静态 CSS 通过变量响应主题,不在运行时生成选择器。发布 CSS 默认只有 apollo 前缀;本页前缀 Demo 单独引入了构建期生成的 brand CSS。theme.cssVarPrefix 改变变量名,需要消费者样式使用相同名字。组件令牌由相应消费者写入和使用,不等于全库所有任意键均有视觉效果。

废弃属性

旧名 新名
autoInsertSpaceInButton components.button.autoInsertSpace
dropdownMatchSelectWidth popupMatchSelectWidth

静态方法与 composable

名称 说明
ConfigProvider.ConfigContext InjectionKey<ConfigContextValue>,可用于 inject;常规读取使用 useConfigContext()
ConfigProvider.config / setGlobalConfig 模块级设置器,传 { prefixCls?, iconPrefixCls?, theme? },返回 void;静态 Modal 等按其消费链读取,不能替代应用内响应式 props
ConfigProvider.useConfig / useConfig 返回 componentDisabled、componentSize 两个 ComputedRef
useDirection / useThemeConfig 当前方向 / 主题配置的 ComputedRef;无活跃主题源时后者为 undefined
useComponentConfig(name) 当前组件配置的惰性视图,在 render / computed 中读取;setup 解构原始值会保存快照

@apollo-design/locale 的 useLocale(name) 统一返回 [ComputedRef<分片>, ComputedRef<语言码>],脚本中读 .value,模板会解包。主题包 useTheme().config 是可深写的实例 Ref:赋值替换当前有效配置,深写不修改父级或 props;外部主题源变化时重新以外部配置为准。

当前开发版移除了没有消费者的 csp、wave、popupOverflow 和 theme.prefixCls,以及旧 useLocaleReactive 双通道;见集中迁移记录。

最近的显式 ThemeProvider 也属于当前主题来源,包括空配置 {} 的默认主题重置。嵌套 ConfigProvider 会在所属原生根投影该来源;没有显式来源时保留纯 CSS 变量继承。

Powered by Vue 3 + ViteApollo Design · Vue NativeGitHub