<template> 
 | 
    <!-- 在微信小程序 app vue端 h5 使用wxs 实现--> 
 | 
    <!-- #ifdef APP-VUE || MP-WEIXIN || H5 --> 
 | 
    <view class="uni-swipe"> 
 | 
        <!--  #ifdef MP-WEIXIN || VUE3 --> 
 | 
        <view class="uni-swipe_box" :change:prop="wxsswipe.showWatch" :prop="is_show" :data-threshold="threshold" 
 | 
            :data-disabled="disabled" @touchstart="wxsswipe.touchstart" @touchmove="wxsswipe.touchmove" 
 | 
            @touchend="wxsswipe.touchend"> 
 | 
            <!-- #endif --> 
 | 
            <!--  #ifndef MP-WEIXIN || VUE3 --> 
 | 
            <view class="uni-swipe_box" :change:prop="renderswipe.showWatch" :prop="is_show" :data-threshold="threshold" 
 | 
                :data-disabled="disabled+''" @touchstart="renderswipe.touchstart" @touchmove="renderswipe.touchmove" 
 | 
                @touchend="renderswipe.touchend"> 
 | 
                <!-- #endif --> 
 | 
                <!-- 在微信小程序 app vue端 h5 使用wxs 实现--> 
 | 
                <view class="uni-swipe_button-group button-group--left"> 
 | 
                    <slot name="left"> 
 | 
                        <view v-for="(item,index) in leftOptions" :key="index" :style="{ 
 | 
                      backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' 
 | 
                    }" class="uni-swipe_button button-hock" @touchstart="appTouchStart" 
 | 
                            @touchend="appTouchEnd($event,index,item,'left')" 
 | 
                            @click.stop="onClickForPC(index,item,'left')"> 
 | 
                            <text class="uni-swipe_button-text" 
 | 
                                :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> 
 | 
                        </view> 
 | 
                    </slot> 
 | 
                </view> 
 | 
                <view class="uni-swipe_text--center"> 
 | 
                    <slot></slot> 
 | 
                </view> 
 | 
                <view class="uni-swipe_button-group button-group--right"> 
 | 
                    <slot name="right"> 
 | 
                        <view v-for="(item,index) in rightOptions" :key="index" :style="{ 
 | 
                      backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' 
 | 
                    }" class="uni-swipe_button button-hock" @touchstart="appTouchStart" 
 | 
                            @touchend="appTouchEnd($event,index,item,'right')" 
 | 
                            @click.stop="onClickForPC(index,item,'right')"><text class="uni-swipe_button-text" 
 | 
                                :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> 
 | 
                        </view> 
 | 
                    </slot> 
 | 
                </view> 
 | 
            </view> 
 | 
        </view> 
 | 
        <!-- #endif --> 
 | 
        <!-- app nvue端 使用 bindingx --> 
 | 
        <!-- #ifdef APP-NVUE --> 
 | 
        <view ref="selector-box--hock" class="uni-swipe" @horizontalpan="touchstart" @touchend="touchend"> 
 | 
            <view ref='selector-left-button--hock' class="uni-swipe_button-group button-group--left"> 
 | 
                <slot name="left"> 
 | 
                    <view v-for="(item,index) in leftOptions" :key="index" :style="{ 
 | 
                  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' 
 | 
                }" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'left')"><text 
 | 
                            class="uni-swipe_button-text" 
 | 
                            :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF', fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> 
 | 
                    </view> 
 | 
                </slot> 
 | 
            </view> 
 | 
            <view ref='selector-right-button--hock' class="uni-swipe_button-group button-group--right"> 
 | 
                <slot name="right"> 
 | 
                    <view v-for="(item,index) in rightOptions" :key="index" :style="{ 
 | 
                  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD' 
 | 
                }" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'right')"><text 
 | 
                            class="uni-swipe_button-text" 
 | 
                            :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text> 
 | 
                    </view> 
 | 
                </slot> 
 | 
            </view> 
 | 
            <view ref='selector-content--hock' class="uni-swipe_box"> 
 | 
                <slot></slot> 
 | 
            </view> 
 | 
        </view> 
 | 
        <!-- #endif --> 
 | 
        <!-- 其他平台使用 js ,长列表性能可能会有影响--> 
 | 
        <!-- #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ --> 
 | 
        <view class="uni-swipe"> 
 | 
            <view class="uni-swipe_box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend" 
 | 
                :style="{transform:moveLeft}" :class="{ani:ani}"> 
 | 
                <view class="uni-swipe_button-group button-group--left" :class="[elClass]"> 
 | 
                    <slot name="left"> 
 | 
                        <view v-for="(item,index) in leftOptions" :key="index" :style="{ 
 | 
                      backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD', 
 | 
                      fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px' 
 | 
                    }" class="uni-swipe_button button-hock" @touchstart="appTouchStart" 
 | 
                            @touchend="appTouchEnd($event,index,item,'left')"><text class="uni-swipe_button-text" 
 | 
                                :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text> 
 | 
                        </view> 
 | 
                    </slot> 
 | 
                </view> 
 | 
                <slot></slot> 
 | 
                <view class="uni-swipe_button-group button-group--right" :class="[elClass]"> 
 | 
                    <slot name="right"> 
 | 
                        <view v-for="(item,index) in rightOptions" :key="index" :style="{ 
 | 
                      backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD', 
 | 
                      fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px' 
 | 
                    }" @touchstart="appTouchStart" @touchend="appTouchEnd($event,index,item,'right')" 
 | 
                            class="uni-swipe_button button-hock"><text class="uni-swipe_button-text" 
 | 
                                :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text> 
 | 
                        </view> 
 | 
                    </slot> 
 | 
                </view> 
 | 
            </view> 
 | 
        </view> 
 | 
        <!-- #endif --> 
 | 
  
 | 
</template> 
 | 
<script src="./wx.wxs" module="wxsswipe" lang="wxs"></script> 
 | 
  
 | 
<script module="renderswipe" lang="renderjs"> 
 | 
    import render from './render.js' 
 | 
    export default { 
 | 
        mounted(e, ins, owner) { 
 | 
            this.state = {} 
 | 
        }, 
 | 
        methods: { 
 | 
            showWatch(newVal, oldVal, ownerInstance, instance) { 
 | 
                render.showWatch(newVal, oldVal, ownerInstance, instance, this) 
 | 
            }, 
 | 
            touchstart(e, ownerInstance) { 
 | 
                render.touchstart(e, ownerInstance, this) 
 | 
            }, 
 | 
            touchmove(e, ownerInstance) { 
 | 
                render.touchmove(e, ownerInstance, this) 
 | 
            }, 
 | 
            touchend(e, ownerInstance) { 
 | 
                render.touchend(e, ownerInstance, this) 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
</script> 
 | 
<script> 
 | 
    import mpwxs from './mpwxs' 
 | 
    import bindingx from './bindingx.js' 
 | 
    import mpother from './mpother' 
 | 
  
 | 
    /** 
 | 
     * SwipeActionItem 滑动操作子组件 
 | 
     * @description 通过滑动触发选项的容器 
 | 
     * @tutorial https://ext.dcloud.net.cn/plugin?id=181 
 | 
     * @property {Boolean} show = [left|right|none]     开启关闭组件,auto-close = false 时生效 
 | 
     * @property {Boolean} disabled = [true|false]         是否禁止滑动 
 | 
     * @property {Boolean} autoClose = [true|false]     滑动打开当前组件,是否关闭其他组件 
 | 
     * @property {Number}  threshold                     滑动缺省值 
 | 
     * @property {Array} leftOptions                     左侧选项内容及样式 
 | 
     * @property {Array} rgihtOptions                     右侧选项内容及样式 
 | 
     * @event {Function} click                             点击选项按钮时触发事件,e = {content,index} ,content(点击内容)、index(下标) 
 | 
     * @event {Function} change                         组件打开或关闭时触发,left\right\none 
 | 
     */ 
 | 
  
 | 
    export default { 
 | 
        mixins: [mpwxs, bindingx, mpother], 
 | 
        emits: ['click', 'change'], 
 | 
        props: { 
 | 
            // 控制开关 
 | 
            show: { 
 | 
                type: String, 
 | 
                default: 'none' 
 | 
            }, 
 | 
  
 | 
            // 禁用 
 | 
            disabled: { 
 | 
                type: Boolean, 
 | 
                default: false 
 | 
            }, 
 | 
  
 | 
            // 是否自动关闭 
 | 
            autoClose: { 
 | 
                type: Boolean, 
 | 
                default: true 
 | 
            }, 
 | 
  
 | 
            // 滑动缺省距离 
 | 
            threshold: { 
 | 
                type: Number, 
 | 
                default: 20 
 | 
            }, 
 | 
  
 | 
            // 左侧按钮内容 
 | 
            leftOptions: { 
 | 
                type: Array, 
 | 
                default () { 
 | 
                    return [] 
 | 
                } 
 | 
            }, 
 | 
  
 | 
            // 右侧按钮内容 
 | 
            rightOptions: { 
 | 
                type: Array, 
 | 
                default () { 
 | 
                    return [] 
 | 
                } 
 | 
            } 
 | 
  
 | 
        }, 
 | 
        // #ifndef VUE3 
 | 
        // TODO vue2 
 | 
        destroyed() { 
 | 
            if (this.__isUnmounted) return 
 | 
            this.uninstall() 
 | 
        }, 
 | 
        // #endif 
 | 
        // #ifdef VUE3 
 | 
        // TODO vue3 
 | 
        unmounted() { 
 | 
            this.__isUnmounted = true 
 | 
            this.uninstall() 
 | 
        }, 
 | 
        // #endif 
 | 
  
 | 
        methods: { 
 | 
            uninstall() { 
 | 
                if (this.swipeaction) { 
 | 
                    this.swipeaction.children.forEach((item, index) => { 
 | 
                        if (item === this) { 
 | 
                            this.swipeaction.children.splice(index, 1) 
 | 
                        } 
 | 
                    }) 
 | 
                } 
 | 
            }, 
 | 
            /** 
 | 
             * 获取父元素实例 
 | 
             */ 
 | 
            getSwipeAction(name = 'uniSwipeAction') { 
 | 
                let parent = this.$parent; 
 | 
                let parentName = parent.$options.name; 
 | 
                while (parentName !== name) { 
 | 
                    parent = parent.$parent; 
 | 
                    if (!parent) return false; 
 | 
                    parentName = parent.$options.name; 
 | 
                } 
 | 
                return parent; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
</script> 
 | 
<style lang="scss"> 
 | 
    .uni-swipe { 
 | 
        position: relative; 
 | 
        /* #ifndef APP-NVUE */ 
 | 
        overflow: hidden; 
 | 
        /* #endif */ 
 | 
    } 
 | 
  
 | 
    .uni-swipe_box { 
 | 
        /* #ifndef APP-NVUE */ 
 | 
        display: flex; 
 | 
        flex-shrink: 0; 
 | 
        // touch-action: none; 
 | 
        /* #endif */ 
 | 
        position: relative; 
 | 
    } 
 | 
  
 | 
    .uni-swipe_content { 
 | 
        // border: 1px red solid; 
 | 
    } 
 | 
  
 | 
    .uni-swipe_text--center { 
 | 
        width: 100%; 
 | 
        /* #ifndef APP-NVUE */ 
 | 
        cursor: grab; 
 | 
        /* #endif */ 
 | 
    } 
 | 
  
 | 
    .uni-swipe_button-group { 
 | 
        /* #ifndef APP-NVUE */ 
 | 
        box-sizing: border-box; 
 | 
        display: flex; 
 | 
        /* #endif */ 
 | 
        flex-direction: row; 
 | 
        position: absolute; 
 | 
        top: 0; 
 | 
        bottom: 0; 
 | 
        /* #ifdef H5 */ 
 | 
        cursor: pointer; 
 | 
        /* #endif */ 
 | 
    } 
 | 
  
 | 
    .button-group--left { 
 | 
        left: 0; 
 | 
        transform: translateX(-100%) 
 | 
    } 
 | 
  
 | 
    .button-group--right { 
 | 
        right: 0; 
 | 
        transform: translateX(100%) 
 | 
    } 
 | 
  
 | 
    .uni-swipe_button { 
 | 
        /* #ifdef APP-NVUE */ 
 | 
        flex: 1; 
 | 
        /* #endif */ 
 | 
        /* #ifndef APP-NVUE */ 
 | 
        display: flex; 
 | 
        /* #endif */ 
 | 
        flex-direction: row; 
 | 
        justify-content: center; 
 | 
        align-items: center; 
 | 
        padding: 0 20px; 
 | 
    } 
 | 
  
 | 
    .uni-swipe_button-text { 
 | 
        /* #ifndef APP-NVUE */ 
 | 
        flex-shrink: 0; 
 | 
        /* #endif */ 
 | 
        font-size: 14px; 
 | 
    } 
 | 
  
 | 
    .ani { 
 | 
        transition-property: transform; 
 | 
        transition-duration: 0.3s; 
 | 
        transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1); 
 | 
    } 
 | 
  
 | 
    /* #ifdef MP-ALIPAY */ 
 | 
    .movable-area { 
 | 
        /* width: 100%; */ 
 | 
        height: 45px; 
 | 
    } 
 | 
  
 | 
    .movable-view { 
 | 
        display: flex; 
 | 
        /* justify-content: center; */ 
 | 
        position: relative; 
 | 
        flex: 1; 
 | 
        height: 45px; 
 | 
        z-index: 2; 
 | 
    } 
 | 
  
 | 
    .movable-view-button { 
 | 
        display: flex; 
 | 
        flex-shrink: 0; 
 | 
        flex-direction: row; 
 | 
        height: 100%; 
 | 
        background: #C0C0C0; 
 | 
    } 
 | 
  
 | 
    /* .transition { 
 | 
        transition: all 0.3s; 
 | 
    } */ 
 | 
  
 | 
    .movable-view-box { 
 | 
        flex-shrink: 0; 
 | 
        height: 100%; 
 | 
        background-color: #fff; 
 | 
    } 
 | 
  
 | 
    /* #endif */ 
 | 
</style> 
 |