未选中时,具有对象作为绑定到数组属性的值的 VueJS 复选框不会脱离数组

Posted

技术标签:

【中文标题】未选中时,具有对象作为绑定到数组属性的值的 VueJS 复选框不会脱离数组【英文标题】:VueJS checkboxes with objects as values bound to an array property do not come off of array when unchecked 【发布时间】:2019-09-24 06:19:43 【问题描述】:

在我的一个 VueJS 组件中,我有一个名为 selectedJobs 的数组,它用于 html 表中选中的 html 复选框。 html表中的数据来自一个名为replenJobsList的对象数组;

/* My Component */
<template>
...
<table>
...
<tr v-for="replenJob in replenJobsList">
    <td>
        <input v-bind:id="'add-to-batch-' + replenJob.sku + replenJob.rplFrom + replenJob.replenTo"
            v-bind:value="
                id: 0,
                manualMoveBatchId: 0,
                modifyDate: new Date().getTime(),
                moveFrom: replenJob.rplFrom,
                moveTo: replenJob.replenTo,
                sku: replenJob.sku,
                skuDescription: replenJob.description,
                status: 'active',
                units: replenJob.unitsToReplenish
            "
            v-model="selectedJobs"
            type="checkbox">
        <label v-bind:for="'add-to-batch-' + replenJob.sku + replenJob.rplFrom + replenJob.replenTo"></label>
     </td>
</tr>
...
</table>
...
</template>
...
data() 
    return 
        selectedJobs: [],
    

如果我为所有选中的复选框console.log(selectedJobs.length);,它会给我正确的长度。但是当我取消选中一个复选框并再次检查数组的长度时,复选框长度不会减 1。

此外,如果我再次选中相同的复选框,它将向selectedJobs 数组添加一个对象,而不是再次递减和递增。

如何让复选框正确添加和脱离selectedJobs 数组?

【问题讨论】:

我不确定您是否可以将 javascript 对象设置为 input.value。 【参考方案1】:

如果您在标记中创建对象,它将无法正确跟踪,您必须事先进行。您可以使用计算属性。

new Vue(
  el: "#app",
  data: 
    replenJobsList: [
       rplFrom: 'example@example.com', replenTo: 'foo@bar.com', sku: 1, description: '11111', unitsToReplenish: 33 ,
       rplFrom: 'example@example.com', replenTo: 'foo@bar.com', sku: 2, description: '22222', unitsToReplenish: 22 ,
       rplFrom: 'example@example.com', replenTo: 'foo@bar.com', sku: 3, description: '33333', unitsToReplenish: 11 ,
    ],
    selectedJobs: [],
  ,
  computed: 
    compJobsList() 
      return this.replenJobsList.map((job, index) => (
          id: index,
          manualMoveBatchId: 0,
          modifyDate: new Date().getTime(),
          moveFrom: job.replFrom,
          moveTo: job.replenTo,
          sku: job.sku,
          skuDescription: job.description,
          status: 'active',
          units: job.unitsToReplenish,
        ));
    ,
  ,
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <table>
    <thead>
      <tr><th>Jobs</th></tr>
    </thead>
    <tbody>
      <tr v-for="job in compJobsList" :key="job.id">
        <td>
          <input type="checkbox"
            :value="job" 
            v-model="selectedJobs">
            <label for=""> job.skuDescription </label>
        </td>
      </tr>
    </tbody>
  </table>
  <span>Checked jobs:  selectedJobs </span>
</div>

【讨论】:

感谢您的回复。在我在问题中提供的示例中,我无法理解如何在我的表格中实现这一点。您能否调整您对我的模板设置方式的回答?如果您需要更多信息,请告诉我。 @aCarella 我将其更新为表结构。有什么具体的你不明白吗? 我认为 &lt;div&gt;s 让我很失望,我无法理解如何在表格中实现。 @StevenB。我如何预先检查一个复选框(以防我想从数据库中填充 checkobxes)。例如以下不起作用。 selectedJobs: [ rplFrom: 'example@example.com', replenTo: 'foo@bar.com', sku: 1, description: '11111', unitsToReplenish: 33 ] @geeksalah 您需要使用相同的对象实例。在创建的钩子中,您可以执行 this.selectedJobs.push(this.compJobsList[0]); 并且它会起作用。见this fiddle。

以上是关于未选中时,具有对象作为绑定到数组属性的值的 VueJS 复选框不会脱离数组的主要内容,如果未能解决你的问题,请参考以下文章

vue3表单对象固定写死的值获取不到

Vue从入门到实战5_学习

PHP XML 到具有属性和值的数组/对象

值的绑定

Vue父子组件传值

LINQ:获取包含具有特定名称和值的属性的数组中的对象