| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 | 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()					}				})			}		}	}}
 |