Commit 18acb150 authored by leon's avatar leon

feat: popup data add swipe

parent 09cd0288
...@@ -94,7 +94,8 @@ export default { ...@@ -94,7 +94,8 @@ export default {
} else if (popup) { } else if (popup) {
uni.$emit('showBarDetail', { uni.$emit('showBarDetail', {
popupShow: true, popupShow: true,
popupData: data[event.dataIndex], popupData: data,
currentIndex: event.dataIndex,
customRender customRender
}) })
} else { } else {
......
<template> <template>
<u-modal <u-modal class="model-data" v-model="popupShow" :closeOnClickOverlay="true" title="明细" @close="close"
class="model-data" @confirm="close">
v-model="popupShow" <view class="slot-content" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd"
:closeOnClickOverlay="true" :animation="animationData">
title="明细" <view v-for="(val, key) in popupObject" class="data-view">
@close="close"
@confirm="close"
>
<view class="slot-content">
<view v-for="(val, key) in popupData" class="data-view">
<view class="data-key ellipsis">{{ key }}</view> <view class="data-key ellipsis">{{ key }}</view>
<template v-if="customRender[key] === 'picture'"> <template v-if="customRender[key] === 'picture'">
<u-image <u-image :height="100" mode="aspectFit" :src="val" crossOrigin="anonymous" style="width: 100%"
:height="100" @click="seeImage(key)"></u-image>
mode="aspectFit"
:src="val"
crossOrigin="anonymous"
style="width: 100%"
@click="seeImage(val)"
></u-image>
</template> </template>
<view v-else class="data-val ellipsis">{{ val }}</view> <view v-else class="data-val ellipsis">{{ val }}</view>
</view> </view>
...@@ -27,15 +16,28 @@ ...@@ -27,15 +16,28 @@
</template> </template>
<script> <script>
export default { export default {
name: 'ModelData', name: 'ModelData',
data() { data() {
return {} return {
// popupObject: {},
startX: 0, //滑动开始x轴位置
startY: 0, //滑动开始y轴位置
moveX: 0, //滑动的x轴距离
moveY: 0, //滑动的y轴距离
like_state: 0, //-1:左滑,0:没滑动,1:右滑
animationData: {},
index: 0,
}
}, },
props: { props: {
popupData: { popupData: {
type: Object, type: Array,
default: () => {} default: () => []
},
currentIndex: {
tyep: Number,
default: 0
}, },
popupShow: { popupShow: {
type: Boolean, type: Boolean,
...@@ -46,43 +48,131 @@ export default { ...@@ -46,43 +48,131 @@ export default {
default: () => {} default: () => {}
} }
}, },
created() {
this.animation = uni.createAnimation({
timingFunction: 'ease',
duration: 120
})
},
computed: {
popupObject: {
get() {
this.index = this.currentIndex
return this.popupData[this.currentIndex]
},
set(val) {
return val
}
}
},
methods: { methods: {
close() { close() {
uni.$emit('showBarDetail', { uni.$emit('showBarDetail', {
popupShow: false, popupShow: false,
popupData: {} popupData: []
}) })
}, },
seeImage(url) { seeImage(key) {
var images = []
this.popupData.forEach(item => {
images.push(item[key])
})
uni.previewImage({ uni.previewImage({
current: 0, current: this.index,
urls: [url] urls: images
}) })
},
touchStart(event) {
this.startX = event.touches[0].pageX;
this.startY = event.touches[0].pageY;
},
touchMove(event) {
var currentX = event.touches[0].pageX;
var currentY = event.touches[0].pageY;
var moveX = currentX - this.startX;
var moveY = currentY - this.startY;
var state = 0; //-1:左滑,0:没滑动,1:右滑
// //左右方向滑动
if (Math.abs(moveX) > Math.abs(moveY)) {
if (moveX < -10) {
state = 1;
} else if (moveX > 10) {
state = -1;
}
}
this.like_state = state;
this.moveX = moveX;
this.moveY = moveY;
},
touchEnd(event) {
if (Math.abs(this.moveX) > 60 && this.like_state != -100) {
var state = this.like_state
this.like_state = -100 //设置这个数是为了避免滑动之后点击不走touchMove而产生的不正常滑动
//这里放需要进行的业务逻辑
if (state === 1 && this.index < this.popupData.length - 1) {
this.animation.translateX('-100%').step()
.opacity(0).step({
duration: 10
})
.translateX('100%').step({
duration: 10
})
.translateX(0).opacity(1).step()
this.animationData = this.animation.export()
// 为避免uniapp动画只有第一次生效,必须延迟删除动画实例数据
setTimeout(() => {
this.animationData = {}
}, 250)
this.index += 1
}
if (state === -1 && this.index > 0) {
this.animation.translateX('100%').step()
.opacity(0).step({
duration: 10
})
.translateX('-100%').step({
duration: 10
})
.translateX(0).opacity(1).step()
this.animationData = this.animation.export()
// 为避免uniapp动画只有第一次生效,必须延迟删除动画实例数据
setTimeout(() => {
this.animationData = {}
}, 250)
this.index -= 1
}
this.$set(this.popupObject, '', this.popupData[this.index])
}
}
} }
} }
}
</script> </script>
<style scoped> <style scoped>
.model-data { .model-data {
position: relative; position: relative;
z-index: 9999999; z-index: 9999999;
} }
.slot-content {
.slot-content {
margin: 10px; margin: 10px;
font-size: 12px; font-size: 12px;
border: 1px solid #eee; border: 1px solid #eee;
border-radius: 5px; border-radius: 5px;
} }
.data-view {
.data-view {
display: flex; display: flex;
align-self: center; align-self: center;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
padding: 5px; padding: 5px;
} }
.data-key {
.data-key {
min-width: 28%; min-width: 28%;
margin-right: 10px; margin-right: 10px;
border-right: 1px solid #eee; border-right: 1px solid #eee;
} }
</style> </style>
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
style="position: relative;z-index: 99999;" style="position: relative;z-index: 99999;"
:popupShow="popupShow" :popupShow="popupShow"
:popupData="popupData" :popupData="popupData"
:currentIndex="currentIndex"
:customRender="customRender" :customRender="customRender"
></ModelData> ></ModelData>
</view> </view>
...@@ -80,7 +81,8 @@ ...@@ -80,7 +81,8 @@
horizontalBarHeight: 0, horizontalBarHeight: 0,
popupShow: false, popupShow: false,
popupData: {}, popupData: {},
customRender: {} customRender: {},
currentIndex: 0
} }
}, },
computed: { computed: {
...@@ -156,9 +158,10 @@ ...@@ -156,9 +158,10 @@
that.horizontalBarHeight = height that.horizontalBarHeight = height
}) })
uni.$on('showBarDetail', data => { uni.$on('showBarDetail', data => {
const { popupShow, popupData, customRender } = data const { popupShow, popupData, customRender, currentIndex } = data
that.popupShow = popupShow that.popupShow = popupShow
that.popupData = popupData that.popupData = popupData
that.currentIndex = currentIndex
that.customRender = customRender that.customRender = customRender
}) })
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment