mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	
		
			
	
	
		
			348 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			348 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
|   | <template> | |||
|  | 	<!-- 在微信小程序 app vue端 h5 使用wxs 实现--> | |||
|  | 	<!-- #ifdef APP-VUE || MP-WEIXIN || H5 --> | |||
|  | 	<view class="uni-swipe"> | |||
|  | 		<!--  #ifdef MP-WEIXIN || VUE3 --> | |||
|  | 		<view class="uni-swipe_box" :change:prop="wxsswipe.showWatch" :prop="is_show" :data-threshold="threshold" | |||
|  | 			:data-disabled="disabled" @touchstart="wxsswipe.touchstart" @touchmove="wxsswipe.touchmove" | |||
|  | 			@touchend="wxsswipe.touchend"> | |||
|  | 			<!-- #endif --> | |||
|  | 			<!--  #ifndef MP-WEIXIN || VUE3 --> | |||
|  | 			<view class="uni-swipe_box" :change:prop="renderswipe.showWatch" :prop="is_show" :data-threshold="threshold" | |||
|  | 				:data-disabled="disabled+''" @touchstart="renderswipe.touchstart" @touchmove="renderswipe.touchmove" | |||
|  | 				@touchend="renderswipe.touchend"> | |||
|  | 				<!-- #endif --> | |||
|  | 				<!-- 在微信小程序 app vue端 h5 使用wxs 实现--> | |||
|  | 				<view class="uni-swipe_button-group button-group--left"> | |||
|  | 					<slot name="left"> | |||
|  | 						<view v-for="(item,index) in leftOptions" :key="index" :style="{ | |||
|  | 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' | |||
|  | 					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart" | |||
|  | 							@touchend="appTouchEnd($event,index,item,'left')" | |||
|  | 							@click.stop="onClickForPC(index,item,'left')"> | |||
|  | 							<text class="uni-swipe_button-text" | |||
|  | 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> | |||
|  | 						</view> | |||
|  | 					</slot> | |||
|  | 				</view> | |||
|  | 				<view class="uni-swipe_text--center"> | |||
|  | 					<slot></slot> | |||
|  | 				</view> | |||
|  | 				<view class="uni-swipe_button-group button-group--right"> | |||
|  | 					<slot name="right"> | |||
|  | 						<view v-for="(item,index) in rightOptions" :key="index" :style="{ | |||
|  | 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' | |||
|  | 					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart" | |||
|  | 							@touchend="appTouchEnd($event,index,item,'right')" | |||
|  | 							@click.stop="onClickForPC(index,item,'right')"><text class="uni-swipe_button-text" | |||
|  | 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> | |||
|  | 						</view> | |||
|  | 					</slot> | |||
|  | 				</view> | |||
|  | 			</view> | |||
|  | 		</view> | |||
|  | 		<!-- #endif --> | |||
|  | 		<!-- app nvue端 使用 bindingx --> | |||
|  | 		<!-- #ifdef APP-NVUE --> | |||
|  | 		<view ref="selector-box--hock" class="uni-swipe" @horizontalpan="touchstart" @touchend="touchend"> | |||
|  | 			<view ref='selector-left-button--hock' class="uni-swipe_button-group button-group--left"> | |||
|  | 				<slot name="left"> | |||
|  | 					<view v-for="(item,index) in leftOptions" :key="index" :style="{ | |||
|  | 				  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' | |||
|  | 				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'left')"><text | |||
|  | 							class="uni-swipe_button-text" | |||
|  | 							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF', fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> | |||
|  | 					</view> | |||
|  | 				</slot> | |||
|  | 			</view> | |||
|  | 			<view ref='selector-right-button--hock' class="uni-swipe_button-group button-group--right"> | |||
|  | 				<slot name="right"> | |||
|  | 					<view v-for="(item,index) in rightOptions" :key="index" :style="{ | |||
|  | 				  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' | |||
|  | 				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'right')"><text | |||
|  | 							class="uni-swipe_button-text" | |||
|  | 							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> | |||
|  | 					</view> | |||
|  | 				</slot> | |||
|  | 			</view> | |||
|  | 			<view ref='selector-content--hock' class="uni-swipe_box"> | |||
|  | 				<slot></slot> | |||
|  | 			</view> | |||
|  | 		</view> | |||
|  | 		<!-- #endif --> | |||
|  | 		<!-- 其他平台使用 js ,长列表性能可能会有影响--> | |||
|  | 		<!-- #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ --> | |||
|  | 		<view class="uni-swipe"> | |||
|  | 			<view class="uni-swipe_box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"
 | |||
|  | 				:style="{transform:moveLeft}" :class="{ani:ani}"> | |||
|  | 				<view class="uni-swipe_button-group button-group--left" :class="[elClass]"> | |||
|  | 					<slot name="left"> | |||
|  | 						<view v-for="(item,index) in leftOptions" :key="index" :style="{ | |||
|  | 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD', | |||
|  | 					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px' | |||
|  | 					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart" | |||
|  | 							@touchend="appTouchEnd($event,index,item,'left')"><text class="uni-swipe_button-text" | |||
|  | 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text> | |||
|  | 						</view> | |||
|  | 					</slot> | |||
|  | 				</view> | |||
|  | 				<slot></slot> | |||
|  | 				<view class="uni-swipe_button-group button-group--right" :class="[elClass]"> | |||
|  | 					<slot name="right"> | |||
|  | 						<view v-for="(item,index) in rightOptions" :key="index" :style="{ | |||
|  | 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD', | |||
|  | 					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px' | |||
|  | 					}" @touchstart="appTouchStart" @touchend="appTouchEnd($event,index,item,'right')" | |||
|  | 							class="uni-swipe_button button-hock"><text class="uni-swipe_button-text" | |||
|  | 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text> | |||
|  | 						</view> | |||
|  | 					</slot> | |||
|  | 				</view> | |||
|  | 			</view> | |||
|  | 		</view> | |||
|  | 		<!-- #endif --> | |||
|  | 
 | |||
|  | </template> | |||
|  | <script src="./wx.wxs" module="wxsswipe" lang="wxs"></script> | |||
|  | 
 | |||
|  | <script module="renderswipe" lang="renderjs"> | |||
|  | 	import render from './render.js' | |||
|  | 	export default { | |||
|  | 		mounted(e, ins, owner) { | |||
|  | 			this.state = {} | |||
|  | 		}, | |||
|  | 		methods: { | |||
|  | 			showWatch(newVal, oldVal, ownerInstance, instance) { | |||
|  | 				render.showWatch(newVal, oldVal, ownerInstance, instance, this) | |||
|  | 			}, | |||
|  | 			touchstart(e, ownerInstance) { | |||
|  | 				render.touchstart(e, ownerInstance, this) | |||
|  | 			}, | |||
|  | 			touchmove(e, ownerInstance) { | |||
|  | 				render.touchmove(e, ownerInstance, this) | |||
|  | 			}, | |||
|  | 			touchend(e, ownerInstance) { | |||
|  | 				render.touchend(e, ownerInstance, this) | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | </script> | |||
|  | <script> | |||
|  | 	import mpwxs from './mpwxs' | |||
|  | 	import bindingx from './bindingx.js' | |||
|  | 	import mpother from './mpother' | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * SwipeActionItem 滑动操作子组件 | |||
|  | 	 * @description 通过滑动触发选项的容器 | |||
|  | 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=181
 | |||
|  | 	 * @property {Boolean} show = [left|right|none] 	开启关闭组件,auto-close = false 时生效 | |||
|  | 	 * @property {Boolean} disabled = [true|false] 		是否禁止滑动 | |||
|  | 	 * @property {Boolean} autoClose = [true|false] 	滑动打开当前组件,是否关闭其他组件 | |||
|  | 	 * @property {Number}  threshold 					滑动缺省值 | |||
|  | 	 * @property {Array} leftOptions 					左侧选项内容及样式 | |||
|  | 	 * @property {Array} rgihtOptions 					右侧选项内容及样式 | |||
|  | 	 * @event {Function} click 							点击选项按钮时触发事件,e = {content,index} ,content(点击内容)、index(下标) | |||
|  | 	 * @event {Function} change 						组件打开或关闭时触发,left\right\none | |||
|  | 	 */ | |||
|  | 
 | |||
|  | 	export default { | |||
|  | 		mixins: [mpwxs, bindingx, mpother], | |||
|  | 		emits: ['click', 'change'], | |||
|  | 		props: { | |||
|  | 			// 控制开关
 | |||
|  | 			show: { | |||
|  | 				type: String, | |||
|  | 				default: 'none' | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			// 禁用
 | |||
|  | 			disabled: { | |||
|  | 				type: Boolean, | |||
|  | 				default: false | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			// 是否自动关闭
 | |||
|  | 			autoClose: { | |||
|  | 				type: Boolean, | |||
|  | 				default: true | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			// 滑动缺省距离
 | |||
|  | 			threshold: { | |||
|  | 				type: Number, | |||
|  | 				default: 20 | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			// 左侧按钮内容
 | |||
|  | 			leftOptions: { | |||
|  | 				type: Array, | |||
|  | 				default () { | |||
|  | 					return [] | |||
|  | 				} | |||
|  | 			}, | |||
|  | 
 | |||
|  | 			// 右侧按钮内容
 | |||
|  | 			rightOptions: { | |||
|  | 				type: Array, | |||
|  | 				default () { | |||
|  | 					return [] | |||
|  | 				} | |||
|  | 			} | |||
|  | 
 | |||
|  | 		}, | |||
|  | 		// #ifndef VUE3
 | |||
|  | 		// TODO vue2
 | |||
|  | 		destroyed() { | |||
|  | 			if (this.__isUnmounted) return | |||
|  | 			this.uninstall() | |||
|  | 		}, | |||
|  | 		// #endif
 | |||
|  | 		// #ifdef VUE3
 | |||
|  | 		// TODO vue3
 | |||
|  | 		unmounted() { | |||
|  | 			this.__isUnmounted = true | |||
|  | 			this.uninstall() | |||
|  | 		}, | |||
|  | 		// #endif
 | |||
|  | 
 | |||
|  | 		methods: { | |||
|  | 			uninstall() { | |||
|  | 				if (this.swipeaction) { | |||
|  | 					this.swipeaction.children.forEach((item, index) => { | |||
|  | 						if (item === this) { | |||
|  | 							this.swipeaction.children.splice(index, 1) | |||
|  | 						} | |||
|  | 					}) | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			/** | |||
|  | 			 * 获取父元素实例 | |||
|  | 			 */ | |||
|  | 			getSwipeAction(name = 'uniSwipeAction') { | |||
|  | 				let parent = this.$parent; | |||
|  | 				let parentName = parent.$options.name; | |||
|  | 				while (parentName !== name) { | |||
|  | 					parent = parent.$parent; | |||
|  | 					if (!parent) return false; | |||
|  | 					parentName = parent.$options.name; | |||
|  | 				} | |||
|  | 				return parent; | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | </script> | |||
|  | <style lang="scss"> | |||
|  | 	.uni-swipe { | |||
|  | 		position: relative; | |||
|  | 		/* #ifndef APP-NVUE */ | |||
|  | 		overflow: hidden; | |||
|  | 		/* #endif */ | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.uni-swipe_box { | |||
|  | 		/* #ifndef APP-NVUE */ | |||
|  | 		display: flex; | |||
|  | 		flex-shrink: 0; | |||
|  | 		// touch-action: none;
 | |||
|  | 		/* #endif */ | |||
|  | 		position: relative; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.uni-swipe_content { | |||
|  | 		// border: 1px red solid;
 | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.uni-swipe_text--center { | |||
|  | 		width: 100%; | |||
|  | 		/* #ifndef APP-NVUE */ | |||
|  | 		cursor: grab; | |||
|  | 		/* #endif */ | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.uni-swipe_button-group { | |||
|  | 		/* #ifndef APP-NVUE */ | |||
|  | 		box-sizing: border-box; | |||
|  | 		display: flex; | |||
|  | 		/* #endif */ | |||
|  | 		flex-direction: row; | |||
|  | 		position: absolute; | |||
|  | 		top: 0; | |||
|  | 		bottom: 0; | |||
|  | 		/* #ifdef H5 */ | |||
|  | 		cursor: pointer; | |||
|  | 		/* #endif */ | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.button-group--left { | |||
|  | 		left: 0; | |||
|  | 		transform: translateX(-100%) | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.button-group--right { | |||
|  | 		right: 0; | |||
|  | 		transform: translateX(100%) | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.uni-swipe_button { | |||
|  | 		/* #ifdef APP-NVUE */ | |||
|  | 		flex: 1; | |||
|  | 		/* #endif */ | |||
|  | 		/* #ifndef APP-NVUE */ | |||
|  | 		display: flex; | |||
|  | 		/* #endif */ | |||
|  | 		flex-direction: row; | |||
|  | 		justify-content: center; | |||
|  | 		align-items: center; | |||
|  | 		padding: 0 20px; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.uni-swipe_button-text { | |||
|  | 		/* #ifndef APP-NVUE */ | |||
|  | 		flex-shrink: 0; | |||
|  | 		/* #endif */ | |||
|  | 		font-size: 14px; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.ani { | |||
|  | 		transition-property: transform; | |||
|  | 		transition-duration: 0.3s; | |||
|  | 		transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/* #ifdef MP-ALIPAY */ | |||
|  | 	.movable-area { | |||
|  | 		/* width: 100%; */ | |||
|  | 		height: 45px; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.movable-view { | |||
|  | 		display: flex; | |||
|  | 		/* justify-content: center; */ | |||
|  | 		position: relative; | |||
|  | 		flex: 1; | |||
|  | 		height: 45px; | |||
|  | 		z-index: 2; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.movable-view-button { | |||
|  | 		display: flex; | |||
|  | 		flex-shrink: 0; | |||
|  | 		flex-direction: row; | |||
|  | 		height: 100%; | |||
|  | 		background: #C0C0C0; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/* .transition { | |||
|  | 		transition: all 0.3s; | |||
|  | 	} */ | |||
|  | 
 | |||
|  | 	.movable-view-box { | |||
|  | 		flex-shrink: 0; | |||
|  | 		height: 100%; | |||
|  | 		background-color: #fff; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/* #endif */ | |||
|  | </style> |