sl-express/project-wl-yonghuduan-uniapp-vue3/pages/goodsInfo/components/weightAndVolume.vue

245 lines
7.4 KiB
Vue
Raw Normal View History

2023-09-04 16:40:17 +08:00
<!-- 重量和体积 -->
<template>
<view class="weightAndVolume">
<!-- 重量 -->
<view class="weight-box">
<view class="weight-box-title">预估重量</view>
<!-- <uni-number-box max="9999" min="1" :value="weight" @change="changeWeight" /> -->
<view class="number-box">
<view class="minus-btn" :class="isLessThan ? 'active' : ''" @click="handleMinus">-</view>
<input class="uni-input" type="digit" maxlength="4" v-model="weight" @blur="handleWeigthBlur"/>
<view class="add-btn" :class="isExceed ? 'active' : ''" @click="handleAdd">+</view>
</view>
<view class="unit">kg</view>
</view>
<!-- 体积 -->
<view class="volume-box">
<view class="volume-box-title">总体积</view>
<view class="isVolumeInfo">
<view class="isVolumeInfo-title">补充体积预估费用更准确</view>
<switch color="#1DC779" style="transform:scale(0.7)" @change="switchChange" :checked="isVolumeInfo" />
</view>
</view>
<!-- 体积输入框 -->
<view class="isVolumeInfo-title-box" v-if='isVolumeInfo'>
<uni-number-box />
<view class="number-box">
<view class="minus-btn" :class="isLessThanVolume ? 'active' : ''" @click="handleVolumeMinus">-</view>
<input class="uni-input" type="digit" maxlength="6" v-model="volume" @blur="handleVolume" />
<view class="add-btn" :class="isExceedVolume ? 'active' : ''" @click="handleVolumeAdd">+</view>
</view>
<view class="unit"></view>
</view>
<!-- 长宽高输入框 -->
<view class="long-width-height" v-if="isVolumeInfo">
<view class="long">
<input class="uni-input" type="digit" :value="long" maxlength="3" placeholder="长 cm"
@input="longFun" />
</view>
<view class="cheng">*</view>
<view class="width">
<input class="uni-input" type="digit" :value="width" maxlength="3" placeholder="宽 cm"
@input="widthFun" />
</view>
<view class="cheng">*</view>
<view class="height">
<input class="uni-input" type="digit" :value="height" maxlength="3" placeholder="高 cm"
@input="heightFun" />
</view>
</view>
<view class="accounting-rules">
实际质量与体积以收派员确定为准物品在包装后重量可能会增加重量体积大时会体积重量收费
<text class="red" @click="openAccountRulesDialog">了解计费规则</text>
</view>
</view>
</template>
<script setup>
import {
ref,
onMounted,
} from 'vue';
import {
useStore
} from 'vuex';
const emits = defineEmits(["@getWeight", '@getVolume']);
let isLessThan = ref(true); //判断重量是否小于0.1
let isExceed = ref(false); //判断重量是否大于9999
let isLessThanVolume = ref(true); //判断体积是否小于0.0001m³
let isExceedVolume = ref(false); //判断体积是否大于99m³
const weight = ref(1) //重量
const volume = ref(0) //体积
const long = ref() //长
const width = ref() //宽
const height = ref() //高
const isVolumeInfo = ref(false)
const store = useStore(); //vuex获取、储存数据
const users = store.state.user
onMounted(() => {
weight.value = users.weight
width.value = users.width
height.value = users.height
long.value = users.long
volume.value = users.volume ? (Number(users.volume) / 1000000) : 0
isVolumeInfo.value = users.width && users.long && users.height
})
// 减重量
const handleMinus = () => {
// 重量减去1
if (weight.value > 1) {
weight.value--;
isExceed.value = false; //右侧加号去除置灰
weight.value = weight.value.toFixed(1);
}
if (weight.value <= 1) {
isLessThan.value = true; //左侧减号置灰
if (weight.value <= 0.1) {
weight.value = 0.1
}
}
emits('getWeight', weight.value)
};
// 加重量
const handleAdd = () => {
// 重量加1
if (weight.value < 9999) {
++weight.value;
isLessThan.value = false; //左侧减号去除置灰
}
if (weight.value === 9999) {
isExceed.value = true; //右侧加号置灰
}
if (weight.value <= 1) {
// weight.value = 1;
isLessThan.value = true; //左侧减号置灰
}
emits('getWeight', weight.value)
};
//触发重量输入如果输入0自动判断为1kg,最小可输入值为0.1kg,最大值为9999kg
const handleWeigthBlur = e => {
let value = e.detail.value;
if (value < 0.1) {
value = 1;
isLessThan.value = true; //左侧减号置灰
} else {
if (value >= 0.1 && value <= 1) {
isLessThan.value = true;
} else {
isLessThan.value = false; //左侧减号去除置灰
}
if (value >= 9999) {
isExceed.value = true; //右侧加号置灰
value = 9999;
uni.showToast({
title: '重量最大可不能超过9999kg',
duration: 1000,
icon: 'none'
});
} else {
isExceed.value = false; //右侧加号去除置灰
}
}
weight.value = value
emits('getWeight', weight.value)
};
// 体积
const handleVolume = e => {
let value = Number(e.detail.value);
if (value < 0.0001) {
isLessThanVolume.value = true;
value = 0;
} else {
isLessThanVolume.value = false;
if (value >= 999) {
isExceedVolume.value = true; //右侧加号置灰
value = 999;
uni.showToast({
title: '体积最大可不能超过999m³',
duration: 1000,
icon: 'none'
});
} else {
value = Number(e.detail.value);
isExceedVolume.value = false; //右侧加号去除置灰
}
}
volume.value = value
emits('getVolume', (volume.value) * 1000000, long.value, width.value, height.value)
};
// 减体积
const handleVolumeMinus = () => {
// 体积减去1
if (volume.value > 1) {
volume.value--;
isExceedVolume.value = false; //右侧加号去除置灰
volume.value = volume.value.toFixed(1);
}
// 体积
if (volume.value <= 1) {
isLessThanVolume.value = true; //左侧减号置灰
if (weight.value <= 0.0001) {
weight.value = 0.0001
}
}
emits('getVolume', (volume.value) * 1000000, long.value, width.value, height.value)
};
// 加体积
const handleVolumeAdd = () => {
// 体积加1
if (volume.value < 999) {
++volume.value;
isLessThanVolume.value = false; //左侧减号去除置灰
}
if (volume.value === 999) {
isExceedVolume.value = true; //右侧加号置灰
}
emits('getVolume', (volume.value) * 1000000, long.value, width.value, height.value)
};
//是否显示具体体积
const switchChange = (e) => {
isVolumeInfo.value = e.detail.value
}
//修改长度
const longFun = (e) => {
long.value = e.detail.value
let valueFun = (Number(long.value) * Number(width.value) * Number(height.value)) / 1000000
volume.value = valueFun < 0.0001 ? 0.0001 : valueFun
emits('getVolume', ((volume.value) * 1000000), e.detail.value, width.value, height.value)
}
//修改宽度
const widthFun = (e) => {
width.value = e.detail.value
let valueFun = (Number(long.value) * Number(width.value) * Number(height.value)) / 1000000
volume.value = valueFun < 0.0001 ? 0.0001 : valueFun
emits('getVolume', (volume.value) * 1000000, long.value, e.detail.value, height.value)
}
//修改高度
const heightFun = (e) => {
height.value = e.detail.value
let valueFun = (Number(long.value) * Number(width.value) * Number(height.value)) / 1000000
volume.value = valueFun < 0.0001 ? 0.0001 : valueFun
emits('getVolume', (volume.value) * 1000000, long.value, width.value, e.detail.value)
}
//打开计费规则弹窗
const openAccountRulesDialog = () => {
uni.navigateTo({
url: '/subPages/account-rules/index'
});
}
</script>
<style src="./weightAndVolume.scss" lang="scss" scoped></style>