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