mall-app-t/components/wanghexu-timeslot/wanghexu-timeslot.vue

290 lines
6.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<view v-if="isShow" class="time_mask" :class="{'uni-timer-mask-show':timeMaskShow}" @tap="close"></view>
<view v-if="isShow" class="yx_time_slot" :class="{'fadelogIn1':timeMaskShow}">
<view class="time_top_box">
<view class="time_close" @click="close">取消</view>
<view class="time_text">{{title}}</view>
<view class="time_comfirm" @click="confirm">确认</view>
</view>
<view class="typelist">
<view class="typeobj" :class="{'typeobj_hover':typeIndex==index}" v-for="(item,index) in typeList" :key="index" @click="handleType(index)">
<view class="text">{{item}}</view>
<view class="line"></view>
</view>
</view>
<!-- 时间选择 -->
<view class="yx_timer_sel">
<swiper class="sel_swiper" :current="typeIndex" @change="swiperChange">
<swiper-item>
<view>
<picker-view :value="startvalue" :indicator-style="indicatorStyle" @change="bindstartChange" class="sel_swiper-item">
<picker-view-column>
<view class="item" v-for="(item,index) in timeHour" :key="index">{{item}}时</view>
</picker-view-column>
<picker-view-column>
<view class="item" v-for="(item,index) in timeMin" :key="index">{{item}}分</view>
</picker-view-column>
</picker-view>
</view>
</swiper-item>
<swiper-item>
<view>
<picker-view :value="endvalue" :indicator-style="indicatorStyle" @change="bindendChange" class="sel_swiper-item">
<picker-view-column>
<view class="item" v-for="(item,index) in timeHour" :key="index">{{item}}时</view>
</picker-view-column>
<picker-view-column>
<view class="item" v-for="(item,index) in timeMin" :key="index">{{item}}</view>
</picker-view-column>
</picker-view>
</view>
</swiper-item>
</swiper>
</view>
</view>
</view>
</template>
<script>
export default {
name:"time_slot",
props: {
title: {
type: String,
default: () => {
return "选择时间段";
}
},
},
data() {
return {
timeMaskShow:false,//遮罩
isShow:false,//显示
typeList:["开始时间","结束时间"],
typeIndex:0,//下标
startvalue:[14,0],//默认下标14时 00分
endvalue:[15,0],//默认下标15时 00分
indicatorStyle: 'height: 50px;',
// timeList:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],
timeHour:[],
timeMin:[],//分钟可选项
};
},
mounted() {
//获取时分
let timeHour = []
let timeMin = []
for (let i = 0; i < 24; i++) {
timeHour.push(this.formatNumber(i))
}
for (let i = 0; i < 60; i++) {
timeMin.push(this.formatNumber(i))
}
this.timeHour = timeHour
this.timeMin = timeMin
},
methods: {
swiperChange(event) {
this.typeIndex = event.detail.current
},
//看看是不是有两位数
formatNumber(n) {
n = n.toString()
return n[1] ? n : '0' + n
},
//开始选择
bindstartChange(e){
console.log(e)
this.startvalue = e.detail.value
},
//结束选择
bindendChange(e){
console.log(e)
this.endvalue = e.detail.value
},
/**
* 关闭弹窗
*/
close() {
this.timeMaskShow = false
this.$nextTick(() => {
setTimeout(() => {
this.isShow = false
this.$emit('close')
}, 300)
})
},
/**
* 确认按钮
*/
confirm() {
if(this.typeIndex==0){
this.endvalue = [this.startvalue[0]+1,0]
this.typeIndex = 1
}else{
if(this.startvalue[0]<this.endvalue[0] || (this.startvalue[0]==this.endvalue[0]&&this.startvalue[1]<this.endvalue[1])){
var obj = {
start:{
hour:this.timeHour[this.startvalue[0]],
min:this.timeMin[this.startvalue[1]]
},
end:{
hour:this.timeHour[this.endvalue[0]],
min:this.timeMin[this.endvalue[1]]
}
}
this.$emit('confirm',obj)
this.close()
}else{
uni.showToast({
icon:"error",
title:"结束时间要大于开始时间"
})
}
}
},
/**
* 打开日历弹窗
*/
open() {
this.typeIndex = 0
this.isShow = true
this.$nextTick(() => {
setTimeout(() => {
this.timeMaskShow = true
}, 50)
})
},
//栏目选择
handleType(index){
if(index!=this.typeIndex){
if(index==1){
this.endvalue = [this.startvalue[0]+1,0]
}
this.typeIndex = index
}
}
}
};
</script>
<style lang="scss" scoped>
.time_mask {
position: fixed;
bottom: 0;
top: 0;
left: 0;
right: 0;
background-color: $uni-bg-color-mask;
transition-property: opacity;
transition-duration: 0.3s;
opacity: 0;
/* #ifndef APP-NVUE */
z-index: 99;
/* #endif */
}
.yx_time_slot{
background-color: #FFFFFF;
width: 100%;
height: 750rpx;
position: fixed;
bottom: calc(var(--window-bottom));
left: 0;
right: 0;
z-index: 99;
transition-property: transform;
transition-duration: 0.3s;
transform: translateY(460px);
border-top-left-radius: 20px;
border-top-right-radius: 20px;
.time_top_box{
width: 100%;
height: 80rpx;
display: flex;
align-items: center;
justify-content: space-between;
.time_close,.time_comfirm{
width: 100rpx;
color: #6666;
font-size: 28rpx;
font-weight: 400;
text-align: center;
}
.time_comfirm{
color: #ff3000;
}
.time_text{
flex: 1;
font-size: 30rpx;
font-weight: 800;
text-align: center;
}
}
}
.uni-timer-mask-show{
opacity: 1;
}
/* 从下往上弹窗动画 */
.fadelogIn1 {
// -webkit-animation: fadelogIn 0.5s;
// animation: fadelogIn 0.5s;
transform: translateY(0);
}
.typelist{
width: 100%;
height: 70rpx;
display: flex;
align-items: center;
.typeobj{
width: 158rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.text{
height: 65rpx;
line-height: 65rpx;
font-size: 28rpx;
color: #333333;
}
.line{
width: 1rpx;
height: 5rpx;
}
}
.typeobj_hover{
.text{
font-weight: 600;
}
.line{
width: 88rpx;
transition: width .5s;
background-color: #4360F7;
}
}
}
.yx_timer_sel{
width: 100%;
margin-top: 38rpx;
.sel_swiper{
// width: 80%;
// margin: 0 auto;
height: 500rpx;
}
.sel_swiper-item{
height: 500rpx;
.item {
height: 50px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
}
}
</style>