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