尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

vue-star-rating 架构拆解:star-rating 与 star 双组件协作的实现原理

vue-star-rating 架构拆解:star-rating 与 star 双组件协作的实现原理 vue-star-rating 架构拆解star-rating 与 star 双组件协作的实现原理【免费下载链接】vue-star-rating:star: A simple, highly customisable star rating component for Vue 2.x. / 3.x项目地址: https://gitcode.com/gh_mirrors/vu/vue-star-ratingvue-star-rating 是一个简单且高度可定制的 Vue 星级评分组件同时支持 Vue 2.x 与 Vue 3.x被广泛应用于商品评价、课程打分、满意度调查等场景。它最值得学习的地方在于精巧的架构设计整个组件被拆分为star-rating 主组件与star 子组件两个角色一个负责评分逻辑与状态管理一个负责单颗星星的 SVG 渲染两者通过 props 下发和事件上报完成协作。本文将从源码层面拆解 vue-star-rating 的双组件协作原理帮助初学者快速看懂评分组件是怎么转起来的。vue-star-rating 组件目录结构一览先来看项目源码的布局整体非常精简核心代码只有三个文件src/index.js入口文件直接导出主组件 StarRatingsrc/star-rating.vue评分主组件负责全部业务逻辑src/star.vue单颗星星组件只负责渲染与原始交互src/classes/AlphaColor.js颜色解析工具类spec/star-rating.spec.js 与 spec/star.spec.js两套组件的测试用例入口文件 src/index.js 只有短短几行引入star-rating.vue并导出。也就是说用户在页面上使用的star-rating标签背后其实是主组件 若干子组件的完整协作体系。star-rating 主组件评分状态的管理中枢主组件是名副其实的大脑它负责接收外部配置、维护评分状态、计算每颗星星的填充度并把结果分发给子组件。主组件通过 props 接收全部配置在 star-rating.vue 中你可以看到一长串 props 定义它们构成了组件的可定制面rating初始评分默认 0max-rating最大评分即星星总数默认 5increment评分步长传 0.5 可实现半星传 0.01 可实现流式评分active-color/inactive-color点亮与未点亮颜色甚至支持传入颜色数组star-size、border-width、padding控制星星外观尺寸read-only、clearable、animate等控制交互行为值得一提的是active-color支持数组配合 padColors 方法颜色不足时会用最后一个颜色补齐实现每颗星星不同颜色的效果。内部状态与核心数据结构主组件内部维护了几个关键数据见 star-rating.vuecurrentRating鼠标悬停时的实时评分selectedRating用户点击确认的最终评分fillLevel[]每颗星星的填充百分比数组这是双组件协作的核心桥梁fillLevel的计算逻辑藏在 createStars 方法 中对第 i 颗星星如果完全在评分范围内则填 100部分覆盖则按比例计算。比如评分 3.5、increment 为 0.5 时前 3 颗填 100%第 4 颗填 50%。star 子组件单颗星星的渲染与交互如果说主组件是大脑star 子组件就是手脚——它只关心一件事把一颗星星画出来并上报用户的操作。用 SVG 画出可缩放的星星在 star.vue 中星星不是图片而是由linearGradient渐变填充 polygon多边形绘制的 SVG。渐变的关键在于starFill计算属性见 star.vue主组件传来的fill0~100被转换成渐变百分比fill%之前是点亮色之后是未点亮色一颗半亮半暗的星星就这样诞生了。默认的五角星坐标定义在 star.vue而calculatePoints方法会根据star-size等比缩放保证任何尺寸下星星都不失真这正是 SVG 方案相比图片方案的最大优势。子组件只上报原始事件star 子组件非常单纯它把鼠标移动和点击转换成两个自定义事件见 star.vuestar-mouse-move上报鼠标在星星内的位置百分比position和星星序号idstar-selected点击时同样上报position与id其中getPosition方法把鼠标坐标换算成 0~100 的百分比配合increment就能实现任意精度的评分。双组件如何协作props 下发与事件上报现在来看最关键的部分——两个组件如何握手。主组件通过 v-for 批量渲染星星在 star-rating.vue 的模板 中主组件用v-forn in maxRating循环渲染若干颗 star并把fill、size、active-color等 15 个 props 一次性下发给每个子组件。子组件不持有任何评分状态完全指哪打哪。子组件通过事件回调向上反馈当用户操作星星时子组件抛出原始事件主组件在模板中监听并回调star-mouse-movesetRating悬停时实时更新currentRatingstar-selectedsetRating($event, true)点击时固化评分并触发update:rating核心计算在 setRating 方法 中完成(星星序号 鼠标位置百分比) - 1再与max-rating取最小值最后通过$emit(update:rating)把结果同步给父页面从而完美支持 Vue 3 的v-model:rating双向绑定。悬停时则触发hover:rating事件方便开发者做实时预览。整个协作流程可以概括为外部配置 props 下发 → 子组件渲染并采集操作 → 事件上报 → 主组件计算状态 → 重新计算 fillLevel → 再次下发刷新星星形成闭环。颜色解析与发光特效的巧妙实现在视觉层面vue-star-rating 还提供了两个值得学习的小技巧。AlphaColor 类统一处理透明色SVG 渐变需要把颜色和透明度分开设置但用户可能传入rgba()、hsla()、#RRGGBBAA甚至transparent。为此项目抽离了 AlphaColor.js用正则识别各种颜色格式解析出纯色值和不透明度供 star.vue 的 getColor / getOpacity 方法 使用。把复杂逻辑隔离成独立类也让单测变得非常轻松。glow 发光效果的 SVG 滤镜实现如果你设置过:glow10会发现点亮星星自带柔和光晕。这个效果在 star.vue 的 filter 定义 中实现使用feGaussianBlur高斯模糊配合feMerge混合把模糊层叠加在原图形上纯 SVG 实现、零图片依赖。测试如何保障双组件协作的稳定性项目在 spec/ 下为两个组件分别编写了测试这套测试恰好也是理解架构的最佳辅助材料star-rating.spec.js 验证了所有默认 props 值比如默认 5 颗星、默认金色#ffd055、默认步长 1测试还验证了 fillLevel 的计算例如评分 3 时前 3 颗星星填充 100%见 star-rating.spec.jsstar.spec.js 验证了星星坐标随尺寸等比缩放交互测试则通过触发mousemove、click断言组件是否正确 emit 出hover:rating与update:rating见 star-rating.spec.js这些测试把双组件协作的每个环节都钉死无论是重构渲染逻辑还是调整事件流都能第一时间发现回归问题。总结双组件架构给我们的启示vue-star-rating 的架构拆解到这里就完成了回顾整个实现有几个设计思路非常值得借鉴职责分离状态计算与图形渲染彻底解耦star 子组件不关心任何业务规则单向数据流props 自上而下、事件自下而上数据流向清晰可追踪百分比中间态用fillLevel百分比数组作为桥梁天然支持半星、流式评分等高级特性纯 SVG 渲染无图片资源任意缩放不失真发光、圆角、自定义形状都能通过代码实现如果你正准备开发自定义组件或者想深入学习 Vue 组件通信模式不妨把 vue-star-rating 的源码作为入门范本边读边对照 star-rating.vue 与 star.vue 这两个核心文件很快就能建立起对容器组件 展示组件协作模式的直观认识。想要亲手实验只需 clone 仓库后运行npm install npm run serve打开示例页面即可看到各种配置下的星星效果。【免费下载链接】vue-star-rating:star: A simple, highly customisable star rating component for Vue 2.x. / 3.x项目地址: https://gitcode.com/gh_mirrors/vu/vue-star-rating创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表