You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js复选框异常求助:页面重载状态丢失+无法取消勾选

问题描述
  • 页面重载后,已勾选的复选框状态无法显示
  • 在EditForm中无法取消勾选,点击复选框时,即便值已存在于数组中仍会重复添加

现有代码

脚本代码

isChecked(teamPermission) {
    let checkStatus = this.currentTeam.permissions.some((permission) => {
        return teamPermission.id === permission.permissionType;
    });

    return checkStatus;
},

newPermission(permission) {
    // console.log("NewPermission", permission);
 
    this.currentTeam.permissions.push({
        permissionType:permission.id,
        teamId:this.currentTeam.id
    })

    this.newAssignedPermissions = this.currentTeam.permissions;
    // console.log('ASSIGNED PERMISSIONS', assignedPermissions)
    // console.log('NEW ASSIGNED PERMISSIONS', this.newAssignedPermissions);

    return this.newAssignedPermissions;
},

复选框列表模板

<ul
  v-for="permission in permissions"
  :key="permission.id"
>
  <input
    class="form-check-input mt-0"
    type="checkbox"
    :id="permission.id"
    :value="{ permissionType: permission.id }"
    :checked="isChecked(permission)"
    @input="newPermission(permission)"
    aria-label="Checkbox for following text input"
  />

  <label
    :for="permission.id"
    class="ms-2"
  >
    {{ permission.name.toLowerCase() }}
  </label>
</ul>

已选权限显示模板

<li
  v-for="givenPermissions in newAssignedPermissions"
  :key="givenPermissions.id"
>
  {{ permissions[givenPermissions.permissionType - 1].name.toLowerCase() }}
</li>

UI异常表现

  • 页面加载后现有权限未显示为勾选状态
  • 勾选新复选框后UI能显示已选,但取消勾选时仍会重复添加值到数组中

解决方案

1. 修复页面重载后复选框状态不显示问题

核心是确保权限数据加载完成后同步复选框状态,推荐用v-model绑定数组实现双向绑定,比手动判断更可靠:

修改复选框模板

<input
  class="form-check-input mt-0"
  type="checkbox"
  :id="permission.id"
  :value="permission.id"
  v-model="selectedPermissionIds"
  aria-label="Checkbox for following text input"
/>

脚本中初始化状态

data() {
  return {
    selectedPermissionIds: []
  }
},
mounted() {
  // 确保currentTeam数据加载完成后执行
  this.selectedPermissionIds = this.currentTeam.permissions.map(p => p.permissionType);
}

2. 修复无法取消勾选及重复添加问题

原方法仅处理添加逻辑,需补充移除判断,可结合复选框的checked状态来操作:

修改复选框事件绑定

<input
  class="form-check-input mt-0"
  type="checkbox"
  :id="permission.id"
  :value="{ permissionType: permission.id }"
  :checked="isChecked(permission)"
  @input="(e) => newPermission(permission, e.target.checked)"
  aria-label="Checkbox for following text input"
/>

更新newPermission方法

newPermission(permission, checked) {
  const permissionExists = this.currentTeam.permissions.some(p => p.permissionType === permission.id);
  
  if (checked && !permissionExists) {
    // 勾选且权限不存在时添加
    this.currentTeam.permissions.push({
      permissionType: permission.id,
      teamId: this.currentTeam.id
    });
  } else if (!checked && permissionExists) {
    // 取消勾选且权限存在时移除
    this.currentTeam.permissions = this.currentTeam.permissions.filter(p => p.permissionType !== permission.id);
  }
  
  // 同步显示用数组,避免引用导致的视图不更新
  this.newAssignedPermissions = [...this.currentTeam.permissions];
}

3. 修复已选权限显示异常问题

优化key值和权限名称获取逻辑,避免索引越界:

<li
  v-for="givenPermission in newAssignedPermissions"
  :key="givenPermission.permissionType"
>
  {{ permissions.find(p => p.id === givenPermission.permissionType)?.name.toLowerCase() || '' }}
</li>

内容的提问来源于stack exchange,提问作者Mr. A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:25:19