vue2 el-checkbox-group復(fù)選框無(wú)法選中問(wèn)題及解決
vue2 el-checkbox-group 復(fù)選框無(wú)法選中
原代碼
<template slot-scope="scope">
<el-checkbox v-model="scope.row.bitian">必填</el-checkbox>
</template>
if (this.allTemplateList && this.allTemplateList.length > 0) {
this.allTemplateList.forEach(template => {
template.bitian = false;
template.number = '';
template.shangchuandatas = [];
template.wenjiandaxiao = '';
})
},修改后
在遍歷 this.allTemplateList 時(shí),使用 Vue.set 或 this.$set 來(lái)確保新添加的屬性是響應(yīng)式的
if (this.allTemplateList && this.allTemplateList.length > 0) {
this.allTemplateList.forEach((template, index) => {
this.$set(this.allTemplateList, index, {
...template,
bitian: false,
number: '',
shangchuandatas: [],
wenjiandaxiao: '',
});
});
}多個(gè)el-checkbox-group復(fù)選框組 選項(xiàng)互斥
需求
多個(gè)el-checkbox-group復(fù)選框組 , 組與組之間的選項(xiàng)是互斥的效果
效果

代碼實(shí)現(xiàn)(方法一)
- template
<template>
<div class="page">
<el-checkbox-group
v-for="(item, index) in list"
v-model="item.checked"
:key="index"
@change="checkboxChange"
>
<el-checkbox
v-for="(jitem, jindex) in item.checkData"
:label="jitem.label"
:key="jindex"
:disabled="jitem.disabled"
>{{ jitem.name }}</el-checkbox
>
</el-checkbox-group>
</div>
</template>
- script
<script>
export default {
name: 'xxx',
data() {
return {
list: [
{
checked: [], // 選中值
checkData: [
// 復(fù)選框
{ label: 'name1', name: '名稱(chēng)1', disabled: false },
{ label: 'name2', name: '名稱(chēng)2', disabled: false },
{ label: 'name3', name: '名稱(chēng)3', disabled: false }
]
},
{
checked: [],
checkData: [
{ label: 'name1', name: '名稱(chēng)1', disabled: false },
{ label: 'name4', name: '名稱(chēng)4', disabled: false },
{ label: 'name3', name: '名稱(chēng)3', disabled: false }
]
},
{
checked: [],
checkData: [
{ label: 'name1', name: '名稱(chēng)1', disabled: false },
{ label: 'name4', name: '名稱(chēng)4', disabled: false },
{ label: 'name3', name: '名稱(chēng)3', disabled: false }
]
},
{
checked: [],
checkData: [
{ label: 'name5', name: '名稱(chēng)5', disabled: false },
{ label: 'name1', name: '名稱(chēng)1', disabled: false },
{ label: 'name3', name: '名稱(chēng)3', disabled: false }
]
}
]
}
},
methods: {
/**
* @description 復(fù)選框change事件
* @param {array} val 復(fù)選框值
* @param {number} i 索引
* @return {void} Do not return anything
*/
checkboxChange() {
let checkedAll = []// 存儲(chǔ)所有的選中值
this.list.forEach(item => {
// 初始化數(shù)據(jù),復(fù)選框都可選
item.checkData.forEach(jitem => {
jitem.disabled = false
})
// 將選中的數(shù)據(jù)存儲(chǔ)arr中
item.checked.forEach(kitem => {
checkedAll.push(kitem)
})
})
// 去重
checkedAll = Array.from(new Set(checkedAll))
// 互斥操作
this.list.forEach(item => {
item.checkData.forEach(jitem => {
if (checkedAll.includes(jitem.label) && !item.checked.includes(jitem.label)) {
// 當(dāng)復(fù)選框?qū)?yīng)數(shù)據(jù)存在arr中,不存在對(duì)應(yīng)的checked中時(shí),設(shè)為禁用狀態(tài)
jitem.disabled = true
}
})
})
}
}
}
</script>
代碼實(shí)現(xiàn)(方法二)
- template
<template>
<div class="page">
<el-form>
<el-form-item v-for="(item, index) in list" :label="'復(fù)選框組' + (index + 1)" :key="index">
<el-checkbox-group v-model="item.checked">
<el-checkbox
v-for="(jitem, jindex) in item.checkData"
:label="jitem.label"
:key="jindex"
:disabled="setDisabledMuti(jitem, index)"
>{{ jitem.name }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
</div>
</template>
- script
<script>
export default {
name: 'xxx',
data() {
return {
checkedAll: [],
list: [
{
checked: ['name1'], // 選中值
checkData: [
// 復(fù)選框
{ label: 'name1', name: '名稱(chēng)1' },
{ label: 'name2', name: '名稱(chēng)2' },
{ label: 'name3', name: '名稱(chēng)3' }
]
},
{
checked: ['name4'],
checkData: [
{ label: 'name1', name: '名稱(chēng)1' },
{ label: 'name4', name: '名稱(chēng)4' },
{ label: 'name3', name: '名稱(chēng)3' }
]
},
{
checked: ['name3'],
checkData: [
{ label: 'name1', name: '名稱(chēng)1' },
{ label: 'name4', name: '名稱(chēng)4' },
{ label: 'name3', name: '名稱(chēng)3' }
]
},
{
checked: ['name5'],
checkData: [
{ label: 'name5', name: '名稱(chēng)5' },
{ label: 'name1', name: '名稱(chēng)1' },
{ label: 'name3', name: '名稱(chēng)3' }
]
}
]
}
},
//計(jì)算屬性
computed: {
setDisabledMuti() {
return function(opt, index) {
// 全部已選擇
const tempArr = this.list.map(item => item.checked)
// 先刪除自己的已選
tempArr.splice(index, 1)
// 轉(zhuǎn)為一維數(shù)組
const selectedArr = tempArr.flat();
// 其它的已選,禁用
return selectedArr.includes(opt.label)
}
}
}
}
</script>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue前端實(shí)現(xiàn)導(dǎo)出頁(yè)面為word的兩種方法
這篇文章主要介紹了Vue前端實(shí)現(xiàn)導(dǎo)出頁(yè)面為word的兩種方法,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12
使用vue實(shí)現(xiàn)多規(guī)格選擇實(shí)例(SKU)
這篇文章主要介紹了使用vue實(shí)現(xiàn)多規(guī)格選擇實(shí)例(SKU),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
ant design vue中日期選擇框混合時(shí)間選擇器的用法說(shuō)明
這篇文章主要介紹了ant design vue中日期選擇框混合時(shí)間選擇器的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Vue實(shí)現(xiàn)導(dǎo)航欄的顯示開(kāi)關(guān)控制
今天小編就為大家分享一篇Vue實(shí)現(xiàn)導(dǎo)航欄的顯示開(kāi)關(guān)控制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
VSCode寫(xiě)vue項(xiàng)目一鍵生成.vue模版,修改定義其他模板的方法
這篇文章主要介紹了VSCode寫(xiě)vue項(xiàng)目一鍵生成.vue模版,修改定義其他模板的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Vue3響應(yīng)式陷阱之對(duì)象引用丟失導(dǎo)致的數(shù)據(jù)更新失效的解決方法
最近在開(kāi)發(fā)一個(gè)表單配置功能時(shí),遇到了一個(gè)詭異的 Bug:明明在函數(shù)中成功賦值了,console.log 也打印出了正確的值,但頁(yè)面上就是不顯示,經(jīng)過(guò)一番排查,發(fā)現(xiàn)這是一個(gè)典型的 Vue 響應(yīng)式陷阱,今天分享出來(lái),希望能幫到遇到類(lèi)似問(wèn)題的同學(xué),需要的朋友可以參考下2025-11-11
vue通過(guò)接口直接下載java生成好的Excel表格案例
這篇文章主要介紹了vue通過(guò)接口直接下載java生成好的Excel表格案例2020-10-10

