【问题标题】:Vuetify checkboxes array checks all boxes when list changesVuetify 复选框数组在列表更改时检查所有框
【发布时间】:2019-10-22 17:21:05
【问题描述】:

我对 vue 和 vuetify 都很陌生,所以我的代码中可能有几行可怕的代码,但我真的在这方面苦苦挣扎,如果能得到一些帮助会很好。

我在“items”数组上使用 v-for 循环生成了一组复选框。这个复选框数组附加到模型数组,就像 vuetify 文档中的 this example 一样。

它看起来像下面的代码。

问题是:如果我更改 items 数组,即使模型数组仍然为空,所有复选框最终都会被选中。

这是我的模板:

<div id="app">
  <v-app>
    <v-content>
      <v-container>
        <div>
          <v-list>
            <v-list-item 
               v-for="item in items" :key="item.id"
             >
              <v-checkbox 
                 v-model="model" :label="item.name"  
                          :value="item" 
                          :value-comparator="comparator"
                          ></v-checkbox>
            </v-list-item>
          </v-list>
          <v-btn @click="updateItems">Change elements</v-btn>
        </div>
      </v-container>
    </v-content>
  </v-app>
</div>

和脚本


new Vue({
  el: "#app",
  vuetify: new Vuetify(),
  data() {
    return {
      model: [],
      items: [
        {
          id: 1,
          name: "Item1"
        },
        {
          id: 2,
          name: "Item2"
        },
        {
          id: 3,
          name: "Item3"
        },
        {
          id: 4,
          name: "Item4"
        }
      ]
    };
  },
   methods: {
    comparator(a, b) {
      return a.id == b.id;
    },
       updateItems() {
            this.items = [
        {
          id: 1,
          name: "Element1"
        },
        {
          id: 2,
          name: "Element2"
        },
        {
          id: 3,
          name: "Element3"
        },
        {
          id: 4,
          name: "Element4"
        }
      ]
    }
   }
});

还有一个codepen is way easier to understand

我已经在这个问题上苦苦挣扎了一段时间,如果你有任何想法,那将是受欢迎的。谢谢!

编辑:我的代码出错了。修复。问题还是一样。

【问题讨论】:

  • 您能解释一下为什么要实现这个目标吗?当您首先更新所有项目时,我不明白模型 arr 的用途是什么?如果你能解释一下你的情况,也许有更简单的方法。
  • 我正在其他地方使用模型数组。我想知道选择了哪些项目但需要不时将项目添加到可选项目列表中
  • 我建议您创建一个名为totalSelected 的新数组,当您单击按钮时,将模型 arr 保存到 totalSelected 中,然后安全地重置数据和模型。我认为没有更清洁的方法。
  • 这实际上是最干净的方法。我添加了this.model = this.model.slice(0),问题就消失了。我仍然不太确定它为什么会发生,但至少它现在有效。谢谢!

标签: vue.js checkbox vuetify.js


【解决方案1】:

这段代码的bug很少,

从下面的复选框

<v-checkbox 
  v-model="model" :label="item.name"  
  :value="item" 
  :value-comparator="comparator"
></v-checkbox>

:value-comarator 是当你点击复选框时触发的,它会尝试 与所有其他值匹配并仅对选定的 id 返回 true

“比较器”功能在您的方法中不可用,将“valueCompare”方法替换为“比较器”

当您单击更改元素时,它会重置项目数组,但您不会重置模型

工作代码笔:https://codepen.io/chansv/pen/rNNyBgQ

添加的修复和最终代码如下所示

<div id="app">
  <v-app>
    <v-content>
      <v-container>
        <div>
          <v-list>
            <v-list-item 
                         v-for="item in items"                            :key="item.id"
             >
           <v-checkbox v-model="model"              :label="item.name"  
             :value="item" 
        :value-comparator="comparator"
           ></v-checkbox>
            </v-list-item>
          </v-list>
          <v-btn @click="updateItems">Change elements</v-btn>
        </div>
      </v-container>
    </v-content>
  </v-app>
</div>

// Looking for the v1.5 template?
// https://codepen.io/johnjleider/pen/GVoaNe

new Vue({
  el: "#app",
  vuetify: new Vuetify(),
  data() {
    return {
      model: [],
      items: [
        {
          id: 1,
          name: "Item1"
        },
        {
          id: 2,
          name: "Item2"
        },
        {
          id: 3,
          name: "Item3"
        },
        {
          id: 4,
          name: "Item4"
        }
      ]
    };
  },
   methods: {
    comparator(a, b) {
      console.log(a, b);
      return a.id == b.id;
    },
       updateItems() {
         this.model = [];
            this.items = [
        {
          id: 1,
          name: "Element1"
        },
        {
          id: 2,
          name: "Element2"
        },
        {
          id: 3,
          name: "Element3"
        },
        {
          id: 4,
          name: "Element4"
        }
      ]
    }
   }
});

【讨论】:

  • 比较器,谢谢,我修好了。但我不明白为什么要重置模型,因为我没有检查任何东西,它应该仍然是空的。
  • 是的,当您使用新值重置时,复选框取决于项目数组。 v-model 已经有一些来自 items 数组的选定值,由于 vue 反应性行为,我试图在 items 值更改时触发比较器。将 console.log(a,b) 放在比较器中,您将了解行为。也请投票并接受此答案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2021-06-24
  • 2020-03-29
相关资源
最近更新 更多