前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载Rating 是 WordPress.com 前端项目 wp-calypso 中一个轻量级五星评分展示组件它以 0–100 的数值作为输入渲染出整颗、半颗或空心的星形图标广泛用于插件市场、应用评价等场景。本文将以 client/components/rating/README.md 为骨架结合组件源码、样式与单元测试讲清它的用法、Props 约定、0–100 到五星的映射原理、双层遮罩渲染机制以及它在真实业务页面中的集成方式。组件定位与文档定义按照 README.md 的定义Rating 组件用于显示一组 5 颗星每颗星可以是完全填充full colored、空心empty或半填充half-colored整体表示一个介于0 到 5之间的评分值。组件目录结构如下client/components/rating/ ├── README.md # 组件说明文档 ├── index.jsx # 组件核心实现 ├── style.scss # 组件样式 ├── docs/ │ └── example.jsx # DevDocs 交互示例 └── test/ └── index.js # 单元测试快速上手导入与基本用法文档给出的最小可用示例如下import Rating from calypso/components/rating; function render() { return Rating rating{ 65 } size{ 48 } /; }rating{ 65 }表示当前评分在 0–100 的刻度上取值为 65对应五星体系中的 3.25 星左右size{ 48 }将每颗星渲染为 48px × 48px。组件同时维护了一份用于 DevDocs 组件演示的示例 docs/example.jsx其写法与文档一致export default class RatingExample extends PureComponent { static displayName Rating; render() { return Rating rating{ 70 } size{ 48 } /; } }Props 详解Prop类型是否必填默认值说明ratingNumber否00–100 范围内的评分值用于决定星形填充比例sizeNumber否18每颗星图标的高度像素整行宽度随之按size × 5计算两点需要特别留意README 与源码存在默认值出入。文档描述 If it isnt defined size will be set to 24px但当前 index.jsx 中的defaultProps实际为{ rating: 0, size: 18 }且 test/index.js 明确断言未传size时组件宽度为 90px18 × 5因此以源码为准实际默认尺寸是 18px文档描述已滞后于实现。默认评分是 0。不传rating时组件渲染 0% 填充即全部空心星。从 0–100 到五星的映射原理文档指出rating的取值范围是 0–100而视觉上是 5 颗星因此核心问题是数值如何换算成星的填充比例从 index.jsx 的render()方法可以看到完整的换算链路const totalWidth size * 5; const roundRating Math.round( rating / 10 ) * 10; const maskPosition ( roundRating / 100 ) * totalWidth;换算分三步归一化到百分比rating / 100得到 0–1 的填充比例四舍五入到 10 的倍数Math.round( rating / 10 ) * 10将评分离散化到 10% 的粒度。这一步直接对应文档中half-colored半颗星的能力——5 颗星占据整行宽度的 100%每颗星占 20%那么 10% 的粒度恰好等于半颗星。例如rating 65→ 四舍五入为60→ 填充 60% → 3 颗整星rating 45→ 四舍五入为50→ 填充 50% → 2.5 颗星第三颗为半星rating 75→ 四舍五入为80→ 填充 80% → 4 颗整星。换算成像素宽度maskPosition 填充比例 × ( size × 5 )得到需要漏出的彩色像素宽度。由此可推rating在 0、10、20、…、90、100 这些 10 的倍数上会呈现稳定的整星或半星视觉其他取值会被就近归并这正是 test/index.js 中用[10, 20, 30, …, 100]十个离散值逐一验证遮罩位置的原因。源码实现双层星与 clip-path 遮罩从源码结构看Rating 采用**彩色底层 镂空遮罩的双层渲染策略**而不是逐个计算每颗星的部分填充这保证了半星效果的连续与平滑。整个组件是一个PureComponentindex.jsx由两个子层组成overlayStars()第 20–29 行渲染 5 个实心Gridicon iconstar作为已评分的彩色层outlineStars()第 31–49 行渲染 5 个Gridicon iconstar-outline作为底层的空心轮廓层。其中通过inverseRating 100 - Math.round( rating / 10 ) * 10与noFillOutlineCount Math.floor( inverseRating / 20 )计算出需要置空的星数并用clsx( { is-empty: isEmpty } )标记空星样式。两层通过绝对定位叠放见 style.scss 中.rating__overlay, .rating__star-outline { position: absolute; left: 0; top: 0; }再利用裁剪蒙版决定彩色层露出多少const overlayStyles { WebkitClipPath: inset(0 clipPathMaskPosition 0 0 ), clipPath: inset(0 clipPathMaskPosition 0 0 ), clip: rect(0, maskPosition px, overlayHeightPx , 0), width: totalWidth px, };clip-path: inset(0 right 0 0)从右侧裁掉totalWidth - maskPosition像素使彩色层只露出左侧maskPosition宽的填充区同时保留旧式clip: rect(0, maskPosition, height, 0)作为兼容写法供不支持clip-path的旧浏览器回退外层容器.rating显式设置width: size * 5、height: size。星形图标来自automattic/components的Gridicon渲染循环使用automattic/js-utils的times( 5, fn )工具函数生成。样式与主题定制style.scss 定义了组件的配色规则已填充星.rating__overlay .gridicon默认填充色为var(--color-primary)跟随 Calypso 全局主色变量空心星.is-empty填充色为var(--color-neutral-10)即中性灰当组件处于.full-width-section全宽区块上下文中时两种状态的星统一使用金色$rating-star-color: #ffb514用于强调视觉主题的页面。这意味着在业务代码中可以通过覆盖--color-primary/--color-neutral-10这两个 CSS 变量或复用.full-width-section包裹结构来低成本地改变评分配色的观感无需改动组件源码。单元测试行为契约的验证test/index.js 使用testing-library/react jsdom 环境把文档中描述的 Props 行为固化为可执行断言size 相关未传size时组件宽度为 90px对应默认 18px × 5传入size{ 48 }时容器宽度为48 × 5 240px每颗svg图标的宽度都等于size。rating 相关无评分rating缺省为 0时clipPath为inset(0 120px 0 0 )、clip为rect(0px, 0px, 24px, 0px)即彩色层完全被裁掉、只显示空心星对10 … 100十个评分逐一断言遮罩右边界inset(0 {width - mask}px 0 0 )与旧式rect值与上文映射公式一一对应。这些测试既验证了组件对外契约也印证了评分四舍五入到 10、按百分比裁剪的实现细节。实战集成插件详情页中的真实用法Rating 组件在实际业务中有一个典型落地场景WordPress.com 插件市场Marketplace的详情页。在 plugin-details-header/index.jsx 中评分数据从接口拿到的是 0–5 的ratings_average集成时先换算成组件所需的 0–100 刻度let rating plugin.rating ?? null; if ( isMarketplaceProduct ) { rating reviewsStats?.ratings_average ? ( reviewsStats.ratings_average * 100 ) / 5 : 0; }随后以size{ 20 }渲染在头部信息区第 156 行Rating rating{ rating } size{ 20 } /文本侧则借助 utils.js 的formatPluginRating把 0–100 的数值还原为 0–5 的小数形式例如 65 → 3.3、60 → 3与星形并列展示形成图形 数字的双通道呈现。同时业务层对rating 0无评分做了显式区分处理第 153 行的rating ! 0判断避免无评分商品渲染出 0 星误导用户。这一集成示例完整展示了上游 0–5 数据 → 乘以 20 归一化到 0–100 → 交给 Rating 渲染的通用换算套路其他业务模块可直接复用。使用建议与注意事项输入范围rating应传入 0–100 的数字传 5 分制的小数如 4.5会被当作 4.5% 处理渲染出近乎全空的星星务必先换算× 20显示粒度受四舍五入到 10 的约束评分会以半星为最小视觉单位如需更精细的连续填充需自行改造成不取整的遮罩计算默认尺寸当前实现默认 18pxREADME 中的 24px 描述已过期需要更大或更小的星星时显式传size性能组件继承PureComponent在rating、size未变化时不会重复渲染适合出现在列表等高频更新场景主题适配默认配色跟随--color-primary/--color-neutral-10全宽区块下自动切换为金色#ffb514业务侧可通过包裹.full-width-section或覆盖 CSS 变量调整观感。综上Rating 组件虽小却在数值 → 视觉的映射、双层遮罩渲染、默认值契约与主题变量化等方面提供了一个简洁而完整的参考实现开发者既可以开箱即用地展示评分也能基于其源码思路在自有项目中复刻同样的五星半星效果。赞分享前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载相关推荐wp-calypso SupportArticleDialog 组件解析在 Calypso 内联展示 WordPress.com 支持文档的完整实现指南wp calypso SupportArticleDialog 组件解析在 Calypso 内联展示 WordPress.com 支持文档的完整实现指南 导读前端CMSOmiu Rating 评分组件实战指南属性、事件与源码实现解析Omiu Rating 评分组件实战指南属性、事件与源码实现解析 导读 本文围绕 Omiu 组件库中 Rating 评分组件的官方 API 文档 api.m前端Web框架UI组件react-native-elements 评分组件全解析AirbnbRating 与 Rating 的 Props、源码实现与实战用法react native elements 评分组件全解析AirbnbRating 与 Rating 的 Props、源码实现与实战用法 本文以 reactUI组件移动开发前端上一篇Rust Enhanced语法高亮深度优化支持最新Rust特性的完整指南下一篇推荐开源项目goSDL - 打造安全的软件开发流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
