You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
5.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<u-popup v-model="show" mode="center" border-radius="14" :mask-close-able="false">
<view class="difference-modal">
<view class="difference-modal__header">
<text class="difference-modal__title">信息差异提示</text>
</view>
<scroll-view
class="difference-modal__content"
scroll-y="true"
:style="{ height: contentHeight + 'px' }"
>
<text class="difference-modal__tip">您本次提交的信息与过往信息不同,是否更新本次信息?</text>
<view class="difference-modal__list">
<view
class="difference-modal__item"
v-for="(item, index) in differenceList"
:key="index"
>
<view class="difference-modal__item-header">
<text class="difference-modal__item-name">{{ item.name }}</text>
</view>
<view class="difference-modal__item-content">
<view class="difference-modal__value-row">
<text class="difference-modal__label">原信息:</text>
<view class="difference-modal__value difference-modal__value--old">{{ item.oldValue }}</view>
</view>
<view class="difference-modal__value-row">
<text class="difference-modal__label">新信息:</text>
<view class="difference-modal__value difference-modal__value--new">{{ item.newValue }}</view>
</view>
</view>
</view>
</view>
</scroll-view>
<view class="difference-modal__footer">
<view class="difference-modal__footer-row">
<u-button
type="default"
@click="handleChoice(false)"
:custom-style="{ flex: 1 }"
>
维持原信息
</u-button>
<u-button
type="primary"
@click="handleChoice(true)"
:custom-style="{ flex: 1 }"
>
按本次信息更新
</u-button>
</view>
<view class="difference-modal__footer-row difference-modal__footer-row--center">
<u-button
type="default"
@click="handleChoice('cancel')"
>
返回修改
</u-button>
</view>
</view>
</view>
</u-popup>
</template>
<script>
export default {
name: 'DifferenceModal',
props: {
show: {
type: Boolean,
default: false
},
differenceList: {
type: Array,
default: () => []
}
},
data() {
return {
contentHeight: 400 // 默认高度单位px
}
},
mounted() {
this.calculateHeight()
},
watch: {
show(newVal) {
if (newVal) {
this.$nextTick(() => {
this.calculateHeight()
})
}
}
},
methods: {
handleChoice(update) {
this.$emit('choice', update)
},
calculateHeight() {
// 使用系统信息计算合适的高度
// 弹框最大高度 80vh减去 header 和 footer 的高度
uni.getSystemInfo({
success: (res) => {
// 屏幕高度的 70%(减小了 10%
const maxHeight = res.windowHeight * 0.7
// header 大约 120rpxfooter 大约 200rpx转换为 px
const headerHeight = 120 * (res.windowWidth / 750)
const footerHeight = 200 * (res.windowWidth / 750)
// content 高度 = 总高度 - header - footer - 额外减少 50px
this.contentHeight = maxHeight - headerHeight - footerHeight - 50
}
})
}
}
}
</script>
<style scoped lang="scss">
.difference-modal {
width: 640rpx;
max-width: 640rpx;
max-height: 70vh;
background-color: #fff;
border-radius: 14rpx;
overflow: hidden;
display: flex;
flex-direction: column;
box-sizing: border-box;
// 使 border-box
* {
box-sizing: border-box;
}
&__header {
padding: 40rpx 30rpx 20rpx;
text-align: center;
border-bottom: 1rpx solid #f0f0f0;
}
&__title {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
&__content {
padding: 30rpx;
box-sizing: border-box;
width: 100%;
}
&__tip {
font-size: 28rpx;
color: #666;
line-height: 1.6;
margin-bottom: 30rpx;
word-wrap: break-word;
word-break: break-all;
box-sizing: border-box;
}
&__list {
width: 100%;
box-sizing: border-box;
.difference-modal__item {
margin-bottom: 30rpx;
padding: 20rpx;
background-color: #f8f8f8;
border-radius: 8rpx;
box-sizing: border-box;
width: 100%;
max-width: 100%;
overflow: hidden;
&:last-child {
margin-bottom: 0;
}
}
}
&__item-header {
margin-bottom: 15rpx;
width: 100%;
box-sizing: border-box;
}
&__item-name {
font-size: 30rpx;
font-weight: bold;
color: #333;
word-wrap: break-word;
word-break: break-all;
}
&__item-content {
width: 100%;
max-width: 100%;
box-sizing: border-box;
.difference-modal__value-row {
display: flex;
align-items: flex-start;
margin-bottom: 10rpx;
width: 100%;
max-width: 100%;
box-sizing: border-box;
&:last-child {
margin-bottom: 0;
}
}
}
&__label {
font-size: 26rpx;
color: #666;
width: 100rpx;
flex-shrink: 0;
box-sizing: border-box;
}
&__value {
font-size: 26rpx;
flex: 1;
min-width: 0; // flex
max-width: 100%;
word-wrap: break-word;
word-break: break-all;
white-space: normal;
line-height: 1.5;
overflow-wrap: break-word;
box-sizing: border-box;
&--old {
color: #999;
}
&--new {
color: #2979ff;
font-weight: 500;
}
}
&__footer {
padding: 30rpx;
padding-bottom:50rpx;
border-top: 1rpx solid #f0f0f0;
display: flex;
flex-direction: column;
gap: 20rpx;
}
&__footer-row {
display: flex;
justify-content: space-between;
gap: 20rpx;
&--center {
justify-content: center;
}
}
}
</style>