Vue中b-form-checkbox-group如何展示全量选项并自动勾选已存API值
BootstrapVue 权限复选框渲染+默认勾选实现方案
核心逻辑误区
你之前的绑定错误本质是混淆了<b-form-checkbox-group>两个独立属性的职责:
:options决定页面需要渲染哪些可选项,如果绑已保存的权限数组,自然只会渲染已保存的那3个权限项,没法展示全量列表v-model决定当前哪些选项是勾选状态,它要求绑定的值是和value-field配置匹配的纯值数组,不是对象数组本身
你之前的代码还存在变量重名的冲突问题:v-model="authorize"和:options="authorize"绑了同一个变量,本身就会导致渲染逻辑混乱。
落地实现步骤
- 拆分独立的响应式变量,做职责隔离
- 新增
allPermissions变量,专门存储全量权限接口返回的完整列表,作为复选框的渲染数据源 - 保留
authorize变量(作为v-model的绑定值),专门存储当前选中的权限id集合,控制勾选状态
- 新增
- 接口数据赋值时做格式适配
- 全量权限接口拉取完成后,直接把返回的全量数组赋值给
allPermissions - 拿到已保存的权限对象数组后,不要直接塞给v-model,需要提前提取所有项的
id组成纯id数组,再赋值给authorize
参考赋值代码:
// 拉取全量权限列表 const allPermissionRes = await get('/authorize') this.allPermissions = allPermissionRes.data // 适配已保存的权限数据格式 const savedAuthList = currentTutorial.authorize this.authorize = savedAuthList.map(authItem => authItem.id) - 全量权限接口拉取完成后,直接把返回的全量数组赋值给
- 调整模板的组件绑定逻辑
<b-form-checkbox-group v-model="authorize" :options="allPermissions" name="authorize" stacked text-field="name" value-field="id" >
效果验证
- 因为
options绑定了全量权限数组,页面会渲染接口返回的所有5个权限复选框,不会只显示已保存的项 - 因为
v-model绑定了已保存权限对应的id集合,BootstrapVue 会自动匹配配置的value-field: id,把id在选中集合里的复选框自动设为默认勾选状态,不需要手动操作DOM - 注意:你提供的接口返回数据里存在id和name不匹配的脏数据(比如
id: "user:update"对应的name: "country:update"),这个需要后端同步修正字段映射,不影响前端上述逻辑的正常运行。
内容的提问来源于stack exchange,提问作者nsukhi singh
相关产品推荐
相关产品推荐

