ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

在 Ant Design 中用 character 属性定制 Rate 评分图标:字母、数字、图标与中文

在 Ant Design 中用 character 属性定制 Rate 评分图标:字母、数字、图标与中文 在 Ant Design 中用 character 属性定制 Rate 评分图标字母、数字、图标与中文【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-designRate 组件默认以星形图标表达评分等级但在问卷、表情评价、活动打分等场景中往往需要把“星星”替换为更有语义感的图形或文字。本文以 Ant Design 仓库中 character 官方演示 为线索完整讲解character属性支持的全部取值形态ReactNode、回调函数并结合组件源码、样式 Token 与测试用例说明自定义字符与半星、尺寸、Tooltip、键盘操作等能力如何协同工作帮助你直接复用出可运行的评分场景。演示要解决的问题把默认星形换成“其他字符”demo/character.md 的中文说明非常直白可以将星星替换为其他字符比如字母数字字体图标甚至中文。也就是说Rate 的每一个评分单元并不局限于StarFilled图标而是一个可完全自定义渲染内容的“字符槽”。把character属性从默认的星形图标换成任意内容即可得到不同的评分外观例如字母 A 作为评分刻度、中文“好/坏”作为评价文案、心形图标作为收藏评分等。官方演示完整代码与逐行解读character演示的可运行源码位于 components/rate/demo/character.tsximport React from react; import { HeartOutlined } from ant-design/icons; import { Flex, Rate } from antd; const App: React.FC () ( Flex vertical gapmedium Rate character{HeartOutlined /} allowHalf / Rate characterA allowHalf style{{ fontSize: 36 }} / Rate character好 allowHalf / /Flex ); export default App;这段代码用三条 Rate 实例展示了三类最常见的自定义字符character{HeartOutlined /}传入一个图标元素ant-design/icons的心形图标。由于图标字体天然跟随父级font-size缩放因此可以像文字一样参与半星裁切。characterA传入字母字符串配合style{{ fontSize: 36 }}放大字号得到“36px 的 A 字评分条”。character好传入中文字符直接得到中文语义的评分单元。三条 Rate 都开启了allowHalf半选说明自定义字符与半星模式可以无缝组合——这一点与官方文档 API 表格中的allowHalf默认false一致。而整个示例用Flex vertical gapmedium纵向排布保证三个评分条之间有合理的间距。character 属性的完整取值类型官方 Rate API 文档 中character的类型定义如下属性说明类型默认值版本character自定义字符ReactNode \| (RateProps) ReactNodeStarFilled /function 写法自 4.4.0 起由此可以确定两点核心事实默认值是StarFilled星形实心图标这正是 index.tsx 中character StarFilled /解构默认值对应的内容character除了接收普通 ReactNode还支持回调函数写法4.4.0 起引入这正是另一则演示 character-function.md 的主题“可以使用(RateProps) ReactNode的方式自定义每一个字符”。进阶用函数按“第几个评分位”渲染不同字符只传一个 ReactNode会让所有评分位都长得一样当希望“12 星是哭脸、3 星是面无表情、45 星是笑脸”这类逐位差异化时就需要使用函数形式。仓库中配套的 components/rate/demo/character-function.tsx 给出了可直接复用的写法import React from react; import { FrownOutlined, MehOutlined, SmileOutlined } from ant-design/icons; import { Flex, Rate } from antd; const customIcons: Recordnumber, React.ReactNode { 1: FrownOutlined /, 2: FrownOutlined /, 3: MehOutlined /, 4: SmileOutlined /, 5: SmileOutlined /, }; const App: React.FC () ( Flex gapmedium vertical Rate defaultValue{2} character{({ index 0 }) index 1} / Rate defaultValue{3} character{({ index 0 }) customIcons[index 1]} / /Flex );这段代码演示了两个实用技巧数字评分character{({ index 0 }) index 1}利用回调参数中的index从 0 开始渲染1、2、3、4、5直接把 Rate 变成数字打分器按位映射图标character{({ index 0 }) customIcons[index 1]}通过index 1作为 key 去取事先准备好的图标映射表实现“低分哭脸、高分笑脸”的情感评分。回调参数被解构时给了index 0的默认值这是为了保证在 index 未传入等边界情况下仍然安全实际使用时建议同样保留这一默认值处理。源码级原理character 如何进入 RcRate 并兼容 Tooltip从 components/rate/index.tsx 可以看到 Rate 是对rc-component/rateRcRate的一层封装character相关的处理逻辑集中在几处const { ... character StarFilled /, ... } props; const characterRender: RcCharacterRender (node, { index 0 }) { if (!tooltips) { return node; } const tooltipsItem tooltips[index]; if (isPlainObjectTooltipProps(tooltipsItem)) { return Tooltip {...tooltipsItem}{node}/Tooltip; } return Tooltip title{tooltipsItem}{node}/Tooltip; }; return ( RcRate ref{ref} character{character} characterRender{characterRender} ... / );这里包含两层重要设计props 默认值合并未显式传入character时默认使用StarFilled /因此 API 表格中“默认值StarFilled /”是组件内部真实存在的兜底而不是文档空谈。characterRender与tooltips的组合自定义字符在最终渲染前会经过characterRender包装——一旦通过tooltips提供了逐位提示文案类型为TooltipProps[] | string[]见 API 文档包装层就会根据当前位index取出对应项并以Tooltip包裹该字符当该项是纯对象时透传其 TooltipProps否则视为title字符串。也就是说自定义字符并不会破坏逐位 Tooltip 提示能力两者在封装层被解耦处理。此外RateProps声明继承了 RcRate 的完整属性集合export interface RateProps extends RcRateProps并额外补充tooltips、size、rootClassName等因此character的类型即来自底层的character/characterRender两个通道。为什么自定义字符也能支持半星样式层的裁切机制许多自定义字符场景都会搭配allowHalf这背后依赖的是 Rate 的样式实现。查看 components/rate/style/index.ts 中genRateStarStyle的生成逻辑.ant-rate-star { // 每个评分位内部实际上叠放了 first/second 两层内容 -first, -second { color: token.starBg; } -first { position: absolute; width: 50%; height: 100%; overflow: hidden; // 左侧 50% 的裁切窗口 opacity: 0; } -half -first, -half -second { opacity: 1; } -half -first, -full -second { color: inherit; } }结合样式可以推断其工作原理每个评分单元会把同一字符渲染两遍其中-first层被绝对定位在一个宽度 50% 的隐藏裁切窗口中半星状态下两层同时显示从而视觉上只点亮左半侧字符全选时则由-full对应的右侧层呈现完整字符。因此只要自定义字符是正常渲染的文本/图标就能被这套 50% 裁切与叠色机制接管——字符外观可替换但“半颗星”的底层布局逻辑保持不变。这也是演示中“心形、字母、汉字 allowHalf”均可正确半选的原因。自定义字符的尺寸控制与组件 TokenRate 组件的字号直接决定了字符的显示大小。在样式入口 components/rate/style/index.ts 中可以看到根元素.ant-rate的fontSize取自token.starSize并提供了三档尺寸starSizeSMsmall、starSizeLGlarge与默认的starSizemedium换算关系为controlHeight * 0.625一类的基础控件高度比例size属性small | medium | large默认medium见 API 文档在 index.tsx 中被映射为ant-rate-small/ant-rate-large的 CSS 类。因此想要单独放大某个自定义字符有两种已验证的做法跟随组件尺寸直接使用sizelarge整条评分条的字符都会按starSizeLG放大单独覆盖字号仿照演示在 Rate 上写style{{ fontSize: 36 }}内联样式会覆盖 Token 生成的默认字号实现任意大小的字符展示。若要做全局主题化定制可参考 组件 Token 演示 中的思路通过 ConfigProvider 覆盖以下由 style/index.ts 声明的 Component TokenToken说明starColor星星/被选中字符颜色默认取token.yellow6starSize/starSizeSM/starSizeLG中/小/大档字号starHoverScale悬浮时的缩放变换默认scale(1.1)starBg未选中部分的底色默认token.colorFillContent值得留意的是该文件还展示了选中态、hover 放大与键盘焦点focus-visible描边样式都定义在字符的外层 div上因此自定义字符同样会获得悬浮放大、键盘聚焦描边等无障碍反馈而非只是“换了张皮”。character 之外的配套属性一览要让自定义字符的评分条完整可用通常会与下列官方属性组合均见 Rate API 文档此处整理与字符评分最相关的一组属性说明默认值allowHalf是否允许半选falsecount评分位总数5defaultValue非受控默认值0value受控当前值-disabled只读无法交互falsekeyboard支持键盘操作5.18.0 起truesize尺寸mediumtooltips逐位自定义提示TooltipProps[] \| string[]-onChange(value: number)选择回调-onHoverChange(value: number)鼠标悬停变化回调-onFocus/onBlur/onKeyDown焦点与按键回调-另外 Rate 实例还暴露blur()与focus()两个方法用于手动管理焦点。结合前文characterRender的实现可见tooltips既可以是字符串数组快捷提示文案也可以是逐位独立的TooltipProps对象数组可精细控制title、placement等两条路径都会正确包在自定义字符外层。测试验证演示被完整纳入快照与扩展渲染仓库的测试体系印证了character自定义字符是稳定的公开能力components/rate/tests/demo.test.tsx.snap 中存在renders components/rate/demo/character.tsx correctly与renders components/rate/demo/character-function.tsx correctly两组快照说明每个 demo 都会被真实渲染并与快照比对防止字符替换逻辑意外回归扩展上下文测试 demo-extend.test.ts.snap 同样覆盖这两个 demoextend context correctly验证其在 ConfigProvider 扩展上下文下仍可正常渲染components/rate/tests/index.test.tsx 通过focusTest、mountTest、rtlTest等共享测试用例见 tests/shared对 Rate 做了挂载、焦点与 RTL 方向的基线校验其中也包含对size类名ant-rate-small/ant-rate-large的断言。快速上手建议在实际项目中使用自定义字符时可遵循以下已被演示与源码共同验证的组合方式整体替换单值character{Icon /}或character字适合全量统一外观逐位替换character{({ index }) ...}适合按等级区分语义数字 15、哭脸/笑脸等记得对index做安全默认处理搭配半星allowHalf与自定义字符无冲突字符会被 50% 裁切层正确渲染调整大小优先用size需要精细控制时内联fontSize或走 ConfigProvider 覆盖starSize系列 Token补充可访问性与提示保持默认keyboard开启以获得方向键与焦点描边反馈需要逐位说明时传tooltips数组其会由characterRender自动包装到每个自定义字符上。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表