uni-data-checkbox的disable属性需在localdata每项中设disable:true而非标签上加disabled;uni-table需修改源码监听disabled变化更新isdisabled;u-checkbox要确保disabled字段响应式,避免深拷贝导致失效。

uni-data-checkbox 的 disable 属性不生效?别往组件上加
禁用多选框,不能在 <uni-data-checkbox></uni-data-checkbox> 标签上直接写 disable 或 disabled —— 这个属性只认数据源里的字段。必须在 localdata 数组每个对象中显式添加 disable: true,否则样式和交互都不会变。
常见错误是这样写:
<uni-data-checkbox v-model="value" :localdata="range" disabled></uni-data-checkbox>
这完全没用。正确做法是:
-
range数据里每个项加disable: true字段,比如{"value": 1, "text": "足球", "disable": true} - 动态控制时,直接改对应 item 的
disable值,Vue 响应式会触发重绘 - 注意字段名是
disable(不是disabled),uni-app 官方文档明确写的是disable
uni-table 多选行禁用后样式残留?得改源码监听
<uni-table></uni-table> 的 :disabled="xxx" 能控制行是否可选,但默认不会自动更新禁用样式——尤其在数据状态变化(如接口返回新 status)后,UI 仍显示旧的禁用态。这是因为内部组件没监听 disabled prop 变化。
解决路径很明确:找到本地 node_modules/@dcloudio/uni-ui/lib/uni-table/uni-table.vue 或更大概率是 uni-table/uni-tr.vue 里引用的 table-checkbox.vue,在 watch 中补上监听:
watch: {
disabled(newVal) {
this.isDisabled = newVal
}
}
关键点:
-
this.isDisabled是 uni-table 源码里真正控制 checkbox 禁用态的内部变量 - 只监听
disabled字段,不处理undefined或非布尔值,避免意外覆盖 - 改完必须重新 build,H5 和小程序都会生效;App 端若用自定义基座,需确认是否走的是同套 npm 包
u-checkbox 手动设 disabled 后样式不还原?检查绑定方式
用 <u-checkbox></u-checkbox> 时,如果通过 :disabled="item.disabled" 控制,但切换 item.disabled 后禁用样式没消失,大概率是 item 对象本身没被 Vue 正确代理——尤其是从接口赋值的数组,未用 this.$set 或初始化时未声明完整结构。
典型场景:
- 初始
deviceList是空数组,后续this.deviceList = res.data,但res.data[0]没带disabled字段 → Vue 不会响应式追踪这个 key - 修复方法:初始化时就给每项补全字段,例如
deviceList: [{ deviceName: '', disabled: false }] - 或用
this.$set(item, 'disabled', false)显式触发响应 - 不要用
item['disabled'] = false直接赋值,尤雨溪早说过这不触发更新
禁用样式取消了但点击还能触发 change?检查事件冒泡
禁用状态生效后,仍有点击反馈或触发 @change,往往不是禁用失效,而是事件绑在了父容器上,且没阻止冒泡。比如在 <u-checkbox-group></u-checkbox-group> 外层套了个 @click,而 checkbox 自身虽然禁用,但父级 div 仍可点。
排查步骤:
- 打开浏览器调试器,检查被点击元素的 class 是否含
uni-checkbox--disabled - 在控制台执行
getComputedStyle($0).pointerEvents,确认是否为none - 如果父级有
@click,在 handler 里加e.stopPropagation(),或改用@click.native.stop - uni-app 的
disabled仅控制 checkbox 本身,不自动禁用其所有祖先节点的点击行为
最易忽略的是:禁用逻辑分散在 computed、watch、methods 多处,某一处忘了同步更新 disable 字段,或者用了深拷贝导致响应式丢失——这种问题不会报错,只会让禁用看起来“有时灵有时不灵”。











