let otherMixins = {} 
 | 
  
 | 
// #ifndef APP-PLUS|| MP-WEIXIN  ||  H5 
 | 
const MIN_DISTANCE = 10; 
 | 
otherMixins = { 
 | 
    data() { 
 | 
        // TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug 
 | 
        const elClass = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}` 
 | 
        return { 
 | 
            uniShow: false, 
 | 
            left: 0, 
 | 
            buttonShow: 'none', 
 | 
            ani: false, 
 | 
            moveLeft: '', 
 | 
            elClass 
 | 
        } 
 | 
    }, 
 | 
    watch: { 
 | 
        show(newVal) { 
 | 
            if (this.autoClose) return 
 | 
            this.openState(newVal) 
 | 
        }, 
 | 
        left() { 
 | 
            this.moveLeft = `translateX(${this.left}px)` 
 | 
        }, 
 | 
        buttonShow(newVal) { 
 | 
            if (this.autoClose) return 
 | 
            this.openState(newVal) 
 | 
        }, 
 | 
        leftOptions() { 
 | 
            this.init() 
 | 
        }, 
 | 
        rightOptions() { 
 | 
            this.init() 
 | 
        } 
 | 
    }, 
 | 
    mounted() { 
 | 
        this.swipeaction = this.getSwipeAction() 
 | 
        if (this.swipeaction.children !== undefined) { 
 | 
            this.swipeaction.children.push(this) 
 | 
        } 
 | 
        this.init() 
 | 
    }, 
 | 
    methods: { 
 | 
        init() { 
 | 
            clearTimeout(this.timer) 
 | 
            this.timer = setTimeout(() => { 
 | 
                this.getSelectorQuery() 
 | 
            }, 100) 
 | 
            // 移动距离 
 | 
            this.left = 0 
 | 
            this.x = 0 
 | 
        }, 
 | 
  
 | 
        closeSwipe(e) { 
 | 
            if (!this.autoClose) return 
 | 
            this.swipeaction.closeOther(this) 
 | 
        }, 
 | 
        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 
 | 
                }) 
 | 
            } 
 | 
        }, 
 | 
        touchstart(e) { 
 | 
            if (this.disabled) return 
 | 
            this.ani = false 
 | 
            this.x = this.left || 0 
 | 
            this.stopTouchStart(e) 
 | 
            this.autoClose && this.closeSwipe() 
 | 
        }, 
 | 
        touchmove(e) { 
 | 
            if (this.disabled) return 
 | 
            // 是否可以滑动页面 
 | 
            this.stopTouchMove(e); 
 | 
            if (this.direction !== 'horizontal') { 
 | 
                return; 
 | 
            } 
 | 
            this.move(this.x + this.deltaX) 
 | 
            return false 
 | 
        }, 
 | 
        touchend() { 
 | 
            if (this.disabled) return 
 | 
            this.moveDirection(this.left) 
 | 
        }, 
 | 
        /** 
 | 
         * 设置移动距离 
 | 
         * @param {Object} value 
 | 
         */ 
 | 
        move(value) { 
 | 
            value = value || 0 
 | 
            const leftWidth = this.leftWidth 
 | 
            const rightWidth = this.rightWidth 
 | 
            // 获取可滑动范围 
 | 
            this.left = this.range(value, -rightWidth, leftWidth); 
 | 
        }, 
 | 
  
 | 
        /** 
 | 
         * 获取范围 
 | 
         * @param {Object} num 
 | 
         * @param {Object} min 
 | 
         * @param {Object} max 
 | 
         */ 
 | 
        range(num, min, max) { 
 | 
            return Math.min(Math.max(num, min), max); 
 | 
        }, 
 | 
        /** 
 | 
         * 移动方向判断 
 | 
         * @param {Object} left 
 | 
         * @param {Object} value 
 | 
         */ 
 | 
        moveDirection(left) { 
 | 
            const threshold = this.threshold 
 | 
            const isopen = this.isopen || 'none' 
 | 
            const leftWidth = this.leftWidth 
 | 
            const rightWidth = this.rightWidth 
 | 
            if (this.deltaX === 0) { 
 | 
                this.openState('none') 
 | 
                return 
 | 
            } 
 | 
            if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 
 | 
                    0 && rightWidth + 
 | 
                    left < threshold)) { 
 | 
                // right 
 | 
                this.openState('right') 
 | 
            } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 
 | 
                    0 && 
 | 
                    leftWidth - left < threshold)) { 
 | 
                // left 
 | 
                this.openState('left') 
 | 
            } else { 
 | 
                // default 
 | 
                this.openState('none') 
 | 
            } 
 | 
        }, 
 | 
  
 | 
        /** 
 | 
         * 开启状态 
 | 
         * @param {Boolean} type 
 | 
         */ 
 | 
        openState(type) { 
 | 
            const leftWidth = this.leftWidth 
 | 
            const rightWidth = this.rightWidth 
 | 
            let left = '' 
 | 
            this.isopen = this.isopen ? this.isopen : 'none' 
 | 
            switch (type) { 
 | 
                case "left": 
 | 
                    left = leftWidth 
 | 
                    break 
 | 
                case "right": 
 | 
                    left = -rightWidth 
 | 
                    break 
 | 
                default: 
 | 
                    left = 0 
 | 
            } 
 | 
  
 | 
  
 | 
            if (this.isopen !== type) { 
 | 
                this.throttle = true 
 | 
                this.$emit('change', type) 
 | 
            } 
 | 
  
 | 
            this.isopen = type 
 | 
            // 添加动画类 
 | 
            this.ani = true 
 | 
            this.$nextTick(() => { 
 | 
                this.move(left) 
 | 
            }) 
 | 
            // 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的 
 | 
        }, 
 | 
        close() { 
 | 
            this.openState('none') 
 | 
        }, 
 | 
        getDirection(x, y) { 
 | 
            if (x > y && x > MIN_DISTANCE) { 
 | 
                return 'horizontal'; 
 | 
            } 
 | 
            if (y > x && y > MIN_DISTANCE) { 
 | 
                return 'vertical'; 
 | 
            } 
 | 
            return ''; 
 | 
        }, 
 | 
  
 | 
        /** 
 | 
         * 重置滑动状态 
 | 
         * @param {Object} event 
 | 
         */ 
 | 
        resetTouchStatus() { 
 | 
            this.direction = ''; 
 | 
            this.deltaX = 0; 
 | 
            this.deltaY = 0; 
 | 
            this.offsetX = 0; 
 | 
            this.offsetY = 0; 
 | 
        }, 
 | 
  
 | 
        /** 
 | 
         * 设置滑动开始位置 
 | 
         * @param {Object} event 
 | 
         */ 
 | 
        stopTouchStart(event) { 
 | 
            this.resetTouchStatus(); 
 | 
            const touch = event.touches[0]; 
 | 
            this.startX = touch.clientX; 
 | 
            this.startY = touch.clientY; 
 | 
        }, 
 | 
  
 | 
        /** 
 | 
         * 滑动中,是否禁止打开 
 | 
         * @param {Object} event 
 | 
         */ 
 | 
        stopTouchMove(event) { 
 | 
            const touch = event.touches[0]; 
 | 
            this.deltaX = touch.clientX - this.startX; 
 | 
            this.deltaY = touch.clientY - this.startY; 
 | 
            this.offsetX = Math.abs(this.deltaX); 
 | 
            this.offsetY = Math.abs(this.deltaY); 
 | 
            this.direction = this.direction || this.getDirection(this.offsetX, this.offsetY); 
 | 
        }, 
 | 
  
 | 
        getSelectorQuery() { 
 | 
            const views = uni.createSelectorQuery().in(this) 
 | 
            views 
 | 
                .selectAll('.' + this.elClass) 
 | 
                .boundingClientRect(data => { 
 | 
                    if (data.length === 0) return 
 | 
                    let show = 'none' 
 | 
                    if (this.autoClose) { 
 | 
                        show = 'none' 
 | 
                    } else { 
 | 
                        show = this.show 
 | 
                    } 
 | 
                    this.leftWidth = data[0].width || 0 
 | 
                    this.rightWidth = data[1].width || 0 
 | 
                    this.buttonShow = show 
 | 
                }) 
 | 
                .exec() 
 | 
        } 
 | 
    } 
 | 
} 
 | 
  
 | 
// #endif 
 | 
  
 | 
export default otherMixins 
 |