十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 Refine v5 Ant Design NumberField 组件实战基于 Intl 的本地化数字格式化【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine导读NumberField是 Refine 面向 Ant Design 体系提供的数字展示字段组件用于在列表页、详情页中按浏览器 locale 格式化输出数字千分位、小数位、货币、百分比、科学计数等并自动右对齐。本文以 NumberField 官方文档 为主体结合refinedev/antd的源码实现、共享类型定义与 UI 测试完整讲解其用法、Props 语义、底层原理与自定义路径帮助你直接在 Refine 项目中落地本地化数字展示。组件定位面向展示的数字格式化字段在 Refine v5 的 Ant Design 集成包中NumberField与BooleanField、DateField、EmailField、UrlField等一同位于 fields 组件集 内职责单一把原始数值按浏览器 locale 格式化为可读文本并渲染。import { NumberField } from refinedev/antd;它接收一个value通过 packages/antd/src/components/fields/number/index.tsx 中的实现完成格式化与渲染export const NumberField: React.FCNumberFieldProps ({ value, locale, options, ...rest }) { const number Number(value); return ( Typography.Text {...rest} {toLocaleStringSupportsOptions() ? number.toLocaleString(locale, options) : number} /Typography.Text ); };实现要点有三强转数值Number(value)统一把传入值转为 number因此value可以是数字、数字字符串等可转换类型Intl 能力探测toLocaleStringSupportsOptions()检测当前运行时是否提供Intl.NumberFormat决定走格式化分支还是原样输出复用 Ant Design Typography最终通过Typography.Text渲染天然继承其对齐、样式能力NumberField在布局中表现为右对齐的文本字段。底层原理Intl.NumberFormat 与降级策略组件文档明确指出NumberField使用Intl来格式化数字。核心行为可概括为两条分支Intl 可用时调用number.toLocaleString(locale, options)等价于以locale作为第一参数、options作为第二参数构造Intl.NumberFormat(locale, options)后格式化。这使得小数位、货币、百分比、科学计数法等展示都做到浏览器 locale 级别的“完美显示”。Intl 不可用旧环境NumberField直接输出原始数字并忽略locale与options两个 props。能力探测逻辑位于 number/index.tsxfunction toLocaleStringSupportsOptions() { return !!( typeof Intl object Intl typeof Intl.NumberFormat function ); }这意味着同一个组件在支持Intl的现代浏览器中呈现格式化结果在缺失该能力的环境下退化为原始数值展示组件本身不会抛错适合需要兼容老旧运行环境的内部工具类应用。Props 详解与类型来源NumberField的 props 类型NumberFieldProps定义在 packages/antd/src/components/fields/types.tsexport type NumberFieldProps RefineFieldNumberPropsReactNode, TextProps;它由共享包refinedev/ui-types的RefineFieldNumberProps与 Ant DesignTextProps组合而成。共享类型的完整定义位于 packages/ui-types/src/types/field.tsxProp类型说明valueReactNode实际会被Number()强转要展示的字段值必填localestring \| string[]覆盖浏览器 locale作为Intl.NumberFormat()的第一参数传入optionsIntl.NumberFormatOptions数字格式化选项作为Intl.NumberFormat()的第二参数传入例如notation、style、currency、maximumFractionDigits等其中locale与options的语义在类型注释中与Intl.NumberFormat()的参数一一对应locale支持单个字符串如de-DE或字符串数组如[de-DE, en-US]按优先级依次尝试options则为标准的Intl.NumberFormatOptions对象。此外由于最终渲染在Typography.Text上该组件同时接受 Ant Design Text 组件的全部属性如strong、type、ellipsis、style等文档以 External Props 形式单独注明。实战用法在 Table 列中展示紧凑格式数字官方文档给出的典型场景是在useTable驱动的表格列中格式化命中数hit使用notation: compact把大数字显示为1.2K这类紧凑形式import { List, NumberField, useTable, } from refinedev/antd; import { Table } from antd; const PostList: React.FC () { const { tableProps } useTableIPost(); return ( List Table {...tableProps} rowKeyid Table.Column dataIndexid titleID / Table.Column dataIndextitle titleTitle / Table.ColumnIPost keyhit titleHit dataIndexhit render{(value) ( NumberField value{value} options{{ notation: compact, }} / )} / /Table /List ); }; interface IPost { id: number; title: string; hit: number; }要点拆解通过Table.Column的render回调拿到原始value交给NumberField渲染options直接透传给Intl.NumberFormat因此Intl.NumberFormatOptions中所有能力style: currency配currency: EUR、maximumFractionDigits/minimumFractionDigits、notation、percent等在这里全部可用无需手动处理 locale未传locale时自动采用浏览器默认 locale。除了表格NumberField同样适合直接放在Show详情页、描述列表Descriptions等任意需要展示格式化数字的位置因为它本身就是一个自包含的展示组件。行为边界不可解析值的表现源码测试验证NumberField对不可解析输入的表现由 packages/ui-tests/src/tests/fields/number.tsx 中的共享测试明确锁定而 number/index.spec.tsx 通过fieldNumberTests.bind(this)(NumberField)将其绑定到本组件上保证行为跨 UI 包一致正常格式化对12345.6789传入localede-DE与style: currency、currency: EUR、固定小数位等 options 时输出与testPrice.toLocaleString(locale, options)一致测试中还处理了 Node 14 下不间断空格与普通空格差异导致的兼容性问题value为undefined渲染结果为NaNvalue为不可解析字符串如not a number渲染结果同样为NaN。这一行为来自实现中的Number(value)强转任何无法转换为有限数值的输入都会落到NaN。编写页面时若数据可能缺失建议在业务层做默认值兜底如value{item.hit ?? 0}避免界面直接出现NaN。深度自定义使用 Refine CLI 进行 swizzle官方文档特别提示该组件支持通过Refine CLI执行 swizzle 操作把组件源码“抽离”到你的项目中再行定制。CLI 的完整使用说明位于 documentation/docs/packages/cli/index.md其核心流程是在项目根目录运行 Refine CLI 的 swizzle 命令从命令面板中选择refinedev/antd包下的NumberField将组件源码复制进项目本地目录之后即可自由修改格式化逻辑、替换Typography.Text为自定义样式容器等。swizzle 之所以可行是因为NumberField的实现与类型定义完全独立组件本体在 number/index.tsx类型在 fields/types.ts依赖仅为antd的Typography抽离后不依赖包内私有状态改造成本低——例如你可以基于此实现“对负收益数字标红”“对超大数字追加单位后缀”等业务定制。小结NumberField是 Refine Ant Design 集成中一个“小而完整”的展示组件对外以Intl.NumberFormat为格式化核心天然支持 locale 与全套格式化选项对内通过共享类型与共享测试保证跨 UI 包的行为一致并以Typography.Text承接样式扩展当默认行为不满足需求时Refine CLI 的 swizzle 能力又提供了低成本的本地化定制路径。在表格列、详情页等场景中它都是本地化数字展示的首选方案。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表