Ant Design Slider `tooltip.formatter` 完全指南:自定义提示内容与隐藏 Tooltip 的底层原理
Ant Design Slidertooltip.formatter完全指南自定义提示内容与隐藏 Tooltip 的底层原理【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design导读本文围绕 antd Slider滑条组件中tooltip.formatter这一 API 展开它允许开发者在用户拖拽手柄handle时按需格式化 Tooltip 中展示的值如追加%、货币符号或转为自定义 ReactNode并支持通过返回null或直接传null来彻底隐藏 Tooltip。读完本文你将掌握formatter的类型签名、undefined/null/函数三种传参下的差异、它在 antd 源码中的实现与默认行为以及若干可直接落地的实战写法。一、示例原型一次看懂 formatter 的两种核心用法该主题对应仓库中 tip-formatter demo 说明其配套源码为 tip-formatter.tsx核心代码如下import React from react; import type { SliderSingleProps } from antd; import { Slider } from antd; const formatter: NonNullableSliderSingleProps[tooltip][formatter] (value) ${value}%; const App: React.FC () ( Slider tooltip{{ formatter }} / Slider tooltip{{ formatter: null }} / / ); export default App;这段代码在同一页面渲染了两个滑块覆盖了formatter的两种典型语义传入格式化函数formatter: (value) \${value}%—— 滑条将当前值交给formatter函数返回值即为 Tooltip 中展示的内容。例如拖到 50 时 Tooltip 显示50%。传入nulltooltip.formatter null—— 该滑条上的 Tooltip 将完全不出现即使拖动或悬停也不展示。demo 中给出的formatter变量声明方式值得学习直接复用SliderSingleProps[tooltip]的formatter类型并通过NonNullable去除可空性保证回调参数value具备完整的类型推导避免手写类型与官方签名不一致。二、tooltip.formatter的 API 定义与参数语义在 Slider 组件 API 文档 中formatter的官方定义如下属性说明类型默认值版本formatterSlider 会将当前值传给formatter在 Tooltip 中展示其返回值当返回值函数内部返回为null时隐藏 Tooltipvalue ReactNode \| nullIDENTITY恒等函数4.23.0需要精确区分文档中提到的两种“隐藏”写法tooltip.formatter null配置层为null表示“禁用 formatter 且不展示 Tooltip”作用于整个滑块formatter函数内部返回null如(value) value 80 ? null : \${value}%表示“按当前值动态决定是否隐藏 Tooltip”可用于在值越过阈值后让提示自动消失。当返回类型为ReactNode时你甚至可以返回图标、span元素或任意 React 节点而不局限于纯文本。与tooltip.open的关系同属于tooltip子属性的还有 show-tooltip demo 讲解的openopen: true时 Tooltip 始终显示拖拽、悬停皆显示open: false时始终隐藏。两者侧重点不同open控制的是 Tooltip显隐开关不关心内容formatter控制的是 Tooltip 的内容渲染但其返回值又具备“反向干预显隐”的能力返回null即隐藏。若你希望 Tooltip 一直可见、但内容按需变化可组合使用tooltip{{ open: true, formatter }}。三、源码级解析默认行为与null隐藏的实现原理默认 formatter 并非简单透传若完全不传tooltip.formatter按文档默认值 IDENTITY 的字面理解是把值原样显示。查看 Slider 组件实现 可看到真实的兜底逻辑function getTipFormatter(tipFormatter?: Formatter) { if (tipFormatter || tipFormatter null) { return tipFormatter; } return (val?: number) (isNumber(val) ? val.toString() : ); }即源码内部做了三层分支处理formatter为函数直接采用返回值决定 Tooltip 内容formatter为null同样原样保留tipFormatter null被显式判断作为“隐藏标记”下发给底层渲染最终阻止 Tooltip 出现formatter为undefined未传使用内置默认函数把数值toString()后展示undefined值则渲染为空字符串。关键点在于undefined与null在 JS 中都被视为“空”但这里通过tipFormatter || tipFormatter null的显式分支区分了二者 ——只有null才代表“隐藏 Tooltip”而undefined会被默认函数接管。Tooltip 的显隐与对齐状态机在 index.tsx 中Tooltip 显隐由三组状态合并得出const [hoverOpen, setHoverOpen] useDelayState(false); const [focusOpen, setFocusOpen] useDelayState(false); ... const lockOpen tooltipOpen; const activeOpen (hoverOpen || focusOpen) lockOpen ! false;hoverOpen鼠标悬停手柄时置真focusOpen键盘聚焦手柄时置真滑块默认支持keyboard操作方向键移动同样会唤起提示lockOpen来源于tooltip.open起到“开关锁”作用。Tooltip 实际渲染时每次拖拽或聚焦都会把当前值通过formatter转换为title内容传给 SliderTooltip由其mergedOpen open !draggingDelete进一步决定最终显隐。对 Tooltip 基础组件的复用从实现看滑条提示并非自绘而是复用了 antd 的通用 Tooltip 组件)SliderTooltip是Tooltip的一层薄封装额外增加了两个职责——在拖拽删除手柄draggingDelete时强制关闭以及在每次内容变化后通过rafforceAlign()重新校正气泡位置见 SliderTooltip.tsx避免提示内容变宽后错位。因此你给 Slider 的tooltip.placement、tooltip.getPopupContainer等属性语义均与基础 Tooltip 对齐。四、测试验证官方如何保证formatter: null的行为仓库通过自动化测试锁定了该 API 的语义。在 tooltip.test.tsx 中有一条针对性用例it(tooltip should not display when formatter is null or open is false, async () { // ... Slider defaultValue{30} tooltip{{ formatter: null }} / // ... });测试名称直接印证了本文第一节的说法formatter为null与open为false效果等价——Tooltip 一律不显示无论用户是否悬停或拖拽。同时源码处的demo.test.ts、__tests__/__snapshots__/demo.test.ts.snap亦会对 tip-formatter.tsx 渲染出的快照进行比对确保50%这类格式化输出与 DOM 结构保持稳定你在改动业务逻辑时可据此回归。五、实战场景与最佳实践1. 数值单位 / 百分比Slider min{0} max{100} tooltip{{ formatter: (value) ${value}% }} /2. 货币与精度控制const priceFormatter (value?: number) ¥ ${(value ?? 0).toFixed(2)}; Slider min{0} max{1000} step{10} tooltip{{ formatter: priceFormatter }} /3. 返回 ReactNode实现图文混排import { SmileOutlined } from ant-design/icons; Slider tooltip{{ formatter: (value) ( span SmileOutlined / {value}% /span ), }} /4. 按值动态隐藏Slider defaultValue{30} tooltip{{ formatter: (value) (value ! undefined value 80 ? null : ${value}%), }} /此时值 ≤ 80 显示xx%一旦滑过 80Tooltip 便自动消失——这正是“返回值为null时隐藏 Tooltip”的典型用法。5. 始终展示并自定义内容组合openSlider tooltip{{ open: true, formatter: (value) 当前刻度${value}, }} /注意事项formatter回调可能收到undefined由上文默认函数对非数值的处理可知取值存在未命中数值节点的场景业务代码里建议先做空值兜底如(value) (value null ? : ...)隐藏语义请统一使用null不要用undefined表达“不想显示”——undefined会被源码视为“未配置”而落入默认文本显示分支若同时设置了tooltip.open: false无论formatter如何配置Tooltip 都会被强制隐藏两者优先级以open的开关逻辑为准见上文activeOpen计算tooltip.formatter自 4.23.0 版本引入旧版本中对应的过渡写法是顶层tipFormatterantd 在 index.tsx 的 deprecated 分支 中保留了兼容映射与弃用告警建议新代码统一走tooltip.formatter。六、小结tooltip.formatter是 antd Slider 中“轻量但高频”的内容定制入口传函数即可随心格式化提示文本或 React 节点传null即可整条禁用 Tooltip。配合源码中getTipFormatter的undefined/null分支设计、activeOpen状态机以及SliderTooltip的对齐刷新机制你既能快速写出符合业务语义的滑条也能在出现“Tooltip 为什么没显示/为什么一直显示”之类的疑问时准确回溯到底层判定逻辑。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →