| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 | <template>  <view class="uni-table-checkbox" @click="selected">    <view v-if="!indeterminate" class="checkbox__inner" :class="{'is-checked':isChecked,'is-disable':isDisabled}">      <view class="checkbox__inner-icon"></view>    </view>    <view v-else class="checkbox__inner checkbox--indeterminate">      <view class="checkbox__inner-icon"></view>    </view>  </view></template><script>export default {  name: 'TableCheckbox',  emits: ['checkboxSelected'],  props: {    indeterminate: {      type: Boolean,      default: false    },    checked: {      type: [Boolean, String],      default: false    },    disabled: {      type: Boolean,      default: false    },    index: {      type: Number,      default: -1    },    cellData: {      type: Object,      default() {        return {}      }    }  },  watch: {    checked(newVal) {      if (typeof this.checked === 'boolean') {        this.isChecked = newVal      } else {        this.isChecked = true      }    },    indeterminate(newVal) {      this.isIndeterminate = newVal    }  },  data() {    return {      isChecked: false,      isDisabled: false,      isIndeterminate: false    }  },  created() {    if (typeof this.checked === 'boolean') {      this.isChecked = this.checked    }    this.isDisabled = this.disabled  },  methods: {    selected() {      if (this.isDisabled) return      this.isIndeterminate = false      this.isChecked = !this.isChecked      this.$emit('checkboxSelected', {        checked: this.isChecked,        data: this.cellData      })    }  }}</script><style lang="scss">$checked-color: #007aff;$border-color: #DCDFE6;$disable: 0.4;.uni-table-checkbox {  display: flex;  flex-direction: row;  align-items: center;  justify-content: center;  position: relative;  margin: 5px 0;  cursor: pointer;  // 多选样式  .checkbox__inner {    /* #ifndef APP-NVUE */    flex-shrink: 0;    box-sizing: border-box;    /* #endif */    position: relative;    width: 16px;    height: 16px;    border: 1px solid $border-color;    border-radius: 2px;    background-color: #fff;    z-index: 1;    .checkbox__inner-icon {      position: absolute;      /* #ifdef APP-NVUE */      top: 2px;      /* #endif */      /* #ifndef APP-NVUE */      top: 2px;      /* #endif */      left: 5px;      height: 7px;      width: 3px;      border: 1px solid #fff;      border-left: 0;      border-top: 0;      opacity: 0;      transform-origin: center;      transform: rotate(45deg);      box-sizing: content-box;    }    &.checkbox--indeterminate {      border-color: $checked-color;      background-color: $checked-color;      .checkbox__inner-icon {        position: absolute;        opacity: 1;        transform: rotate(0deg);        height: 2px;        top: 0;        bottom: 0;        margin: auto;        left: 0px;        right: 0px;        bottom: 0;        width: auto;        border: none;        border-radius: 2px;        transform: scale(0.5);        background-color: #fff;      }    }    &:hover {      border-color: $checked-color;    }    // 禁用    &.is-disable {      /* #ifdef H5 */      cursor: not-allowed;      /* #endif */      background-color: #F2F6FC;      border-color: $border-color;    }    // 选中    &.is-checked {      border-color: $checked-color;      background-color: $checked-color;      .checkbox__inner-icon {        opacity: 1;        transform: rotate(45deg);      }      // 选中禁用      &.is-disable {        opacity: $disable;      }    }  }}</style>
 |