尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ant Design App 组件完全指南:用 `useApp` 统一管理 Message / Notification / Modal

Ant Design App 组件完全指南:用 `useApp` 统一管理 Message / Notification / Modal Ant Design App 组件完全指南用useApp统一管理 Message / Notification / Modal【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design导读App是 Ant Design 5.1.0 引入的「包裹组件」它解决了两类高频痛点一是让message.xxx、notification.xxx、Modal.xxx等静态方法能够通过 React Context 消费主题与配置从而省去手动植入contextHolder的繁琐二是提供基于.ant-app容器的默认重置样式让原生元素自动获得 antd 的字体、颜色、行高等规范。阅读本文后你将掌握App的基础用法、与ConfigProvider的正确嵌套顺序、内嵌/全局redux等实战场景以及component、message、notification三个核心属性的底层实现原理。何时使用官方文档明确了App的两大适用场景提供可消费 React Context 的message.xxx、Modal.xxx、notification.xxx静态方法简化useMessage等方法需要手动植入contextHolder的问题提供基于.ant-app的默认重置样式解决原生元素没有 antd 规范样式的问题默认继承 antd 的字体族、字号、行高与文本颜色。从源码看App 内部正是通过组合useMessage、useModal、useNotification三个 Hook 生成实例并通过AppContext.Provider下发见 components/app/index.tsx。容器元素的样式由 components/app/style/index.ts 中的genBaseStyle生成将colorText、fontSize、lineHeight、fontFamily等 Design Token 落到.ant-app类上。如何使用基础用法App.useApp()App组件通过Context提供上下文方法调用因此App.useApp()必须在App的子组件中使用官方推荐在应用顶层包裹Appimport React from react; import { App } from antd; const MyPage: React.FC () { const { message, notification, modal } App.useApp(); message.success(Good!); notification.info({ message: Good }); modal.warning({ title: Good }); // .... // other message, notification, modal static function return divHello word/div; }; const MyApp: React.FC () ( App MyPage / /App ); export default MyApp;注意App.useApp必须在App之下方可使用脱离App树使用会拿到空实例context.ts中AppContext的默认值即message/notification/modal三个空对象见 components/app/context.ts。官方「基本用法」演示components/app/demo/basic.tsx展示了三个按钮分别触发message.success、modal.warning、notification.info的完整交互与上述代码逻辑一致。与 ConfigProvider 的先后顺序App组件只能在ConfigProvider之下才能使用 Design Token如果需要使用其样式重置能力ConfigProvider与App组件必须成对出现ConfigProvider theme{{ ... }} App ... /App /ConfigProvider这是因为App内部从ConfigContext读取getPrefixCls来生成ant-app前缀类名见 components/app/index.tsx并通过useStyle(prefixCls)生成样式。放在ConfigProvider外Token 与主题定制将无法正确传导到.ant-app容器上。内嵌使用场景如无必要尽量不做嵌套App Space ... App.../App /Space /App嵌套是允许的但官方建议“如无必要尽量不做嵌套”。从源码可以看到内层App的配置会与外层App的配置做浅合并{ ...appConfig.message, ...message }见 components/app/index.tsx同时内层App会重新创建一套 message/notification/modal 实例与AppContext.Provider。对应的测试用例 components/app/tests/index.test.tsx 验证了嵌套时配置合并的行为内层覆盖同名键未覆盖的键继承外层。全局场景redux 场景若要在 React 树之外如 redux action、工具函数、网络层调用 message/notification/modal可以将App.useApp()返回的实例存入模块级变量后导出// Entry component import { App } from antd; import type { MessageInstance } from antd/es/message/interface; import type { ModalStaticFunctions } from antd/es/modal/confirm; import type { NotificationInstance } from antd/es/notification/interface; let message: MessageInstance; let notification: NotificationInstance; let modal: OmitModalStaticFunctions, warn; export default () { const staticFunction App.useApp(); message staticFunction.message; modal staticFunction.modal; notification staticFunction.notification; return null; }; export { message, notification, modal };// sub page import React from react; import { Button, Space } from antd; import { message } from ./store; export default () { const showMessage () { message.success(Success!); }; return ( Space Button typeprimary onClick{showMessage} Open message /Button /Space ); };注意这里对modal的推导使用了OmitModalStaticFunctions, warn这是为了让全局导出的modal类型与App.useApp()返回的modalHookAPI见 components/app/context.ts保持一致——Hook 形式不提供warn方法。全局配置message与notification属性在App上可以直接传入message和notification配置对该App树内的所有调用统一生效// 官方「Hooks 配置」演示components/app/demo/config.tsx export default () ( App message{{ maxCount: 1 }} notification{{ placement: bottomLeft }} MyPage / /App );上例中同一时刻只保留 1 条 messagemaxCount: 1notification 统一出现在bottomLeft位置。对应的测试用例验证了maxCount限制真实生效触发 2 条 message 后 DOM 中只有 1 个.ant-message-notice触发 3 条 notification 后只有 2 个.ant-notification-notice见 components/app/tests/index.test.tsx。MessageConfig的完整字段定义在 components/message/interface.tstop距顶部偏移、duration显示时长秒、prefixCls类名前缀、getContainer渲染容器、transitionName过渡动画名、maxCount最大显示条数、rtl。NotificationConfig在此基础上还包含placement、bottom等定位字段使用时可参考 Notification 文档 与 Message 文档。优先级规则嵌套App时外层配置会被内层继承并合并内层同名配置优先生效。测试 components/app/tests/index.test.tsx 验证了{ message: { maxCount: 10, top: 20 } }与{ message: { maxCount: 11 } }合并后得到{ maxCount: 11, top: 20 }——即内层覆盖maxCount外层top保留。API 属性一览通用属性参考 通用属性。自antd5.1.0版本开始提供该组件。参数说明类型默认值版本component设置渲染元素为false则不创建 DOM 节点ComponentType | falsediv5.11.0messageApp 内 Message 的全局配置MessageConfig-5.3.0notificationApp 内 Notification 的全局配置NotificationConfig-5.3.0component的底层实现见 components/app/index.tsx为false时渲染React.Fragment不产生 DOM 节点也不注入className/style为合法组件字符串如section或组件时渲染对应元素。测试用例验证了App componentsection会产出section.ant-app而App component{false}不会产生.ant-app节点见 components/app/tests/index.test.tsx。除了上表App还透传className、style、rootClassName、prefixCls等通用属性到.ant-app根节点测试中验证了自定义className与style会正确落到.ant-app上components/app/tests/index.test.tsx。主题变量Design TokenApp的样式只消费全局基础 TokencolorText、fontSize、lineHeight、fontFamilyComponentToken默认保持为空见 components/app/style/index.ts因此无需单独配置 App 的组件级 Token。若需自定义可通过ConfigProvider theme调整全局 Token再配合本文「与 ConfigProvider 先后顺序」一节的结构生效。FAQCSS Var 在App component{false}内不起作用请确保App的component是一个有效的 React 组件字符串以便在启用 CSS 变量时有一个容器来承载 CSS 类名。源码层面useStyle生成的cssVarCls需要挂载在真实 DOM 容器上component{false}时渲染的是React.Fragment没有承载节点开发模式下还会触发devUseWarning警告components/app/index.tsx。测试 components/app/tests/index.test.tsx 验证了ConfigProvider theme{{ cssVar: true }}配合App component{false} /时控制台会输出对应警告。小结App组件把 message/notification/modal 从“手动挂载 contextHolder”的样板代码中解放出来同时提供了统一重置样式与全局配置注入能力。生产实践中建议在ConfigProvider之下、应用最外层包一个App尽量不嵌套多层App树外调用场景redux 等可将App.useApp()实例提升为模块级变量导出。这样即可让全站所有消息反馈组件统一消费主题 Token 与全局配置获得一致的视觉与行为表现。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表