layui单选框不支持全选是设计限制而非bug,因其语义要求“有且仅有一个被选中”,违背全选前提;需批量操作应改用type:'checkbox'并确保行id唯一、正确调用inst.checkall()。

layui单选框不支持全选,这是设计限制
单选框(type: 'radio')在 Layui 表格中天然不支持“全选”操作——它不是 bug,而是语义冲突:单选意味着「有且仅有一个被选中」,全选违背这一前提。你试图调用 table.checkAll() 或监听 table.on('radio(filter)') 都不会触发批量行为,API 也不会报错,但状态不会改变。
想批量选中,必须改用 checkbox 模式
如果你实际需要的是「一次勾选多行」,那本质是多选需求,应立刻停用 type: 'radio',换成 type: 'checkbox' 并配好 lay-filter:
- HTML 表格列定义里写
{ type: 'checkbox' },别写type: 'radio' - 确保每行数据有唯一
id字段(不能为null或undefined),否则checkAll()会静默失败 - toolbar 按钮触发全选时,必须传 table 实例:
inst.checkAll(),而不是字符串table.checkAll('your-id') - 服务端分页下,
inst.checkAll()只影响当前页;要“业务全选”,得自己维护new Set()记录所有 ID
误用 radio 后强行模拟全选的后果
有人尝试用 jQuery 手动设 input[type="radio"] 的 checked 属性,或在 done 回调里遍历 DOM 赋值——这会导致:
- Layui 内部状态和 UI 不同步:
table.checkStatus('filter').data仍为空或只返回最后一行 - 点击任意 radio 后,之前“手动勾上”的其他 radio 全部自动取消(浏览器原生单选逻辑接管)
- 翻页后状态丢失,因为没走 Layui 的事件流,
table.cache不感知 - 控制台可能报
Cannot read property 'checked' of undefined,尤其当列配置混用radio和checkbox
真正需要“默认选中某一行”怎么办
radio 模式下,Layui 不支持像 checkbox 那样靠后端返回 checked: true 字段来初始化。可行做法只有两个:
- 在
table.render().done回调里,用table.cache['your-id']查到目标行对象,再调table.setRowChecked('your-id', { index: N, checked: true })(注意N是当前页行索引,翻页后失效) - 更稳的方式:渲染完后,用
$('tbody tr').eq(targetIndex).find('.layui-table-radio').click()触发真实点击,让 Layui 事件系统接管
记住:radio 的“选中”永远是一次性的动作,不存在“全选”这个状态。如果 UI 上看起来像要全选,大概率是需求理解错了——该用 checkbox 的地方用了 radio。











