mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	
		
			
	
	
		
			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">
							 | 
						||
| 
								 | 
							
									$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>
							 |