自定义checkbox组件

博客围绕条件搜索的需求展开,适用场景为条件搜索。规定选择“所有”选项时,其他子选项取消选择;选择子选项时,“所有”选项取消选择,默认选所有,与后台协商选所有传 null ,还给出了效果图和代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


需求


  1. 适用场景-条件搜索
  2. 选择的"所有"的选项,其他子选项取消选择
  3. 选择了子选项,"所有"选项取消选择
  4. 默认选择所有,跟后台协商好了选择所有传null,可以根据自己的情况修改

效果图



代码


<template>
  <div>
    <label class="label">
      <input
        v-model="arr"
        type="checkbox"
        class="label-checkbox"
        :value="null"
        @click="selectAll"
      />
      <span class="label-triangle"></span>
      <span class="label-text">所有</span>
    </label>
    <label class="label" v-for="item of options" :key="item.key">
      <input
        v-model="arr"
        type="checkbox"
        class="label-checkbox"
        :value="item.key"
        @click="spliceAll"
      />
      <span class="label-triangle"></span>
      <span class="label-text">{{ item.label }}</span>
    </label>
  </div>
</template>

<script>
export default {
  props: {
    options: Array
  },
  data() {
    return {
      arr: [null],
      checked: false
    };
  },
  methods: {
    selectAll() {
      const index = this.arr.indexOf(null);
      if (index == -1) {
        this.arr = [null];
      }
    },
    spliceAll() {
      const index = this.arr.indexOf(null);
      if (index > -1) {
        this.arr.splice(index, 1);
      }
    },
    getArr() {
      this.$emit("getArr", this.arr);
      console.log(this.arr);
    }
  }
};
</script>

<style scoped lang="scss">
//多选框的样式
.label {
  float: left;
  display: flex;
  height: 30px;
  line-height: 30px;
  align-items: center;
  justify-content: center;
  margin-right: 20px;
  cursor: pointer;
  .label-checkbox {
    width: 0;
    height: 0;
    opacity: 0;
  }
  .label-triangle {
    display: inline-block;
    height: 16px;
    width: 16px;
    border: 1px solid $border1;
    border-radius: 2px;
    margin-right: 4px;
    position: relative;
    &:after {
      content: "";
      background-image: url("../../../../img/check.png");
      background-size: 100%;
      display: block;
      color: #000;
      position: absolute;
      top: 0;
      bottom: 0;
      right: 0;
      left: 0;
    }
  }
  .label-text {
    font-weight: normal;
    color: $text3;
    &:hover {
      color: $mtc;
    }
  }
  .label-checkbox {
    &:checked {
      + .label-triangle {
        border-color: $mtc-hover;
        background: $mtc;
        + .label-text {
          color: $mtc;
        }
      }
    }
  }
}
</style>
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值