| <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> |