uni-rate不能直接做滑动评分,因其本质是点击组件,allow-half仅影响点击行为,不激活touchmove逻辑;内部以整数更新v-model,@change事件无法获取4.5等半值;h5滑动跳星、小程序touchmove偶发失灵、app端nvue伪元素裁切失效。

为什么uni-rate不能直接做滑动评分
因为uni-rate本质是点击组件,allow-half只影响点击行为,不激活touchmove逻辑;它内部仍以整数更新v-model,@change事件永远拿不到4.5这类值;H5端滑动会跳星,小程序touchmove偶发失灵,App端nvue下伪元素裁切完全失效。
用view+touch事件实现滑动映射
核心是把手指偏移量转为分值,不是靠“第几颗星”而是靠“落在哪一段像素区间”:
-
touchstart记录起始clientX和当前modelValue -
touchmove用e.touches[0].clientX - startX算偏移,除以单星宽度(如32rpx),再乘以步长(半星就用0.5) - 必须用
Math.max(0, Math.min(maxRating, Math.round(value * 2) / 2))截断并四舍五入到0.5倍数——别用parseInt或Math.floor - 微信小程序里不能依赖
event.target.dataset.index,动态dataset在真机不可读,只能靠坐标计算
图标渲染怎么跨端一致
各端对background-image支持差异极大:
- H5:支持base64、网络图、本地路径,
clip-path可用 - 微信小程序:禁止base64作
background,clip-path兼容性差,推荐用uni-icons字体图标 +overflow: hidden+transform: translateX模拟半星 - App(nvue):不支持
background-image和伪元素,必须用两层<image></image>叠放,通过width百分比控制显隐 - 鸿蒙:要求图标为https或本地绝对路径,尺寸需严格匹配,不接受缩放失真
滑动体验的坑怎么避
真实项目里最容易漏掉的细节:
- 没加
touch-action: none→ iOS上滑动触发页面滚动,评分中断 - 没做
touchend防抖 → 微信小程序里同一事件可能触发两次,导致值翻倍 - 单星宽度用
px固定 → 在不同dpr设备上实际像素不一致,应统一用rpx或vw - 没处理
disabled状态下的touch事件 → 即使禁用,手指滑动仍会触发计算,需在touchstart里提前return
多端一致性最难的不是画星星,而是让手指划过时,每个平台都给出相同精度的反馈——这要求你放弃“一套代码跑所有端”的幻想,对nvue和小程序做分支逻辑,且边界判断必须写死在touch事件链里,不能靠CSS或computed事后修正。










