Vue评分组件通过作用域插槽实现星星符号自定义,透出index、isFilled、isHalf状态,支持文本/图标/SVG等任意内容替换,并提供默认★兜底及统一CSS样式控制。

Vue 组件插槽实现评分星星中自定义符号的模板替换,核心是用 作用域插槽(scoped slot) 把每颗星的渲染权交给使用者,同时把当前星序号、是否激活、是否半星等状态透出,让外部自由决定显示什么内容——文字、图标、SVG、甚至带动画的元素。
用默认插槽 + 作用域数据控制单颗星渲染
在 Rate.vue 中,不硬编码 ★ 或 ☆,而是用 v-for 循环生成星星容器,并为每一项通过 <slot></slot> 分发作用域属性:
- 用
slot="star"命名插槽(或直接用默认插槽),配合v-slot:star="{ index, isFilled, isHalf }"接收上下文 -
index表示第几颗星(从 1 开始),isFilled表示是否全亮,isHalf表示是否半星(需开启allowHalf) - 父组件里就能用任意 HTML 替换单颗星,比如 SVG 图标、字体图标、甚至带 Tooltip 的 div
支持字符/图标/自定义内容三合一
插槽方案天然兼容多种符号类型:
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
- 纯文本:传入
<template #star="{ isFilled }">{{ isFilled ? '★' : '☆' }}</template> - 字体图标:如使用 iconfont,可写
<i :class="isFilled ? 'icon-star-filled' : 'icon-star-empty'"></i> - SVG 内联:直接嵌入带 fill 动态绑定的 SVG 路径,颜色随
colorprop 实时变化 - 复合结构:比如在星旁加数字角标
<span class="star-badge">{{ index }}</span>
保留 fallback 逻辑,避免插槽未提供时空白
插槽不是必须的,组件应有兜底表现:
立即学习“前端免费学习笔记(深入)”;
- 在
<slot>外层包裹默认内容,例如:<slot name="star" :index="i" :isFilled="i <= rate" :isHalf="i === Math.ceil(rate) && rate % 1 === 0.5">★</slot> - 这样即使父组件没传插槽,仍能显示基础五星;一旦传了,就自动被覆盖
- 注意:半星判断要结合
allowHalf和小数逻辑,比如rate = 3.5时,第 4 颗星为isHalf=true
配合 CSS 控制自定义符号样式与间距
插槽内容由用户编写,但布局和基础样式仍需组件统一管理:
- 给每颗星容器设固定
display: inline-flex和gap,确保无论插槽内是什么元素,间距一致 - 用
:deep(.custom-star)允许父组件穿透设置内部 SVG 尺寸或字体大小 - 若用户传入的是图片或 SVG,建议组件暴露
sizeprop 并绑定到插槽作用域,方便外部按需缩放

















