271 lines
7.9 KiB
Vue
271 lines
7.9 KiB
Vue
<template>
|
||
<view class="uni-swipe">
|
||
<!-- 在微信小程序 app vue端 h5 使用wxs 实现-->
|
||
<!-- #ifdef APP-VUE || MP-WEIXIN || H5 -->
|
||
<view class="uni-swipe_content">
|
||
<view :data-disabled="disabled" :data-position="pos" :change:prop="swipe.sizeReady" :prop="pos" class="uni-swipe_move-box selector-query-hock move-hock"
|
||
@touchstart="swipe.touchstart" @touchmove="swipe.touchmove" @touchend="swipe.touchend" @change="change">
|
||
<view class="uni-swipe_box">
|
||
<slot />
|
||
</view>
|
||
<view ref="selector-button-hock" class="uni-swipe_button-group selector-query-hock move-hock">
|
||
<!-- 使用 touchend 解决 ios 13 不触发按钮事件的问题-->
|
||
<view v-for="(item,index) in options" :data-button="btn" :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" @touchend="onClick(index,item)"><text class="uni-swipe_button-text" :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text></view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!-- #endif -->
|
||
|
||
<!-- app nvue端 使用 bindingx -->
|
||
<!-- #ifdef APP-NVUE -->
|
||
<view ref="selector-box-hock" class="uni-swipe_content" @horizontalpan="touchstart" @touchend="touchend">
|
||
<view ref="selector-button-hock" class="uni-swipe_button-group selector-query-hock move-hock" :style="{width:right+'px'}">
|
||
<view ref="button-hock" v-for="(item,index) in options" :key="index" :style="{
|
||
backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',left: right+'px'}"
|
||
class="uni-swipe_button " @click.stop="onClick(index,item)"><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>
|
||
</view>
|
||
<view ref='selector-content-hock' class="uni-swipe_move-box selector-query-hock">
|
||
<view class="uni-swipe_box">
|
||
<slot />
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!-- #endif -->
|
||
|
||
<!-- 在非 app 端、非微信小程序、支付宝小程序、h5端使用 js -->
|
||
<!-- #ifndef APP-PLUS || MP-WEIXIN || MP-ALIPAY || H5 -->
|
||
<view class="uni-swipe_content">
|
||
<view ref="selector-button-hock" class="uni-swipe_button-group selector-query-hock move-hock">
|
||
<view v-for="(item,index) in options" :data-button="btn" :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" @click.stop="onClick(index,item)"><text class="uni-swipe_button-text" :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text></view>
|
||
</view>
|
||
<view ref='selector-content-hock' class="selector-query-hock" @touchstart="touchstart" @touchmove="touchmove"
|
||
@touchend="touchend" :class="{'ani':uniShow}" :style="{transform:moveLeft}">
|
||
<view class="uni-swipe_move-box" >
|
||
<view class="uni-swipe_box">
|
||
<slot />
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!-- #endif -->
|
||
<!-- #ifdef MP-ALIPAY -->
|
||
<view class="uni-swipe-box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend">
|
||
<view class="viewWidth-hook">
|
||
<movable-area v-if="viewWidth !== 0" class="movable-area" :style="{width:(viewWidth-buttonWidth)+'px'}">
|
||
<movable-view class="movable-view" direction="horizontal" :animation="!transition" :style="{width:viewWidth+'px'}"
|
||
:class="[transition?'transition':'']" :x="x" :disabled="disabledView" @change="onChange">
|
||
<view class="movable-view-box">
|
||
<slot></slot>
|
||
</view>
|
||
</movable-view>
|
||
</movable-area>
|
||
</view>
|
||
<view ref="selector-button-hock" class="uni-swipe_button-group viewWidth-hook">
|
||
<view v-for="(item,index) in options" :data-button="btn" :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" @click.stop="onClick(index,item)"><text class="uni-swipe_button-text" :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text></view>
|
||
</view>
|
||
</view>
|
||
<!-- #endif -->
|
||
</view>
|
||
</template>
|
||
<script src="./index.wxs" module="swipe" lang="wxs"></script>
|
||
<script>
|
||
// #ifdef APP-VUE|| MP-WEIXIN || H5
|
||
import mpwxs from './mpwxs'
|
||
// #endif
|
||
|
||
// #ifdef APP-NVUE
|
||
import bindingx from './bindingx.js'
|
||
// #endif
|
||
|
||
// #ifndef APP-PLUS|| MP-WEIXIN || MP-ALIPAY || H5
|
||
import mixins from './mpother'
|
||
// #endif
|
||
|
||
// #ifdef MP-ALIPAY
|
||
import mpalipay from './mpalipay'
|
||
// #endif
|
||
|
||
/**
|
||
* SwipeActionItem 滑动操作子组件
|
||
* @description 通过滑动触发选项的容器
|
||
* @tutorial https://ext.dcloud.net.cn/plugin?id=181
|
||
* @property {Boolean} show = [true|false] 开启关闭组件,auto-close = false 时生效
|
||
* @property {Boolean} disabled = [true|false] 是否禁止滑动
|
||
* @property {Boolean} autoClose = [true|false] 其他组件开启的时候,当前组件是否自动关闭
|
||
* @property {Array} options 组件选项内容及样式
|
||
* @event {Function} click 点击选项按钮时触发事件,e = {content,index} ,content(点击内容)、index(下标)
|
||
* @event {Function} change 组件打开或关闭时触发,true:开启状态;false:关闭状态
|
||
*/
|
||
|
||
export default {
|
||
// #ifdef APP-VUE|| MP-WEIXIN||H5
|
||
mixins: [mpwxs],
|
||
// #endif
|
||
|
||
// #ifdef APP-NVUE
|
||
mixins: [bindingx],
|
||
// #endif
|
||
|
||
// #ifndef APP-PLUS|| MP-WEIXIN || MP-ALIPAY || H5
|
||
mixins: [mixins],
|
||
// #endif
|
||
|
||
// #ifdef MP-ALIPAY
|
||
mixins: [mpalipay],
|
||
// #endif
|
||
|
||
props: {
|
||
/**
|
||
* 按钮内容
|
||
*/
|
||
options: {
|
||
type: Array,
|
||
default () {
|
||
return []
|
||
}
|
||
},
|
||
/**
|
||
* 禁用
|
||
*/
|
||
disabled: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
/**
|
||
* 变量控制开关
|
||
*/
|
||
show: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
/**
|
||
* 是否自动关闭
|
||
*/
|
||
autoClose: {
|
||
type: Boolean,
|
||
default: true
|
||
}
|
||
},
|
||
inject: ['swipeaction']
|
||
|
||
|
||
}
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.uni-swipe {
|
||
overflow: hidden;
|
||
}
|
||
|
||
.uni-swipe-box {
|
||
position: relative;
|
||
width: 100%;
|
||
}
|
||
|
||
.uni-swipe_content {
|
||
flex: 1;
|
||
position: relative;
|
||
}
|
||
|
||
.uni-swipe_move-box {
|
||
/* #ifndef APP-NVUE */
|
||
display: flex;
|
||
/* #endif */
|
||
position: relative;
|
||
flex-direction: row;
|
||
}
|
||
|
||
.uni-swipe_box {
|
||
/* #ifndef APP-NVUE */
|
||
display: flex;
|
||
flex-direction: row;
|
||
width: 100%;
|
||
flex-shrink: 0;
|
||
/* #endif */
|
||
/* #ifdef APP-NVUE */
|
||
flex: 1;
|
||
/* #endif */
|
||
font-size: 14px;
|
||
background-color: #fff;
|
||
}
|
||
|
||
.uni-swipe_button-group {
|
||
/* #ifndef APP-VUE|| MP-WEIXIN||H5 */
|
||
position: absolute;
|
||
top: 0;
|
||
right: 0;
|
||
bottom: 0;
|
||
z-index: 0;
|
||
/* #endif */
|
||
/* #ifndef APP-NVUE */
|
||
display: flex;
|
||
flex-shrink: 0;
|
||
/* #endif */
|
||
flex-direction: row;
|
||
}
|
||
|
||
.uni-swipe_button {
|
||
/* #ifdef APP-NVUE */
|
||
position: absolute;
|
||
left: 0;
|
||
top: 0;
|
||
bottom: 0;
|
||
/* #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: 300px;
|
||
height: 100%;
|
||
height: 45px;
|
||
}
|
||
|
||
.movable-view {
|
||
position: relative;
|
||
width: 160%;
|
||
height: 45px;
|
||
z-index: 2;
|
||
}
|
||
.transition {
|
||
transition: all 0.3s;
|
||
}
|
||
|
||
.movable-view-box {
|
||
width: 100%;
|
||
height: 100%;
|
||
background-color: #fff;
|
||
}
|
||
/* #endif */
|
||
</style>
|