vue中el-checkbox全選、反選、多選的實現
vue el-checkbox全選、反選、多選
描述:實現對一組數據進行全選,反選、多選操作
- 全選
handleCheckAllChange(val) { this.checkedCities = val ? cityOptions : []; this.isIndeterminate = false; this.checkInvert = false; }
- 反選
handleInvertCheckChange(val) { let cities = this.cities; let checkedCities = this.checkedCities; if (checkedCities.length === 0) { checkedCities = val ? cities : []; } else if (checkedCities.length === cities.length) { this.checkedCities = []; this.checkAll = false; } else { let list = cities.concat(checkedCities).filter((v, i, array) => { return array.indexOf(v) === array.lastIndexOf(v); }); this.checkedCities = list; } }
- 多選
handleCheckedCitiesChange(value) { let checkedCount = value.length; this.checkAll = checkedCount === this.cities.length; this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length; this.checkInvert = false; }
完整代碼
<template> <div> <el-checkbox v-model="checkAll" @change="handleCheckAllChange" :indeterminate="isIndeterminate" >全選</el-checkbox > <el-checkbox v-model="checkInvert" @change="handleInvertCheckChange" >反選</el-checkbox > <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange" > <el-checkbox v-for="city in cities" :label="city" :key="city">{{ city }}</el-checkbox> </el-checkbox-group> </div> </template> <script> const cityOptions = ["上海", "北京", "廣州", "深圳"]; export default { data() { return { checkAll: false, checkInvert: false, checkedCities: ["上海", "北京"], cities: cityOptions, isIndeterminate: true, }; }, methods: { // 全選 handleCheckAllChange(val) { this.checkedCities = val ? cityOptions : []; this.isIndeterminate = false; this.checkInvert = false; }, // 反選 handleInvertCheckChange(val) { let cities = this.cities; let checkedCities = this.checkedCities; if (checkedCities.length === 0) { checkedCities = val ? cities : []; } else if (checkedCities.length === cities.length) { this.checkedCities = []; this.checkAll = false; } else { let list = cities.concat(checkedCities).filter((v, i, array) => { return array.indexOf(v) === array.lastIndexOf(v); }); this.checkedCities = list; } }, // 多選 handleCheckedCitiesChange(value) { let checkedCount = value.length; this.checkAll = checkedCount === this.cities.length; this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length; this.checkInvert = false; }, }, }; </script> <style> </style>
checkbox多選框,indeterminate 狀態
舉個例子。比如選擇星期。一周七天
2種方法。思密達。。。。第一種帶局限性。笨辦法,也發出來大傢看看(推薦使用第二種)
這是方式的值是組件自帶的值方式
const cityOptions = ['周一', '周二', '周三', '周四','周五','周六','周天']
<template> <div> <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">全選</el-checkbox> <div style="margin: 15px 0;"></div> <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange"> <el-checkbox v-for="city in cities" :label="city" :key="city">{{city}}</el-checkbox> </el-checkbox-group> </div> </template> <script> const cityOptions = ['周一', '周二', '周三', '周四','周五','周六','周天'] export default { data() { return { checkAll: false, checkedCities: [], cities: cityOptions, isIndeterminate: true, arr:[] } }, methods: { handleCheckAllChange(val) { let tempArr = [] this.checkedCities = val ? cityOptions : [] this.isIndeterminate = false // console.log(this.checkedCities) // console.log(val) if (this.checkedCities != []) { if(val == true){ tempArr = [1,2,3,4,5,6,0] this.arr = tempArr }else if(val==false){ tempArr = [] this.arr = tempArr } } console.log(this.arr) }, handleCheckedCitiesChange(value) { let checkedCount = value.length; this.checkAll = checkedCount === this.cities.length; this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length; var tempArr = [] for(let i=0;i<value.length;i++){ if(value[i] === '周一') { tempArr.push(1) }else if(value[i] === '周二'){ tempArr.push(2) }else if(value[i] === '周三'){ tempArr.push(3) }else if(value[i] === '周四'){ tempArr.push(4) }else if(value[i] === '周五'){ tempArr.push(5) }else if(value[i] === '周六'){ tempArr.push(6) }else if(value[i] === '周天'){ tempArr.push(0) } } this.arr = tempArr console.log(this.arr) } } } </script> <style scoped> </style>
之後UP想瞭一下。不對。後臺反過來的數組不應該是這種。大部分都應該是obj的形式
於是乎。
const cityOptions = [{a:'周一',b:1}, {a:'周二',b:2}, {a:'周三',b:3},{a:'周四',b:4},{a:'周五',b:5},{a:'周六',b:6},{a:'周天',b:7}];
對吧這種形式才對。說不定可能有很多很多。萬一叫你把一個月都列出來也說不定。
繼續上代碼
<template> <div style="height: 1000px"> <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">全選</el-checkbox> <div style="margin: 15px 0;"></div> <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange"> <el-checkbox v-for="city in cities" :label="city.b" :key="city.b">{{city.a}}</el-checkbox> </el-checkbox-group> </div> </template> <script> const cityOptions = [{a:'周一',b:1}, {a:'周二',b:2}, {a:'周三',b:3},{a:'周四',b:4},{a:'周五',b:5},{a:'周六',b:6},{a:'周天',b:7}]; export default { name: "tourSpecialEdition", components: {}, data(){ return{ checkAll: false, checkedCities: [], cities: cityOptions, isIndeterminate: false } }, created() {}, mounted() {}, methods: { handleCheckAllChange(val) { const arr = val ? cityOptions : []; this.checkedCities = []; arr.map(item => { this.checkedCities.push(item.b); console.log(this.checkedCities.sort()) }); this.isIndeterminate = false; }, handleCheckedCitiesChange(value) { let arrTime = value this.checkedCities = arrTime console.log(this.checkedCities.sort()) let checkedCount = value.length; this.checkAll = checkedCount === this.cities.length; this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length; } } } </script> <style scoped> </style>
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Vue實現自定義字段導出EXCEL的示例代碼
- vue中table實現真正的跨越全選
- jQuery實現購物車全功能
- vue項目input標簽checkbox,change和click綁定事件的區別說明
- vue 雙向綁定問題$emit無效的解決