ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

antd Badge dot 模式详解:无数字小红点的显示规则、源码实现与样式定制

antd Badge dot 模式详解:无数字小红点的显示规则、源码实现与样式定制 antd Badge dot 模式详解无数字小红点的显示规则、源码实现与样式定制【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design本篇围绕 antd Badge 组件的dot模式展开通过官方示例 dot 对应的 demo 代码结合 Badge 组件实现 与 样式层定义讲清无数字小红点何时显示、何时隐藏count为 0 时不显示、DOM 结构与样式如何生成帮助你在消息提醒、通知入口等场景中正确使用并定制这一轻量级徽标形态。1. 什么是 dot 模式官方演示说明文档 dot.md 对这一模式的中英文描述非常凝练中文没有具体的数字。英文This will simply display a red badge, without a specific count. If count equals 0, it wont display the dot.仅显示一个红点不展示具体数量当 count 等于 0 时不显示该红点。这两句话点出了 dot 模式的两个核心语义只呈现有/无的视觉信号不呈现具体数值并且在无的状态下count 为 0红点本身也不渲染。它适合那些只需要提醒有新内容待处理、而不需要精确计数的场景例如通知铃铛、消息入口。2. dot 模式的标准用法对应 dot.md 的示例代码为 components/badge/demo/dot.tsx完整可复制运行import React from react; import { NotificationOutlined } from ant-design/icons; import { Badge, Space } from antd; const App: React.FC () ( Space {/* 用法一包裹图标 —— 通知铃铛右上角的红点 */} Badge dot NotificationOutlined style{{ fontSize: 16 }} / /Badge {/* 用法二包裹链接 —— 链接右上角的红点 */} Badge dot a href#Link something/a /Badge /Space ); export default App;两个要点dot是一个布尔属性传入即开启点状模式此时count的数字内容不会展示Badge 通过children包裹目标节点图标、链接、头像等红点以绝对定位锚定在子元素的右上角。在组件文档 index.zh-CN.md 的 API 表中dot的完整定义为参数说明类型默认值dot不展示数字只有一个小红点booleanfalse与之配合常用的属性还有offset[number, number]设置状态点的位置偏移用于微调红点落点和colorstring自定义小圆点的颜色默认为主题色badgeColor。3. 显示规则源码解析dot 与 count 的判定关系dot 模式的显示与否在 Badge.tsx 中由一组状态量级联推导得出理解这条判定链是掌握其行为的关键。3.1 零值判定与 showAsDot// components/badge/Badge.tsx关键片段 const numberedDisplayCount ( (count as number) (overflowCount as number) ? ${overflowCount} : count ) as string | number | null; const isZero numberedDisplayCount 0 || numberedDisplayCount 0 || text 0 || text 0; const ignoreCount count null || (isZero !showZero);随后是 dot 模式的核心开关const showAsDot dot !isZero; // L161dot 开启且 count 非 0 才以点呈现 const mergedCount showAsDot ? : numberedDisplayCount; // L163点模式下清空数字内容 const isHidden useMemo(() { const isEmpty !isReactRenderable(mergedCount) !isReactRenderable(text); return (isEmpty || (isZero !showZero)) !showAsDot; // L165-168 }, [mergedCount, isZero, showZero, showAsDot, text]);从这段实现可以确认三条规则Badge dot /不传 countcount默认为nullL69isZero为 falseshowAsDot为 true → 红点显示Badge dot count{5} /dot优先级高于数字mergedCount被置为空串 → 只显示红点、不显示 5Badge dot count{0} /isZero为 trueshowAsDot变为 false →红点隐藏。这正是演示文档中 If count equals 0, it wont display the dot 的底层依据。值得注意的一个细节dot 状态下数字被刻意清空后组件仍用isHidden综合mergedCount、text、showAsDot三者判断是否整体隐藏保证dot count{0}与纯空 Badge走的是同一条隐藏路径不会出现空胶囊占位。3.2 缓存机制防止退场动画抖动源码 L170-188 有三个缓存 ref其中与 dot 直接相关的是// We will cache the dot status to avoid shaking on leaved motion const isDotRef useRef(showAsDot); if (!isHidden) { isDotRef.current showAsDot; }注释明确说明其目的在元素退场leaved motion期间缓存 dot 状态避免红点在消失动画过程中形态抖动。类似地countRef与displayCountRef也在隐藏时保留上一次的值保证退出动画期间内容不突变。4. 渲染结构CSSMotion ScrollNumber 生成 ant-badge-dot在渲染分支中Badge.tsx带children的 Badge 会渲染span ref{ref} {...restProps} className{badgeClassName} style{mergedStyles.root} {children} CSSMotion visible{!isHidden} motionName{${prefixCls}-zoom} motionAppear{false} motionDeadline{1000} {({ className: motionClassName }) { // ... const isDot isDotRef.current; const scrollNumberCls clsx(mergedClassNames.indicator, { [${prefixCls}-dot]: isDot, // 点模式类名 [${prefixCls}-count]: !isDot, // 数字模式类名 [${prefixCls}-count-sm]: size small, [${prefixCls}-multiple-words]: !isDot displayCount displayCount.toString().length 1, [${prefixCls}-status-${status}]: !!status, [${prefixCls}-color-${color}]: isInternalColor, }); return ( ScrollNumber prefixCls{scrollNumberPrefixCls} show{!isHidden} className{scrollNumberCls} count{displayCount} title{titleNode} keyscrollNumber / ); }} /CSSMotion /span由此可确认点模式的实际 DOM 结构与快照测试 demo.test.tsx.snap 中renders components/badge/demo/dot.tsx correctly用例的输出一致span classant-badge NotificationOutlined / span classant-scroll-number ant-badge-dot aria-labelShow badge dot styleposition: absolute; ... /span /span几个值得了解的实现事实dot 与 count 共用同一个ScrollNumber节点区别仅在于类名ant-badge-dotvsant-badge-count与是否为空内容显隐动画由CSSMotion驱动动效名为ant-badge-zoommotionDeadline{1000}兜底防止动画卡死点模式下不会生成ant-badge-multiple-words类该类仅在数字超过一位时添加因此点的大小不会随 count 增大而拉伸title属性会落在ScrollNumber节点上dot 场景默认无 title 内容。5. 样式层dot 的尺寸、颜色与投影点状徽标的视觉规格集中在 components/badge/style/index.ts[${componentCls}-dot]: { zIndex: token.indicatorZIndex, width: dotSize, minWidth: dotSize, height: dotSize, background: token.badgeColor, borderRadius: 100%, boxShadow: 0 0 0 ${unit(badgeShadowSize)} ${token.badgeShadowColor}, }, [${componentCls}-count, ${componentCls}-dot, ${numberPrefixCls}-custom-component]: { position: absolute, top: 0, insetInlineEnd: 0, transform: translate(50%, -50%), transformOrigin: 100% 0%, // 若子元素含 loading 图标红点跟随旋转动画 [${iconCls}-spin]: { animationName: antBadgeLoadingCircle, animationDuration: 1s, animationIterationCount: infinite, animationTimingFunction: linear, }, },可以从中读出 dot 模式的设计细节尺寸由组件 TokendotSize决定组件 Token 定义见宽高与最小宽统一borderRadius: 100%保证正圆默认宽度小于数字徽标indicatorHeight呼应其轻量提示的定位锚点定位top: 0; insetInlineEnd: 0; transform: translate(50%, -50%)即精确落在子元素右上角交点且insetInlineEnd为逻辑属性天然适配 RTL 布局投影badgeShadowColor让红点在白色容器上也有清晰的描边效果背景色来自badgeColor可通过主题全局调整也可通过color属性在实例级覆盖源码 L292-295 会将非预设色写入内联background子元素 loading 时的联动当被包裹的图标处于spin状态时红点会继承旋转动画视觉上与加载中的语义保持一致。如需微调红点落点使用offset属性即可其解析逻辑在 Badge.tsxoffset[0]转为数字后作用于insetInlineEndoffset[1]直接作为marginTop。6. 测试用例对行为的固化单元测试 components/badge/tests/index.test.tsx 用两条断言固化了 dot 的关键行为it(badge dot not scaling count 9, () { const { container } render(Badge count{10} dot /); expect(container.querySelectorAll(.ant-card-multiple-words).length).toBe(0); }); it(badge dot not showing count 0, () { const { container } render(Badge count{0} dot /); expect(container.querySelectorAll(.ant-badge-dot).length).toBe(0); });前者验证dot 模式不随 count 变大而变宽不产生多位数类名后者验证count 为 0 时.ant-badge-dot节点完全不渲染。这两条与 dot.md 的文档描述一一对应可作为回归验证 dot 行为的基准。7. dot、count、status 三种形态的选择建议场景推荐形态示例需要精确数量、且有封顶需求countoverflowCount默认 99超出显示99Badge count{120} /只需有新消息信号不想暴露数量dotBadge dotBellOutlined //Badge表达系统/服务状态成功、错误、处理中status 可选textBadge statusprocessing text同步中 /想自定义红点颜色dotcolor预设色键或任意 CSS 颜色值Badge dot colorgold /从源码判定链看Badge.tsxstatus/color与dot属于不同分支hasStatus要求ignoreCount为真即 count 为 null 或为 0 且showZerofalse当dot与count同时存在且 count 非 0 时dot分支先生效数字被吞掉。混用各种形态的组合渲染由 mix 演示 及其快照覆盖。8. 小结dot是 Badge 的布尔开关默认false开启后徽标退化为纯红点数字被清空dot模式下count{0}会使红点整体隐藏这是源码中showAsDot dot !isZero的直接结果并有专门测试固化红点与数字共用ScrollNumber节点靠ant-badge-dot类名区分显隐走ant-badge-zoom动效并有 ref 缓存防止退场抖动尺寸、颜色、投影分别由组件 TokendotSize、badgeColor、badgeShadowColor控制实例级可用color与offset覆盖完整 API 与语义化结构classNames/styles的indicator槽位可用于给红点追加自定义类与内联样式见 Badge 中文文档。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表