| let bindIngXMixins = {} | 
|   | 
| // #ifdef APP-NVUE | 
| const BindingX = uni.requireNativePlugin('bindingx'); | 
| const dom = uni.requireNativePlugin('dom'); | 
| const animation = uni.requireNativePlugin('animation'); | 
|   | 
| bindIngXMixins = { | 
|     data() { | 
|         return {} | 
|     }, | 
|   | 
|     watch: { | 
|         show(newVal) { | 
|             if (this.autoClose) return | 
|             if (this.stop) return | 
|             this.stop = true | 
|             if (newVal) { | 
|                 this.open(newVal) | 
|             } else { | 
|                 this.close() | 
|             } | 
|         }, | 
|         leftOptions() { | 
|             this.getSelectorQuery() | 
|             this.init() | 
|         }, | 
|         rightOptions(newVal) { | 
|             this.init() | 
|         } | 
|     }, | 
|     created() { | 
|         this.swipeaction = this.getSwipeAction() | 
|         if (this.swipeaction && Array.isArray(this.swipeaction.children)) { | 
|             this.swipeaction.children.push(this) | 
|         } | 
|     }, | 
|     mounted() { | 
|         this.box = this.getEl(this.$refs['selector-box--hock']) | 
|         this.selector = this.getEl(this.$refs['selector-content--hock']); | 
|         this.leftButton = this.getEl(this.$refs['selector-left-button--hock']); | 
|         this.rightButton = this.getEl(this.$refs['selector-right-button--hock']); | 
|         this.init() | 
|     }, | 
|     // beforeDestroy() { | 
|     //     this.swipeaction.children.forEach((item, index) => { | 
|     //         if (item === this) { | 
|     //             this.swipeaction.children.splice(index, 1) | 
|     //         } | 
|     //     }) | 
|     // }, | 
|     methods: { | 
|         init() { | 
|             this.$nextTick(() => { | 
|                 this.x = 0 | 
|                 this.button = { | 
|                     show: false | 
|                 } | 
|                 setTimeout(() => { | 
|                     this.getSelectorQuery() | 
|                 }, 200) | 
|             }) | 
|         }, | 
|         onClick(index, item, position) { | 
|             this.$emit('click', { | 
|                 content: item, | 
|                 index, | 
|                 position | 
|             }) | 
|         }, | 
|         touchstart(e) { | 
|             // fix by mehaotian 禁止滑动 | 
|             if (this.disabled) return | 
|             // 每次只触发一次,避免多次监听造成闪烁 | 
|             if (this.stop) return | 
|             this.stop = true | 
|             if (this.autoClose && this.swipeaction) { | 
|                 this.swipeaction.closeOther(this) | 
|             } | 
|   | 
|             const leftWidth = this.button.left.width | 
|             const rightWidth = this.button.right.width | 
|             let expression = this.range(this.x, -rightWidth, leftWidth) | 
|             let leftExpression = this.range(this.x - leftWidth, -leftWidth, 0) | 
|             let rightExpression = this.range(this.x + rightWidth, 0, rightWidth) | 
|   | 
|             this.eventpan = BindingX.bind({ | 
|                 anchor: this.box, | 
|                 eventType: 'pan', | 
|                 props: [{ | 
|                     element: this.selector, | 
|                     property: 'transform.translateX', | 
|                     expression | 
|                 }, { | 
|                     element: this.leftButton, | 
|                     property: 'transform.translateX', | 
|                     expression: leftExpression | 
|                 }, { | 
|                     element: this.rightButton, | 
|                     property: 'transform.translateX', | 
|                     expression: rightExpression | 
|                 }, ] | 
|             }, (e) => { | 
|                 // nope | 
|                 if (e.state === 'end') { | 
|                     this.x = e.deltaX + this.x; | 
|                     this.isclick = true | 
|                     this.bindTiming(e.deltaX) | 
|                 } | 
|             }); | 
|         }, | 
|         touchend(e) { | 
|             if (this.isopen !== 'none' && !this.isclick) { | 
|                 this.open('none') | 
|             } | 
|         }, | 
|         bindTiming(x) { | 
|             const left = this.x | 
|             const leftWidth = this.button.left.width | 
|             const rightWidth = this.button.right.width | 
|             const threshold = this.threshold | 
|             if (!this.isopen || this.isopen === 'none') { | 
|                 if (left > threshold) { | 
|                     this.open('left') | 
|                 } else if (left < -threshold) { | 
|                     this.open('right') | 
|                 } else { | 
|                     this.open('none') | 
|                 } | 
|             } else { | 
|                 if ((x > -leftWidth && x < 0) || x > rightWidth) { | 
|                     if ((x > -threshold && x < 0) || (x - rightWidth > threshold)) { | 
|                         this.open('left') | 
|                     } else { | 
|                         this.open('none') | 
|                     } | 
|                 } else { | 
|                     if ((x < threshold && x > 0) || (x + leftWidth < -threshold)) { | 
|                         this.open('right') | 
|                     } else { | 
|                         this.open('none') | 
|                     } | 
|                 } | 
|             } | 
|         }, | 
|   | 
|         /** | 
|          * 移动范围 | 
|          * @param {Object} num | 
|          * @param {Object} mix | 
|          * @param {Object} max | 
|          */ | 
|         range(num, mix, max) { | 
|             return `min(max(x+${num}, ${mix}), ${max})` | 
|         }, | 
|   | 
|         /** | 
|          * 开启swipe | 
|          */ | 
|         open(type) { | 
|             this.animation(type) | 
|         }, | 
|   | 
|         /** | 
|          * 关闭swipe | 
|          */ | 
|         close() { | 
|             this.animation('none') | 
|         }, | 
|   | 
|         /** | 
|          * 开启关闭动画 | 
|          * @param {Object} type | 
|          */ | 
|         animation(type) { | 
|             const time = 300 | 
|             const leftWidth = this.button.left.width | 
|             const rightWidth = this.button.right.width | 
|             if (this.eventpan && this.eventpan.token) { | 
|                 BindingX.unbind({ | 
|                     token: this.eventpan.token, | 
|                     eventType: 'pan' | 
|                 }) | 
|             } | 
|   | 
|             switch (type) { | 
|                 case 'left': | 
|                     Promise.all([ | 
|                         this.move(this.selector, leftWidth), | 
|                         this.move(this.leftButton, 0), | 
|                         this.move(this.rightButton, rightWidth * 2) | 
|                     ]).then(() => { | 
|                         this.setEmit(leftWidth, type) | 
|                     }) | 
|                     break | 
|                 case 'right': | 
|                     Promise.all([ | 
|                         this.move(this.selector, -rightWidth), | 
|                         this.move(this.leftButton, -leftWidth * 2), | 
|                         this.move(this.rightButton, 0) | 
|                     ]).then(() => { | 
|                         this.setEmit(-rightWidth, type) | 
|                     }) | 
|                     break | 
|                 default: | 
|                     Promise.all([ | 
|                         this.move(this.selector, 0), | 
|                         this.move(this.leftButton, -leftWidth), | 
|                         this.move(this.rightButton, rightWidth) | 
|                     ]).then(() => { | 
|                         this.setEmit(0, type) | 
|                     }) | 
|   | 
|             } | 
|         }, | 
|         setEmit(x, type) { | 
|             const leftWidth = this.button.left.width | 
|             const rightWidth = this.button.right.width | 
|             this.isopen = this.isopen || 'none' | 
|             this.stop = false | 
|             this.isclick = false | 
|             // 只有状态不一致才会返回结果 | 
|             if (this.isopen !== type && this.x !== x) { | 
|                 if (type === 'left' && leftWidth > 0) { | 
|                     this.$emit('change', 'left') | 
|                 } | 
|                 if (type === 'right' && rightWidth > 0) { | 
|                     this.$emit('change', 'right') | 
|                 } | 
|                 if (type === 'none') { | 
|                     this.$emit('change', 'none') | 
|                 } | 
|             } | 
|             this.x = x | 
|             this.isopen = type | 
|         }, | 
|         move(ref, value) { | 
|             return new Promise((resolve, reject) => { | 
|                 animation.transition(ref, { | 
|                     styles: { | 
|                         transform: `translateX(${value})`, | 
|                     }, | 
|                     duration: 150, //ms | 
|                     timingFunction: 'linear', | 
|                     needLayout: false, | 
|                     delay: 0 //ms | 
|                 }, function(res) { | 
|                     resolve(res) | 
|                 }) | 
|             }) | 
|   | 
|         }, | 
|   | 
|         /** | 
|          * 获取ref | 
|          * @param {Object} el | 
|          */ | 
|         getEl(el) { | 
|             return el.ref | 
|         }, | 
|         /** | 
|          * 获取节点信息 | 
|          */ | 
|         getSelectorQuery() { | 
|             Promise.all([ | 
|                 this.getDom('left'), | 
|                 this.getDom('right'), | 
|             ]).then((data) => { | 
|                 let show = 'none' | 
|                 if (this.autoClose) { | 
|                     show = 'none' | 
|                 } else { | 
|                     show = this.show | 
|                 } | 
|   | 
|                 if (show === 'none') { | 
|                     // this.close() | 
|                 } else { | 
|                     this.open(show) | 
|                 } | 
|   | 
|             }) | 
|   | 
|         }, | 
|         getDom(str) { | 
|             return new Promise((resolve, reject) => { | 
|                 dom.getComponentRect(this.$refs[`selector-${str}-button--hock`], (data) => { | 
|                     if (data) { | 
|                         this.button[str] = data.size | 
|                         resolve(data) | 
|                     } else { | 
|                         reject() | 
|                     } | 
|                 }) | 
|             }) | 
|         } | 
|     } | 
| } | 
|   | 
| // #endif | 
|   | 
| export default bindIngXMixins |