对象作为值绑定到数组 属性 的 VueJS 复选框在未选中时不会脱离数组
VueJS checkboxes with objects as values bound to an array property do not come off of array when unchecked
在我的一个 VueJS 组件中,我有一个名为 selectedJobs
的数组,用于 html table 中选中的 html 复选框。 html table 中的数据来自名为 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
数组?
如果您在标记中创建对象,它将无法正确跟踪,您必须事先进行。您可以使用计算 属性.
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>
在我的一个 VueJS 组件中,我有一个名为 selectedJobs
的数组,用于 html table 中选中的 html 复选框。 html table 中的数据来自名为 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
数组?
如果您在标记中创建对象,它将无法正确跟踪,您必须事先进行。您可以使用计算 属性.
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>