mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 02:08:43 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			246 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const BindingX = uni.requireNativePlugin('bindingx');
 | |
| const dom = uni.requireNativePlugin('dom');
 | |
| const animation = uni.requireNativePlugin('animation');
 | |
| 
 | |
| export default {
 | |
| 	data() {
 | |
| 		return {
 | |
| 			right: 0,
 | |
| 			button: [],
 | |
| 			preventGesture: false
 | |
| 		}
 | |
| 	},
 | |
| 
 | |
| 	watch: {
 | |
| 		show(newVal) {
 | |
| 			if (!this.position || JSON.stringify(this.position) === '{}') return;
 | |
| 			if (this.autoClose) return
 | |
| 			if (this.isInAnimation) return
 | |
| 			if (newVal) {
 | |
| 				this.open()
 | |
| 			} else {
 | |
| 				this.close()
 | |
| 			}
 | |
| 		},
 | |
| 	},
 | |
| 	created() {
 | |
| 		if (this.swipeaction.children !== undefined) {
 | |
| 			this.swipeaction.children.push(this)
 | |
| 		}
 | |
| 	},
 | |
| 	mounted() {
 | |
| 		this.boxSelector = this.getEl(this.$refs['selector-box-hock']);
 | |
| 		this.selector = this.getEl(this.$refs['selector-content-hock']);
 | |
| 		this.buttonSelector = this.getEl(this.$refs['selector-button-hock']);
 | |
| 		this.position = {}
 | |
| 		this.x = 0
 | |
| 		setTimeout(() => {
 | |
| 			this.getSelectorQuery()
 | |
| 		}, 200)
 | |
| 	},
 | |
| 	beforeDestroy() {
 | |
| 		if (this.timing) {
 | |
| 			BindingX.unbind({
 | |
| 				token: this.timing.token,
 | |
| 				eventType: 'timing'
 | |
| 			})
 | |
| 		}
 | |
| 		if (this.eventpan) {
 | |
| 			BindingX.unbind({
 | |
| 				token: this.eventpan.token,
 | |
| 				eventType: 'pan'
 | |
| 			})
 | |
| 		} 
 | |
| 		this.swipeaction.children.forEach((item, index) => {
 | |
| 			if (item === this) {
 | |
| 				this.swipeaction.children.splice(index, 1)
 | |
| 			}
 | |
| 		})
 | |
| 	},
 | |
| 	methods: {
 | |
| 		onClick(index, item) {
 | |
| 			this.$emit('click', {
 | |
| 				content: item,
 | |
| 				index
 | |
| 			})
 | |
| 		},
 | |
| 		touchstart(e) {
 | |
| 			if (this.isInAnimation) return
 | |
| 			if (this.stop) return
 | |
| 			this.stop = true
 | |
| 			if (this.autoClose) {
 | |
| 				this.swipeaction.closeOther(this)
 | |
| 			}
 | |
| 			let endWidth = this.right
 | |
| 			let boxStep = `(x+${this.x})`
 | |
| 			let pageX = `${boxStep}> ${-endWidth} && ${boxStep} < 0?${boxStep}:(x+${this.x} < 0? ${-endWidth}:0)`
 | |
| 
 | |
| 			let props = [{
 | |
| 				element: this.selector,
 | |
| 				property: 'transform.translateX',
 | |
| 				expression: pageX
 | |
| 			}]
 | |
| 
 | |
| 			let left = 0
 | |
| 			for (let i = 0; i < this.options.length; i++) {
 | |
| 				let buttonSelectors = this.getEl(this.$refs['button-hock'][i]);
 | |
| 				if (this.button.length === 0 || !this.button[i] || !this.button[i].width) return
 | |
| 				let moveMix = endWidth - left
 | |
| 				left += this.button[i].width
 | |
| 				let step = `(${this.x}+x)/${endWidth}`
 | |
| 				let moveX = `(${step}) * ${moveMix}`
 | |
| 				let pageButtonX = `${moveX}&& (x+${this.x} > ${-endWidth})?${moveX}:${-moveMix}`
 | |
| 				props.push({
 | |
| 					element: buttonSelectors,
 | |
| 					property: 'transform.translateX',
 | |
| 					expression: pageButtonX
 | |
| 				})
 | |
| 			}
 | |
| 
 | |
| 			this.eventpan = this._bind(this.boxSelector, props, 'pan', (e) => {
 | |
| 				if (e.state === 'end') {
 | |
| 					this.x = e.deltaX + this.x;
 | |
| 					if (this.x < -endWidth) {
 | |
| 						this.x = -endWidth
 | |
| 					}
 | |
| 					if (this.x > 0) {
 | |
| 						this.x = 0
 | |
| 					}
 | |
| 					this.stop = false
 | |
| 					this.bindTiming();
 | |
| 				}
 | |
| 			})
 | |
| 		},
 | |
| 		touchend(e) {
 | |
| 			this.$nextTick(() => {
 | |
| 				if (this.isopen && !this.isDrag && !this.isInAnimation) {
 | |
| 					this.close()
 | |
| 				}
 | |
| 			})
 | |
| 		},
 | |
| 		bindTiming() {
 | |
| 			if (this.isopen) {
 | |
| 				this.move(this.x, -this.right)
 | |
| 			} else {
 | |
| 				this.move(this.x, -40)
 | |
| 			}
 | |
| 		},
 | |
| 		move(left, value) {
 | |
| 			if (left >= value) {
 | |
| 				this.close()
 | |
| 			} else {
 | |
| 				this.open()
 | |
| 			}
 | |
| 		},
 | |
| 		/**
 | |
| 		 * 开启swipe
 | |
| 		 */
 | |
| 		open() {
 | |
| 			this.animation(true)
 | |
| 		},
 | |
| 		/**
 | |
| 		 * 关闭swipe
 | |
| 		 */
 | |
| 		close() {
 | |
| 			this.animation(false)
 | |
| 		},
 | |
| 		/**
 | |
| 		 * 开启关闭动画
 | |
| 		 * @param {Object} type
 | |
| 		 */
 | |
| 		animation(type) {
 | |
| 			this.isDrag = true
 | |
| 			let endWidth = this.right
 | |
| 			let time = 200
 | |
| 			this.isInAnimation = true;
 | |
| 
 | |
| 			let exit = `t>${time}`;
 | |
| 			let translate_x_expression = `easeOutExpo(t,${this.x},${type?(-endWidth-this.x):(-this.x)},${time})`
 | |
| 			let props = [{
 | |
| 				element: this.selector,
 | |
| 				property: 'transform.translateX',
 | |
| 				expression: translate_x_expression
 | |
| 			}]
 | |
| 
 | |
| 			let left = 0
 | |
| 			for (let i = 0; i < this.options.length; i++) {
 | |
| 				let buttonSelectors = this.getEl(this.$refs['button-hock'][i]);
 | |
| 				if (this.button.length === 0 || !this.button[i] || !this.button[i].width) return
 | |
| 				let moveMix = endWidth - left
 | |
| 				left += this.button[i].width
 | |
| 				let step = `${this.x}/${endWidth}`
 | |
| 				let moveX = `(${step}) * ${moveMix}`
 | |
| 				let pageButtonX = `easeOutExpo(t,${moveX},${type ? -moveMix + '-' + moveX: 0 + '-' + moveX},${time})`
 | |
| 				props.push({
 | |
| 					element: buttonSelectors,
 | |
| 					property: 'transform.translateX',
 | |
| 					expression: pageButtonX
 | |
| 				})
 | |
| 			}
 | |
| 
 | |
| 			this.timing = BindingX.bind({
 | |
| 				eventType: 'timing',
 | |
| 				exitExpression: exit,
 | |
| 				props: props
 | |
| 			}, (e) => {
 | |
| 				if (e.state === 'end' || e.state === 'exit') {
 | |
| 					this.x = type ? -endWidth : 0
 | |
| 					this.isInAnimation = false;
 | |
| 
 | |
| 					this.isopen = this.isopen || false
 | |
| 					if (this.isopen !== type) {
 | |
| 						this.$emit('change', type)
 | |
| 					}
 | |
| 					this.isopen = type
 | |
| 					this.isDrag = false
 | |
| 				}
 | |
| 			});
 | |
| 		},
 | |
| 		/**
 | |
| 		 * 绑定  BindingX
 | |
| 		 * @param {Object} anchor
 | |
| 		 * @param {Object} props
 | |
| 		 * @param {Object} fn
 | |
| 		 */
 | |
| 		_bind(anchor, props, eventType, fn) {
 | |
| 			return BindingX.bind({
 | |
| 				anchor,
 | |
| 				eventType,
 | |
| 				props
 | |
| 			}, (e) => {
 | |
| 				typeof(fn) === 'function' && fn(e)
 | |
| 			});
 | |
| 		},
 | |
| 		/**
 | |
| 		 * 获取ref
 | |
| 		 * @param {Object} el
 | |
| 		 */
 | |
| 		getEl(el) {
 | |
| 			return el.ref
 | |
| 		},
 | |
| 		/**
 | |
| 		 * 获取节点信息
 | |
| 		 */
 | |
| 		getSelectorQuery() {
 | |
| 			dom.getComponentRect(this.$refs['selector-content-hock'], (data) => {
 | |
| 				if (this.position.content) return
 | |
| 				this.position.content = data.size
 | |
| 			})
 | |
| 			for (let i = 0; i < this.options.length; i++) {
 | |
| 				dom.getComponentRect(this.$refs['button-hock'][i], (data) => {
 | |
| 					if (!this.button) {
 | |
| 						this.button = []
 | |
| 					}
 | |
| 					if (this.options.length === this.button.length) return
 | |
| 					this.button.push(data.size)
 | |
| 					this.right += data.size.width
 | |
| 					if (this.autoClose) return
 | |
| 					if (this.show) {
 | |
| 						this.open()
 | |
| 					}
 | |
| 				})
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
