180 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<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">
 | 
						|
	$uni-primary: #007aff !default;
 | 
						|
	$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: $uni-primary;
 | 
						|
				background-color: $uni-primary;
 | 
						|
 | 
						|
				.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: $uni-primary;
 | 
						|
			}
 | 
						|
			// 禁用
 | 
						|
			&.is-disable {
 | 
						|
				/* #ifdef H5 */
 | 
						|
				cursor: not-allowed;
 | 
						|
				/* #endif */
 | 
						|
				background-color: #F2F6FC;
 | 
						|
				border-color: $border-color;
 | 
						|
			}
 | 
						|
 | 
						|
			// 选中
 | 
						|
			&.is-checked {
 | 
						|
				border-color: $uni-primary;
 | 
						|
				background-color: $uni-primary;
 | 
						|
 | 
						|
				.checkbox__inner-icon {
 | 
						|
					opacity: 1;
 | 
						|
					transform: rotate(45deg);
 | 
						|
				}
 | 
						|
 | 
						|
				// 选中禁用
 | 
						|
				&.is-disable {
 | 
						|
					opacity: $disable;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			
 | 
						|
		}
 | 
						|
	}
 | 
						|
</style>
 |