WebApp【公共组件库】@前端(For Git Submodule)
Tevin
2022-04-22 a580cafe59a8f067cc6f011193952367beadcb2f
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
            );