应监听 change 事件获取选中分数,其参数 value 为 number 类型(支持半星如 3.5);动态设值需用 rate.set() 后手动调用回调;务必确保 DOM 就绪后再 render,且通过 hidden input 同步提交值。
点击后怎么拿到当前选中的分数
直接监听 change 事件,layui 的 rate 组件会在用户点击后触发这个回调,参数里就带着分值。
别去监听 click 或读取 DOM 类名——组件内部状态和 UI 并不同步,手动抓容易拿错。
-
change回调的第一个参数是当前选中的分数(number 类型),不是索引也不是字符串 - 如果设了
half: true,用户点半星时会返回类似3.5的浮点数,注意后端或计算逻辑是否能处理小数 - 初始化时没设置
value,首次点击前change不会触发;想默认带值,得在渲染时传value: 4
layui.use('rate', function(){
var rate = layui.rate;
rate.render({
elem: '#test1',
value: 3,
change: function(value){
console.log('当前选中:', value); // 直接就是 1, 2, 3.5, 5 这样的数
}
});
});
动态设置评分后怎么同步触发 change
用 rate.set() 改值,默认不会触发 change 回调——这是很多人以为“没生效”的原因。
如果你在表单重置、接口回填等场景下需要主动设值并通知业务逻辑,必须手动补发事件。
-
rate.set(elem, value)只更新 UI 和内部value,不走事件流 - 想模拟用户操作效果,设完后手动调一次
change回调函数(建议抽成独立函数复用) - 不要用
$(elem).trigger('change')——rate不基于原生事件机制,无效
// 正确做法:封装回调并复用
function onRateChange(value) {
console.log('新分值:', value);
// 更新 hidden input、提交校验等...
}
rate.render({
elem: '#test1',
change: onRateChange
});
// 后续动态设置
rate.set('#test1', 4);
onRateChange(4); // 手动同步
为什么有时候获取到的 value 是 undefined 或 0
常见于三种情况:渲染失败、DOM 未就绪、或组件实例丢失。
尤其注意 rate.render() 必须等目标元素真实存在于 DOM 中再执行,否则 elem 找不到,整个实例创建失败,后续所有方法都无效。
- 检查控制台有没有
elem is null or undefined报错,有就说明选择器错了或节点还没挂载 - 用 jQuery 动态插入内容后立即 render,大概率失败;应改用
setTimeout或监听插入完成事件 - 多次对同一元素重复
render,旧实例会被覆盖,之前绑定的change就失效了
和表单 submit 配合时怎么防止漏传
rate 本身不自动关联 <input type="hidden">,提交表单时它的值不会随其他字段一起发出。
最稳的方式是每次 change 时同步写入一个隐藏域,而不是 submit 时再去读 rate 实例。
- 隐藏域
name属性要和后端约定好,比如name="score" - 别依赖
layui.rate.getRateValue(elem)—— 这个 API 不存在,官方没提供运行时取值方法 - 如果页面有多个
rate,每个都要配独立 hidden input,别共用同一个 name
<div id="rate1"></div>
<input type="hidden" name="rating" id="rating-val">
// 在 change 回调里:
change: function(value){
document.getElementById('rating-val').value = value;
}
组件没提供「只读」模式下的值读取入口,一旦禁用(readonly: true),就只能靠你初始化时记下来的值,或者从 hidden input 里取——这点容易被忽略。











