| export default { | |
| 	data() { | |
| 		return { | |
| 			x: 0, | |
| 			transition: false, | |
| 			width: 0, | |
| 			viewWidth: 0, | |
| 			swipeShow: 0 | |
| 		} | |
| 	}, | |
| 	watch: { | |
| 		show(newVal) { | |
| 			if (this.autoClose) return | |
| 			if (newVal && newVal !== 'none') { | |
| 				this.transition = true | |
| 				this.open(newVal) | |
| 			} else { | |
| 				this.close() | |
| 			} | |
| 		} | |
| 	}, | |
| 	created() { | |
| 		this.swipeaction = this.getSwipeAction() | |
| 		if (this.swipeaction && Array.isArray(this.swipeaction.children)) { | |
| 			this.swipeaction.children.push(this) | |
| 		} | |
| 	}, | |
| 	mounted() { | |
| 		this.isopen = false | |
| 		setTimeout(() => { | |
| 			this.getQuerySelect() | |
| 		}, 50) | |
| 	}, | |
| 	methods: { | |
| 		appTouchStart(e) { | |
| 			const { | |
| 				clientX | |
| 			} = e.changedTouches[0] | |
| 			this.clientX = clientX | |
| 			this.timestamp = new Date().getTime() | |
| 		}, | |
| 		appTouchEnd(e, index, item, position) { | |
| 			const { | |
| 				clientX | |
| 			} = e.changedTouches[0] | |
| 			// fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 | |
| 			let diff = Math.abs(this.clientX - clientX) | |
| 			let time = (new Date().getTime()) - this.timestamp | |
| 			if (diff < 40 && time < 300) { | |
| 				this.$emit('click', { | |
| 					content: item, | |
| 					index, | |
| 					position | |
| 				}) | |
| 			} | |
| 		}, | |
| 		/** | |
| 		 * 移动触发 | |
| 		 * @param {Object} e | |
| 		 */ | |
| 		onChange(e) { | |
| 			this.moveX = e.detail.x | |
| 			this.isclose = false | |
| 		}, | |
| 		touchstart(e) { | |
| 			this.transition = false | |
| 			this.isclose = true | |
| 			if (this.autoClose && this.swipeaction) { | |
| 				this.swipeaction.closeOther(this) | |
| 			} | |
| 		}, | |
| 		touchmove(e) {}, | |
| 		touchend(e) { | |
| 			// 0的位置什么都不执行 | |
| 			if (this.isclose && this.isopen === 'none') return | |
| 			if (this.isclose && this.isopen !== 'none') { | |
| 				this.transition = true | |
| 				this.close() | |
| 			} else { | |
| 				this.move(this.moveX + this.leftWidth) | |
| 			} | |
| 		}, | |
| 
 | |
| 		/** | |
| 		 * 移动 | |
| 		 * @param {Object} moveX | |
| 		 */ | |
| 		move(moveX) { | |
| 			// 打开关闭的处理逻辑不太一样 | |
| 			this.transition = true | |
| 			// 未打开状态 | |
| 			if (!this.isopen || this.isopen === 'none') { | |
| 				if (moveX > this.threshold) { | |
| 					this.open('left') | |
| 				} else if (moveX < -this.threshold) { | |
| 					this.open('right') | |
| 				} else { | |
| 					this.close() | |
| 				} | |
| 			} else { | |
| 				if (moveX < 0 && moveX < this.rightWidth) { | |
| 					const rightX = this.rightWidth + moveX | |
| 					if (rightX < this.threshold) { | |
| 						this.open('right') | |
| 					} else { | |
| 						this.close() | |
| 					} | |
| 				} else if (moveX > 0 && moveX < this.leftWidth) { | |
| 					const leftX = this.leftWidth - moveX | |
| 					if (leftX < this.threshold) { | |
| 						this.open('left') | |
| 					} else { | |
| 						this.close() | |
| 					} | |
| 				} | |
| 
 | |
| 			} | |
| 
 | |
| 		}, | |
| 
 | |
| 		/** | |
| 		 * 打开 | |
| 		 */ | |
| 		open(type) { | |
| 			this.x = this.moveX | |
| 			this.animation(type) | |
| 		}, | |
| 
 | |
| 		/** | |
| 		 * 关闭 | |
| 		 */ | |
| 		close() { | |
| 			this.x = this.moveX | |
| 			// TODO 解决 x 值不更新的问题,所以会多触发一次 nextTick ,待优化 | |
| 			this.$nextTick(() => { | |
| 				this.x = -this.leftWidth | |
| 				if (this.isopen !== 'none') { | |
| 					this.$emit('change', 'none') | |
| 				} | |
| 				this.isopen = 'none' | |
| 			}) | |
| 		}, | |
| 
 | |
| 		/** | |
| 		 * 执行结束动画 | |
| 		 * @param {Object} type | |
| 		 */ | |
| 		animation(type) { | |
| 			this.$nextTick(() => { | |
| 				if (type === 'left') { | |
| 					this.x = 0 | |
| 				} else { | |
| 					this.x = -this.rightWidth - this.leftWidth | |
| 				} | |
| 
 | |
| 				if (this.isopen !== type) { | |
| 					this.$emit('change', type) | |
| 				} | |
| 				this.isopen = type | |
| 			}) | |
| 
 | |
| 		}, | |
| 		getSlide(x) {}, | |
| 		getQuerySelect() { | |
| 			const query = uni.createSelectorQuery().in(this); | |
| 			query.selectAll('.movable-view--hock').boundingClientRect(data => { | |
| 				this.leftWidth = data[1].width | |
| 				this.rightWidth = data[2].width | |
| 				this.width = data[0].width | |
| 				this.viewWidth = this.width + this.rightWidth + this.leftWidth | |
| 				if (this.leftWidth === 0) { | |
| 					// TODO 疑似bug ,初始化的时候如果x 是0,会导致移动位置错误,所以让元素超出一点 | |
| 					this.x = -0.1 | |
| 				} else { | |
| 					this.x = -this.leftWidth | |
| 				} | |
| 				this.moveX = this.x | |
| 				this.$nextTick(() => { | |
| 					this.swipeShow = 1 | |
| 				}) | |
| 
 | |
| 				if (!this.buttonWidth) { | |
| 					this.disabledView = true | |
| 				} | |
| 
 | |
| 				if (this.autoClose) return | |
| 				if (this.show !== 'none') { | |
| 					this.transition = true | |
| 					this.open(this.shows) | |
| 				} | |
| 			}).exec(); | |
| 
 | |
| 		} | |
| 	} | |
| }
 |