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.children !== undefined) { 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 this.autoClose && 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(); } } }