uni-app Vue 2 版本模板中不能使用管道符调用过滤器,应改用计算属性返回布尔或半星标识数组,配合三节点 DOM 结构实现跨端稳定星级渲染,并需对非数字评分做兜底处理。

uni-app里filter函数不能直接用在模板中
Vue 2 版本的 uni-app(当前主流)不支持在模板中使用管道符 | 调用过滤器,比如 {{ score | starFilter }} 会静默失效。这不是你漏写了 filters 选项,而是 uni-app 编译器对模板语法做了限制——它把过滤器编译成纯 JS 函数调用,但模板绑定时无法正确识别作用域内的 filters 定义。
用计算属性替代 filter 实现星级渲染
更可靠、可调试、且兼容所有平台的做法是:把星级逻辑封装进 computed,返回一个长度为 5 的布尔数组,再用 v-for 渲染图标。这样既能响应式更新,又避免了模板语法陷阱。
- 假设原始评分是数字
score = 4.2,需向下取整得满星数(Math.floor(score)),剩余小数部分决定是否显示半星 - 返回数组形如
[true, true, true, true, false]或[true, true, true, true, 'half'],便于模板中用v-if区分 - 注意:微信小程序里
<image>不支持动态src绑定 emoji 或字体图标,必须用真实图片路径或 uni-icons 等组件
半星显示必须手动拆分 DOM 结构
uni-app 没有原生半星组件,也不能靠 clip-path 或 mask 在所有端稳定生效(尤其 iOS 小程序)。最稳妥的方式是:为每颗星准备三个 DOM 节点 —— 左半、右半、全星容器,并用 v-show 控制显隐。
- 左半星图:只显示
0–0.5区间,对应score % 1 >= 0.5 - 右半星图:只显示
0.5–1区间,对应score % 1 > 0且非整数 - 全星图:显示
score >= 1的整数颗,用v-for循环渲染 - 别用
transform: scaleX(0.5)做半星——安卓低端机上会糊边,iOS 上可能被裁切
图标资源必须预加载,否则闪动或错位
星级图标如果用网络图(如 CDN 地址)或异步加载的 base64,首次渲染时会出现空白或跳变。真机上尤其明显,因为 <image> 加载完成时机不可控。
- 把五星、半星、空星三类图标全部放在
/static/icons/下,用相对路径引用(如/static/icons/star-full.png) - 确保所有图标尺寸一致(建议 40×40rpx),并设置
mode="aspectFill"防止拉伸变形 - H5 端若用字体图标(如 iconfont),需确认
@font-face已全局引入,且unicode值与 CSS 类名严格匹配
score: null 或 "--",直接 Math.floor(null) 会得 NaN,整个数组变成 [false, false, false, false, false],用户看到五颗空星却不知原因。务必在计算属性开头加 if (typeof score !== 'number' || isNaN(score)) return [false, false, false, false, false]。


















