| New file | 
 |  |  | 
 |  |  | <template> | 
 |  |  |    <view class="u-swipe-action-item" ref="u-swipe-action-item"> | 
 |  |  |       <view class="u-swipe-action-item__right"> | 
 |  |  |          <slot name="button"> | 
 |  |  |             <view v-for="(item,index) in options" :key="index" class="u-swipe-action-item__right__button" | 
 |  |  |                :ref="`u-swipe-action-item__right__button-${index}`" :style="[{ | 
 |  |  |                   alignItems: item.style && item.style.borderRadius ? 'center' : 'stretch' | 
 |  |  |                }]" @tap="buttonClickHandler(item, index)"> | 
 |  |  |                <view class="u-swipe-action-item__right__button__wrapper" :style="[{ | 
 |  |  |                      backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD', | 
 |  |  |                      borderRadius: item.style && item.style.borderRadius ? item.style.borderRadius : '0', | 
 |  |  |                      padding: item.style && item.style.borderRadius ? '0' : '0 15px', | 
 |  |  |                   }, item.style]"> | 
 |  |  |                   <u-icon v-if="item.icon" :name="item.icon" | 
 |  |  |                      :color="item.style && item.style.color ? item.style.color : '#ffffff'" | 
 |  |  |                      :size="item.iconSize ? $u.addUnit(item.iconSize) : item.style && item.style.fontSize ? $u.getPx(item.style.fontSize) * 1.2 : 17" | 
 |  |  |                      :customStyle="{ | 
 |  |  |                         marginRight: item.text ? '2px' : 0 | 
 |  |  |                      }"></u-icon> | 
 |  |  |                   <text v-if="item.text" class="u-swipe-action-item__right__button__wrapper__text u-line-1" | 
 |  |  |                      :style="[{ | 
 |  |  |                         color: item.style && item.style.color ? item.style.color : '#ffffff', | 
 |  |  |                         fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px', | 
 |  |  |                         lineHeight: item.style && item.style.fontSize ? item.style.fontSize : '16px', | 
 |  |  |                      }]">{{ item.text }}</text> | 
 |  |  |                </view> | 
 |  |  |             </view> | 
 |  |  |          </slot> | 
 |  |  |       </view> | 
 |  |  |       <!-- #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ --> | 
 |  |  |       <view class="u-swipe-action-item__content" @touchstart="wxs.touchstart" @touchmove="wxs.touchmove" | 
 |  |  |          @touchend="wxs.touchend" :status="status" :change:status="wxs.statusChange" :size="size" | 
 |  |  |          :change:size="wxs.sizeChange"> | 
 |  |  |          <!-- #endif --> | 
 |  |  |          <!-- #ifdef APP-NVUE --> | 
 |  |  |          <view class="u-swipe-action-item__content" ref="u-swipe-action-item__content" @panstart="onTouchstart" | 
 |  |  |             @tap="clickHandler"> | 
 |  |  |             <!-- #endif --> | 
 |  |  |             <slot /> | 
 |  |  |          </view> | 
 |  |  |       </view> | 
 |  |  | </template> | 
 |  |  | <!-- #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ --> | 
 |  |  | <script src="./index.wxs" module="wxs" lang="wxs"></script> | 
 |  |  | <!-- #endif --> | 
 |  |  | <script> | 
 |  |  |    import touch from '../../libs/mixin/touch.js' | 
 |  |  |    import props from './props.js'; | 
 |  |  |    // #ifdef APP-NVUE | 
 |  |  |    import nvue from './nvue.js'; | 
 |  |  |    // #endif | 
 |  |  |    // #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ | 
 |  |  |    import wxs from './wxs.js'; | 
 |  |  |    // #endif | 
 |  |  |    /** | 
 |  |  |     * SwipeActionItem 滑动单元格子组件 | 
 |  |  |     * @description 该组件一般用于左滑唤出操作菜单的场景,用的最多的是左滑删除操作 | 
 |  |  |     * @tutorial https://www.uviewui.com/components/swipeAction.html | 
 |  |  |     * @property {Boolean}         show         控制打开或者关闭(默认 false ) | 
 |  |  |     * @property {String | Number}   index         标识符,如果是v-for,可用index索引 | 
 |  |  |     * @property {Boolean}         disabled      是否禁用(默认 false ) | 
 |  |  |     * @property {Boolean}         autoClose      是否自动关闭其他swipe按钮组(默认 true ) | 
 |  |  |     * @property {Number}         threshold      滑动距离阈值,只有大于此值,才被认为是要打开菜单(默认 30 ) | 
 |  |  |     * @property {Array}         options         右侧按钮内容 | 
 |  |  |     * @property {String | Number}   duration      动画过渡时间,单位ms(默认 350 ) | 
 |  |  |     * @event {Function(index)}   open   组件打开时触发 | 
 |  |  |     * @event {Function(index)}   close   组件关闭时触发 | 
 |  |  |     * @example   <u-swipe-action><u-swipe-action-item :options="options1" ></u-swipe-action-item></u-swipe-action> | 
 |  |  |     */ | 
 |  |  |    export default { | 
 |  |  |       name: 'u-swipe-action-item', | 
 |  |  |       mixins: [uni.$u.mpMixin, uni.$u.mixin, props, touch], | 
 |  |  |       // #ifdef APP-NVUE | 
 |  |  |       mixins: [uni.$u.mpMixin, uni.$u.mixin, props, nvue, touch], | 
 |  |  |       // #endif | 
 |  |  |       // #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ | 
 |  |  |       mixins: [uni.$u.mpMixin, uni.$u.mixin, props, touch, wxs], | 
 |  |  |       // #endif | 
 |  |  |       data() { | 
 |  |  |          return { | 
 |  |  |             // 按钮的尺寸信息 | 
 |  |  |             size: {}, | 
 |  |  |             // 父组件u-swipe-action的参数 | 
 |  |  |             parentData: { | 
 |  |  |                autoClose: true, | 
 |  |  |             }, | 
 |  |  |             // 当前状态,open-打开,close-关闭 | 
 |  |  |             status: 'close', | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |       watch: { | 
 |  |  |          // 由于wxs无法直接读取外部的值,需要在外部值变化时,重新执行赋值逻辑 | 
 |  |  |          wxsInit(newValue, oldValue) { | 
 |  |  |             this.queryRect() | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |       computed: { | 
 |  |  |          wxsInit() { | 
 |  |  |             return [this.disabled, this.autoClose, this.threshold, this.options, this.duration] | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |       mounted() { | 
 |  |  |          this.init() | 
 |  |  |       }, | 
 |  |  |       methods: { | 
 |  |  |          init() { | 
 |  |  |             // 初始化父组件数据 | 
 |  |  |             this.updateParentData() | 
 |  |  |             // #ifndef APP-NVUE | 
 |  |  |             uni.$u.sleep().then(() => { | 
 |  |  |                this.queryRect() | 
 |  |  |             }) | 
 |  |  |             // #endif | 
 |  |  |          }, | 
 |  |  |          updateParentData() { | 
 |  |  |             // 此方法在mixin中 | 
 |  |  |             this.getParentData('u-swipe-action') | 
 |  |  |          }, | 
 |  |  |          // #ifndef APP-NVUE | 
 |  |  |          // 查询节点 | 
 |  |  |          queryRect() { | 
 |  |  |             this.$uGetRect('.u-swipe-action-item__right__button', true).then(buttons => { | 
 |  |  |                this.size = { | 
 |  |  |                   buttons, | 
 |  |  |                   show: this.show, | 
 |  |  |                   disabled: this.disabled, | 
 |  |  |                   threshold: this.threshold, | 
 |  |  |                   duration: this.duration | 
 |  |  |                } | 
 |  |  |             }) | 
 |  |  |          }, | 
 |  |  |          // #endif | 
 |  |  |          // 按钮被点击 | 
 |  |  |          buttonClickHandler(item, index) { | 
 |  |  |             this.$emit('click', { | 
 |  |  |                index, | 
 |  |  |                name: this.name | 
 |  |  |             }) | 
 |  |  |          } | 
 |  |  |       }, | 
 |  |  |    } | 
 |  |  | </script> | 
 |  |  |  | 
 |  |  | <style lang="scss" scoped> | 
 |  |  |    @import "../../libs/css/components.scss"; | 
 |  |  |  | 
 |  |  |    .u-swipe-action-item { | 
 |  |  |       position: relative; | 
 |  |  |       overflow: hidden; | 
 |  |  |       /* #ifndef APP-NVUE || MP-WEIXIN */ | 
 |  |  |       touch-action: pan-y; | 
 |  |  |       /* #endif */ | 
 |  |  |  | 
 |  |  |       &__content { | 
 |  |  |          background-color: #FFFFFF; | 
 |  |  |          z-index: 10; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       &__right { | 
 |  |  |          position: absolute; | 
 |  |  |          top: 0; | 
 |  |  |          bottom: 0; | 
 |  |  |          right: 0; | 
 |  |  |          @include flex; | 
 |  |  |  | 
 |  |  |          &__button { | 
 |  |  |             @include flex; | 
 |  |  |             justify-content: center; | 
 |  |  |             overflow: hidden; | 
 |  |  |             align-items: center; | 
 |  |  |  | 
 |  |  |             &__wrapper { | 
 |  |  |                @include flex; | 
 |  |  |                align-items: center; | 
 |  |  |                justify-content: center; | 
 |  |  |                padding: 0 15px; | 
 |  |  |  | 
 |  |  |                &__text { | 
 |  |  |                   @include flex; | 
 |  |  |                   align-items: center; | 
 |  |  |                   color: #FFFFFF; | 
 |  |  |                   font-size: 15px; | 
 |  |  |                   text-align: center; | 
 |  |  |                   justify-content: center; | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  | </style> |