From c2f169a2448e4162ac36c22548c069fa4b1f6b22 Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Fri, 14 Oct 2022 17:22:28 +0800
Subject: [PATCH] 省市区地理名称变更

---
 forms/numberValve/CNumberValve.vue |   65 ++++++++++++++++++++++----------
 1 files changed, 45 insertions(+), 20 deletions(-)

diff --git a/forms/numberValve/CNumberValve.vue b/forms/numberValve/CNumberValve.vue
index e19731e..342beb5 100644
--- a/forms/numberValve/CNumberValve.vue
+++ b/forms/numberValve/CNumberValve.vue
@@ -16,18 +16,15 @@
                 :required="itemRes.required"
                 :disabled="itemRes.disabled"
                 :error="itemRes.error"
-                :value="itemRes.formData[itemRes.name]"
+                :value="itemRes.formData[itemRes.name] + unit"
+                :placeholder="placeholder"
             >
                 <view class="at-icon at-icon-chevron-right"></view>
             </AtInput>
         </view>
-        <AtRange
-            :min="range[0]"
-            :max="range[1]"
-            :value="[0, itemRes.formData[itemRes.name]]"
-            :onChange="evt => evt && itemRes.onChange(evt[1])"
-        />
         <AtFloatLayout
+            :class="placeholder?'on-title':''"
+            :title="placeholder"
             :isOpened="opened"
             :onClose="evt => handleClose()"
         >
@@ -74,7 +71,7 @@
 <script>
 import Taro from '@tarojs/taro';
 import { $ } from '@tarojs/extend';
-import { AtInput, AtFloatLayout, AtButton, AtRange } from 'taro-ui-vue';
+import { AtInput, AtFloatLayout, AtButton } from 'taro-ui-vue';
 import './cNumberValve.scss';
 
 export default {
@@ -83,7 +80,6 @@
         AtInput,
         AtFloatLayout,
         AtButton,
-        AtRange,
     },
     props: {
         // 表单数据资源(表单组件内部机制专用)
@@ -99,6 +95,11 @@
         step: {
             type: Number,
             default: 1,
+        },
+        // 数值单位(仅显示)
+        unit: {
+            type: String,
+            default: '',
         },
     },
     data() {
@@ -132,9 +133,17 @@
             const targetValue = clientX - this.rect.left;
             const distance = Math.min(Math.max(targetValue, 0), this.rect.width);
             const sliderLeft = Math.floor((distance / this.rect.width) * 100);
-            const sliderValue =
+            // 实际值
+            let sliderValue =
                 Math.round((sliderLeft / 100) * (this.range[1] - this.range[0])) +
                 this.range[0];
+            if (this.range[0] < sliderValue && sliderValue < this.range[1]) {
+                sliderValue -= sliderValue % this.step;
+            }
+            // 范围限制
+            sliderValue = Math.max(sliderValue, this.range[0]);
+            sliderValue = Math.min(sliderValue, this.range[1]);
+            // 设置
             this.sliderLeft = sliderLeft;
             this.current = sliderValue;
             this.itemRes.onChange(sliderValue);
@@ -143,27 +152,43 @@
             let $slider = null;
             if (process.env.TARO_ENV === 'h5') {
                 $slider = $(this.$refs.slider.$el);
+                const rect = $slider[0].getBoundingClientRect();
+                this.rect.width = rect.width;
+                this.rect.left = rect.left;
             } else if (process.env.TARO_ENV === 'weapp') {
-                $slider = $(this.$refs.slider);
+                Taro.createSelectorQuery()
+                    .select('#' + this.$refs.slider.uid)
+                    .boundingClientRect(rect => {
+                        this.rect.width = rect.width;
+                        this.rect.left = rect.left;
+                    })
+                    .exec();
             }
-            Taro.createSelectorQuery()
-                .select('#' + this.$refs.slider.uid)
-                .boundingClientRect(rect => {
-                    this.rect.width = rect.width;
-                    this.rect.left = rect.left;
-                })
-                .exec();
         },
         handleChangeVal(type, value) {
             this.updateRect();
             let currentNext = 0;
             if (type === 'left') {
-                currentNext = this.current - this.step;
+                const gap = this.current % this.step;
+                if (gap === 0) {
+                    currentNext = this.current - this.step;
+                } else {
+                    currentNext = this.current - gap;
+                }
             } else if (type === 'right') {
-                currentNext = this.current + this.step;
+                const gap = this.current % this.step;
+                if (gap === 0) {
+                    currentNext = this.current + this.step;
+                } else {
+                    currentNext = this.current + (this.step - gap);
+                }
             } else if (type === 'change') {
                 currentNext = value;
             }
+            // 范围限制
+            currentNext = Math.max(currentNext, this.range[0]);
+            currentNext = Math.min(currentNext, this.range[1]);
+            // 设置
             const sliderLeft = Math.round(
                 ((currentNext - this.range[0]) / (this.range[1] - this.range[0])) * 100
             );

--
Gitblit v1.9.1