155 lines
4.4 KiB
Vue
155 lines
4.4 KiB
Vue
|
<template>
|
|||
|
<view>
|
|||
|
<u-popup v-model="inputValue" :zIndex="999999" mode="center">
|
|||
|
<view class="bg-white popup">
|
|||
|
<view class="title">{{title}}</view>
|
|||
|
<view class="content line-3" :style="{'height': height}">
|
|||
|
<slot></slot>
|
|||
|
</view>
|
|||
|
<view class="footer flex row-around">
|
|||
|
<button v-if="cancelShow" class="btn hollow flex row-center normal" @click="cancel">{{cancelText}}</button>
|
|||
|
<button :style="{'width': cancelShow==false?'100%':'220rpx'}" class="btn solid flex row-center normal" @click="confirm">{{confirmText}}</button>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</u-popup>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
props: {
|
|||
|
value: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
cancelShow: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
title: {
|
|||
|
type: String,
|
|||
|
default: '提示'
|
|||
|
},
|
|||
|
height: {
|
|||
|
type: String,
|
|||
|
default: '310rpx'
|
|||
|
},
|
|||
|
confirmText: {
|
|||
|
type: String,
|
|||
|
default: '确认'
|
|||
|
},
|
|||
|
cancelText: {
|
|||
|
type: String,
|
|||
|
default: '取消'
|
|||
|
},
|
|||
|
},
|
|||
|
|
|||
|
watch: {
|
|||
|
value(val1, val2) {
|
|||
|
// 只有value的改变是来自外部的时候,才去同步inputVal的值,否则会造成循环错误
|
|||
|
if (!this.changeFromInner) {
|
|||
|
if (this.inputValue == val1) return
|
|||
|
this.inputValue = val1;
|
|||
|
// 进行this.$nextTick延时
|
|||
|
this.$nextTick(function() {
|
|||
|
this.changeFromInner = false;
|
|||
|
})
|
|||
|
}
|
|||
|
},
|
|||
|
inputValue(val1, v2) {
|
|||
|
if(this.isFistVal) return
|
|||
|
this.changeFromInner = true;
|
|||
|
// 一定时间内,清除changeFromInner标记,否则内部值改变后
|
|||
|
// 外部通过程序修改value值,将会无效
|
|||
|
this.innerChangeTimer = setTimeout(() => {
|
|||
|
this.changeFromInner = false;
|
|||
|
}, 150);
|
|||
|
this.$emit('input', val1)
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
computed: {
|
|||
|
// 弹窗Popup显示状态
|
|||
|
show: {
|
|||
|
get: function() {
|
|||
|
return this.value
|
|||
|
},
|
|||
|
set: function(value) {
|
|||
|
this.$emit('input', value)
|
|||
|
},
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
data() {
|
|||
|
return {
|
|||
|
inputValue: false,
|
|||
|
changeFromInner: false, // 值发生变化,是来自内部还是外部
|
|||
|
isFistVal: true
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
created() {
|
|||
|
this.inputValue = this.value;
|
|||
|
this.$nextTick(function() {
|
|||
|
this.isFistVal = false
|
|||
|
})
|
|||
|
},
|
|||
|
|
|||
|
methods: {
|
|||
|
onTrigger() {
|
|||
|
},
|
|||
|
|
|||
|
cancel() {
|
|||
|
this.inputValue = false;
|
|||
|
this.$emit('cancel')
|
|||
|
},
|
|||
|
|
|||
|
confirm() {
|
|||
|
this.inputValue = false;
|
|||
|
this.$emit('confirm')
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
.popup {
|
|||
|
width: 600rpx;
|
|||
|
border-radius: 12rpx;
|
|||
|
|
|||
|
.title {
|
|||
|
padding: 30rpx 0;
|
|||
|
font-size: $-font-size-md;
|
|||
|
text-align: center;
|
|||
|
color: #101010;
|
|||
|
font-weight: 500;
|
|||
|
}
|
|||
|
|
|||
|
.content {
|
|||
|
width: 600rpx;
|
|||
|
word-wrap:break-word;
|
|||
|
padding: 0 40rpx;
|
|||
|
}
|
|||
|
|
|||
|
.footer {
|
|||
|
padding: 24rpx;
|
|||
|
.btn {
|
|||
|
width: 220rpx;
|
|||
|
height: 68rpx;
|
|||
|
border-radius: 8rpx;
|
|||
|
font-size: $-font-size-sm;
|
|||
|
}
|
|||
|
|
|||
|
.solid {
|
|||
|
color: $-color-white;
|
|||
|
background-color: #40AFFA;
|
|||
|
}
|
|||
|
|
|||
|
.hollow {
|
|||
|
color: $-color-lighter;
|
|||
|
border: 1px solid #DBDBDB;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|