一.全选,单独勾选的逻辑思路
- 首先要判断点击的是全选,还是其中的单独每一项
- 如果第一次点的是全选,那么单独的每一项就需要全部选中,如果第二次还是点击全选呢?这时就需要判断一下,如果再次点击全选,即是全不选的思路,即全选取反
- 如果点击的是单独的每一项,直接取反即可,但是有一种情况就是,所有的单独选项都被勾选,那么全选是不是就需要被勾选呢?如果此时在有一项甚至几项取消,那么不符合全选,此时的全选也应该随着取消
<template>
<div class="box">
<div class="all">
<div v-for="(data, index) in datalist" :key="index" @click="handleClick(index)">
<p class="data">
<span class="data_text">{{ data.text }}</span>
<span v-if="data.isSelect" class="data_icon"><i class="el-icon-check"></i></span>
</p>
</div>
</div>
<button @click=handleSure>确定</button>
<div class="contentText">{{ contentText }}</div>
</div>
</template>
<script>
export default {
data() {
return {
datalist: [
{ text: "全部", isSelect: false },
{ text: "李钟硕", isSelect: false },
{ text: "蔡徐坤", isSelect: false },
{ text: "朱正廷", isSelect: false },
{ text: "范丞丞", isSelect: false },
{ text: "黄明昊", isSelect: false },
],
contentText: "李钟硕",
};
},
methods: {
handleClick(index) {
if (index === 0) {
let firstSelect = this.datalist[0].isSelect;
this.datalist.forEach((item) => {
if (firstSelect) {
item.isSelect = false;
} else {
item.isSelect = true;
}
});
} else {
this.datalist[index].isSelect = !this.datalist[index].isSelect;
let AllSelect = this.datalist.slice(1).every((item) => {
return item.isSelect;
});
this.datalist[0].isSelect = AllSelect;
}
},
handleSure () {
let content = ''
this.datalist.slice(1).forEach((item) => {
if(item.isSelect === true) {
content += item.text +','
this.contentText = content
}
})
}
},
};
</script>
<style lang="scss">
.box {
width: 100%;
.all {
width: 400px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.data {
border: 1px solid pink;
width: 100px;
height: 40px;
line-height: 40px;
display: flex;
justify-content: space-between;
padding: 0px 5px;
}
}
button {
width: 100px;
height: 40px;
line-height: 40px;
margin-bottom: 20px;
}
.contentText {
font-size: 22px;
}
}
</style>
