91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Element基于el-input數字范圍輸入框怎么實現

發布時間:2023-04-28 17:55:29 來源:億速云 閱讀:419 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Element基于el-input數字范圍輸入框怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Element基于el-input數字范圍輸入框怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

數字范圍組件

Element基于el-input數字范圍輸入框怎么實現

在做篩選時可能會出現數字范圍的篩選,例如:價格、面積,但是elementUI本身沒有自帶的數字范圍組件,于是進行了簡單的封裝,不足可自行進行優化

滿足功能:

  • 最小值與最大值的相關約束,當最大值存在,最小值大于最大值且失焦,自動將最小值賦值為最大值,反之亦然。

  • 擁有el-input組件本身的屬性綁定以及方法

  • 可設置精度,默認精度為0

  • 可使用el-input插槽,但需要加前綴start-end-進行區分

<numberRange :startValue.sync="startValue" :endValue.sync="endValue" />

相關代碼:

<template>
  <div class="input-number-range" :class="{ 'is-disabled': disabled }">
    <div class="flex">
      <el-input
        ref="inputFromRef"
        clearable
        v-model="startValue"
        :disabled="disabled"
        :placeholder="startPlaceholder"
        @blur="handleBlurFrom"
        @focus="handleFocusFrom"
        @input="handleInputFrom"
        @change="handleInputChangeFrom"
        v-bind="$attrs"
        v-on="$listeners"
      >
        <template v-for="(value, name) in startSlots" #[name]="slotData">
          <slot :name="name" v-bind="slotData || {}"></slot>
        </template>
      </el-input>
      <div class="center">
        <span>至</span>
      </div>
      <el-input
        ref="inputToRef"
        clearable
        v-model="endValue"
        :disabled="disabled"
        :placeholder="endPlaceholder"
        @blur="handleBlurTo"
        @focus="handleFocusTo"
        @input="handleInputTo"
        @change="handleInputChangeTo"
        v-bind="$attrs"
        v-on="$listeners"
      >
        <template v-for="(value, name) in endSlots" #[name]="slotData">
          <slot :name="name" v-bind="slotData || {}"></slot>
        </template>
      </el-input>
    </div>
  </div>
</template>
<script>
export default {
  name: "InputNumberRange",
  props: {
    // inputs: {
    //   type: Array,
    //   required: true,
    //   default: () => [null, null],
    // },
    startValue: {
      type: Number || String,
      default: null,
    },
    endValue: {
      typeof: Number || String,
      default: null,
    },
    // 是否禁用
    disabled: {
      type: Boolean,
      default: false,
    },
    startPlaceholder: {
      type: String,
      default: "最小值",
    },
    endPlaceholder: {
      type: String,
      default: "最大值",
    },
    // 精度參數
    precision: {
      type: Number,
      default: 0,
      validator(val) {
        return val >= 0 && val === parseInt(val, 10);
      },
    },
  },
  data() {
    return {};
  },
  computed: {
    startSlots() {
      const slots = {};
      Object.keys(this.$slots).forEach((name) => {
        if (name.startsWith("start-")) {
          const newKey = name.replace(/^start-/, "");
          slots[newKey] = this.$slots[name];
        }
      });
      return slots;
    },
    endSlots() {
      const slots = {};
      Object.keys(this.$slots).forEach((name) => {
        if (name.startsWith("end-")) {
          const newKey = name.replace(/^end-/, "");
          slots[newKey] = this.$slots[name];
        }
      });
      return slots;
    },
  },
  watch: {},
  methods: {
    handleInputFrom(value) {
      this.$emit("update:startValue", value);
    },
    handleInputTo(value) {
      this.$emit("update:endValue", value);
    },
    // from輸入框change事件
    handleInputChangeFrom(value) {
      // 如果是非數字空返回null
      if (value == "" || isNaN(value)) {
        this.$emit("update:startValue", null);
        return;
      }
      // 初始化數字精度
      const newStartValue = this.setPrecisionValue(value);
      // 如果from > to 將from值替換成to
      if (
        typeof newStartValue === "number" &&
        parseFloat(newStartValue) > parseFloat(this.endValue)
      ) {
        this.startValue = this.endValue;
      } else {
        this.startValue = newStartValue;
      }
      if (this.startValue !== value) {
        this.$emit("update:startValue", this.startValue);
      }
    },
    // to輸入框change事件
    handleInputChangeTo(value) {
      // 如果是非數字空返回null
      if (value == "" || isNaN(value)) {
        this.$emit("update:endValue", null);
        return;
      }
      // 初始化數字精度
      const newEndValue = this.setPrecisionValue(value);
      // 如果from > to 將from值替換成to
      if (
        typeof newEndValue === "number" &&
        parseFloat(newEndValue) < parseFloat(this.startValue)
      ) {
        this.endValue = this.startValue;
      } else {
        this.endValue = newEndValue;
      }
      if (this.endValue !== value) {
        this.$emit("update:endValue", this.endValue);
      }
    },
    handleBlurFrom(event) {
      this.$emit("blur-from", event);
    },
    handleFocusFrom(event) {
      this.$emit("focus-from", event);
    },
    handleBlurTo(event) {
      this.$emit("blur-to", event);
    },
    handleFocusTo(event) {
      this.$emit("focus-to", event);
    },
    // 根據精度保留數字
    toPrecision(num, precision) {
      if (precision === undefined) precision = 0;
      return parseFloat(
        Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision)
      );
    },
    // 設置精度
    setPrecisionValue(value) {
      if (this.precision === undefined) return value;
      return this.toPrecision(parseFloat(value), this.precision);
    },
  },
};
</script>
<style lang="scss" scoped>
// 取消element原有的input框樣式
::v-deep .el-input__inner {
  border: 0px;
  margin: 0;
  padding: 0 15px;
  background-color: transparent;
}
.input-number-range {
  background-color: #fff;
  border: 1px solid #dcdfe6;
  border-radius: 4px;
}
.flex {
  display: flex;
  flex-direction: row;
  width: 100%;
  height: auto;
  justify-content: center;
  align-items: center;
  .center {
    margin-top: 1px;
  }
}
.is-disabled {
  background-color: #f5f7fa;
  border-color: #e4e7ed;
  color: #c0c4cc;
  cursor: not-allowed;
}
</style>

讀到這里,這篇“Element基于el-input數字范圍輸入框怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赤壁市| 扶绥县| 汾阳市| 桐乡市| 濉溪县| 兰溪市| 山东| 元谋县| 漳浦县| 静安区| 台安县| 汉阴县| 宁陵县| 旬阳县| 县级市| 商水县| 邢台市| 佛山市| 敦煌市| 勃利县| 高雄县| 崇仁县| 南投市| 叶城县| 突泉县| 康保县| 巍山| 金昌市| 玛沁县| 偏关县| 台中县| 汉阴县| 东平县| 邯郸县| 广安市| 莱州市| 翁牛特旗| 苗栗市| 高要市| 尼勒克县| 南澳县|