复选框列表不会在动态生成的复选框 v-models 数组中更新

Posted

技术标签:

【中文标题】复选框列表不会在动态生成的复选框 v-models 数组中更新【英文标题】:List of checkboxes wont update in dynamic generated array of checkboxes v-models 【发布时间】:2020-12-29 02:29:50 【问题描述】:

我有一个包含复选框列表的键-> 值对的数组。它们渲染得很好,但是当你点击它们时,什么都没有发生,除非我更改文本输入,然后这些复选框再次使用新值重新渲染(无论我之前点击过哪个)。

复选框:

<el-col :span="24">
   <el-form-item class="permission-item" :span="24" :key="perm.name" v-for="perm in permissions" :label="perm.name">
       <el-switch v-model="role_permissions[perm.name]" />
   </el-form-item>
</el-col>

如果我更新然后复选框更新的其他元素:

<el-col :span="8">
  <el-row>
    <el-col :span="24">
        <el-form-item label="Role Name" prop="name">
          <el-input v-model="role.name"/>
        </el-form-item>
    </el-col>
  </el-row>
</el-col>

组件:

export default 
    data() 
      return 
        role: this.role,
        permissions: [],
        role_permissions: 
      ;
    ,
    methods: 
      getRole: async function()
        //Inside axios ajax
        this.role = response.data.role;
      ,
      getPermissions: async function()
        //Inside axios ajax   
        this.permissions = response.data.permissions;          

        //Init the array with the values
        for(var i = 0; i < this.permissions.length; i++)
          this.role_permissions[this.permissions[i].name] = this.hasPerm(this.permissions[i].name);
                
      ,
      hasPerm(name)
        for(var i = 0; i < this.role.permissions.length; i++)
          if(name === this.role.permissions[i].name)
            return true;
          
        
        return false;
      
    ,
    mounted() 
      this.getRole();
      this.getPermissions();
    ,
  

谁能告诉我为什么会这样?

【问题讨论】:

【参考方案1】:

在你的 switch 标签中同时使用 v-model 和 bind:value

【讨论】:

如果我删除 bind:value 它仍然有同样的问题 尝试将你在 switch 中使用的方法移动到计算值,你将重新计算值 你能举个例子吗?我在 switch 中没有使用任何方法。唯一相关的是加载具有初始值的数组时 对不起,我走错路了。你的对象没有反应,这就是原因。 Read about reactivity,并以正确的方式为您的对象设置初始值【参考方案2】:

在查看反应性问题几天后,修复如下:

改了

role_permissions: 

到这里:

role_permissions: []

那么,为什么这不起作用的关键部分在于数组的初始化。这发生在 getPermissions() 中,这就是我所做的:

改变了这个:

for(var i = 0; i < this.permissions.length; i++)
   this.role_permissions[this.permissions[i].name] = this.hasPerm(this.permissions[i].name);
   

到这里:

for(var i = 0; i < this.permissions.length; i++)
   this.$set(this.role_permissions, this.permissions[i].name, this.hasPerm(this.permissions[i].name));

不要使用“=”,而是使用“$set”进行赋值。

【讨论】:

以上是关于复选框列表不会在动态生成的复选框 v-models 数组中更新的主要内容,如果未能解决你的问题,请参考以下文章

通过列表视图检查动态生成的复选框时出现问题

v-for 循环内 v-model 的动态绑定

将 ngModel 绑定到动态复选框列表:Angular 2 / Typescript

如何在agGrid中获取动态生成的复选框列的新旧值

Vue.js 如何使用 v-model 和计算属性以及复选框来镜像输入字段

动态生成链接菜单 vb.net