基于el-input的数字范围输入框

news2024/11/25 22:43:14

数字范围组件

在这里插入图片描述

在做筛选时可能会出现数字范围的筛选,例如:价格、面积,但是elementUI本身没有自带的数字范围组件,于是进行了简单的封装,不足可自行进行优化

满足功能:

  1. 最小值与最大值的相关约束,当最大值存在,最小值大于最大值且失焦,自动将最小值赋值为最大值,反之亦然。
  2. 拥有el-input组件本身的属性绑定以及方法
  3. 可设置精度,默认精度为0
  4. 可使用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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++默认成员函数 日期类运算符重载

赋值重载 赋值重载&#xff0c;首先我们先说一个运算符重载&#xff0c;什么是运算符重载呢&#xff1f; 当我们有一个日期类的话&#xff0c;我们想要对&#xff0c; 一个日期类进行比较&#xff0c;那么我们怎么比较呢&#xff1f; 我们是不是先得比较年的大小&#xff0c;…

day6 socket套接字及TCP的实现框架

socket套接字 Berkeley UNIX 操作系统定义了一种API它又称为套接字接口&#xff08;socket interface); socket作用&#xff1a; socket常见API介绍 /*创建套接字*/ int socket(int domain, int type, int protocol); /*绑定通信结构体*/ int bind(int sockfd, const, struc…

【数据库】MVCC原理详解

文章目录 前言1. 相关数据库知识点回顾1.1 什么是数据库事务&#xff0c;为什么要有事务1.2 事务包括哪几个特性&#xff1f;1.3 事务并发存在的问题1.3.1 脏读1.3.2 不可重复读1.3.3 幻读 1.4 四大隔离级别1.4.1 读未提交1.4.2 读已提交1.4 3 可重复读1.4.4 串行化1.4.5 四大隔…

chatgpt模拟机器人软件开发

ChatGPT的参数取决于具体的模型和实现方式&#xff0c;但以下是一些常见的ChatGPT参数&#xff1a; 模型深度&#xff1a;指模型中神经网络的层数。通常情况下&#xff0c;层数越多&#xff0c;模型的表达能力也就越强。 隐藏单元大小&#xff1a;指在模型中每个隐藏层…

局域网 - CSMA/CD(载波侦听多路访问 / 冲突检测)

文章目录 1 概述1.1 局域网的拓扑结构 2 CSMA/CD2.1 三种监听算法2.2 冲突检测原理2.3 二进制指数后退算法 3 扩展3.1 网工软考真题 1 概述 1.1 局域网的拓扑结构 2 CSMA/CD CSMA/CD&#xff1a;Carrier Sense Multiple Access/ Collision Detection&#xff0c;载波侦听多路…

从功能测试转型测试开发,薪资涨了20K,1000字讲述转型必经之路...

身处职场之中&#xff0c;犹如逆水行舟不进则退&#xff0c;想要不被后浪拍死在沙滩上&#xff0c;就要不断学习新知识&#xff0c;接受新事物。 要得到更好的发展&#xff0c;就要紧跟发展趋势&#xff0c;不断转型才能保持竞争力&#xff0c;在职场中占有一席之地。 转型不…

如何理解自动化测试数据驱动与关键字驱动的区别?

一、关键字驱动KDT(Keyword-driven testing) 1、自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段&#xff0c;它是当前比较流行的一种框架之一&#xff0c;并且现在的自动化测试工具已经将关键字驱动框架融入到工具中。在录制过程中自动化测试工具会将对象及操作属性保…

如何提高倾斜摄影超大场景的三维模型轻量化处理速度和效率?

如何提高倾斜摄影超大场景的三维模型轻量化处理速度和效率&#xff1f; 倾斜摄影超大场景的三维模型轻量化处理是将高精度的三维模型进行降采样、简化等处理&#xff0c;以达到减少数据大小和提高渲染性能的目的。为了提高轻量化处理速度&#xff0c;可以从以下方面入手&#x…

【Java 】Java 类加载和类加载器

文章目录 前言一、加载二、链接验证准备解析 三、初始化发生的时机不会触发类的初始化 四、类加载器双亲委派模式 前言 Java 的类加载阶段分为&#xff1a;加载、链接、初始化&#xff0c;而链接的过程中包括&#xff1a;验证、准备、解析。 一、加载 将类的字节码载入方法区…

vue3新拟态组件库开发流程——table组件源码

基础表格 首先开发table组件之前&#xff0c;先想好要用什么样式的api&#xff0c;因为笔者在生产工作中用的都是element&#xff0c;所以前面几个组件风格和element类似&#xff0c;但是这次不打算用element的风格了&#xff0c;打算换一种&#xff0c;直接展示&#xff1a; …

LinkedHashMap顺序迭代原理与LRU算法实现

一、LinkedHashMap与HashMap的结构区别 HashMap LinkedHashMap 结构区别&#xff1a;LinkedHashMap的元素Entry中多两个用于维护双向链表的指针before、after&#xff0c;并且在LinkedHashMap中有两个head、tail指针用于记录双向链表的头结点和尾结点。 二、LinkedHashMa…

2.3 定点乘法运算

学习目标&#xff1a; 如果我要学习定点乘法运算&#xff0c;我会按照以下步骤进行学习&#xff1a; 确定学习目标&#xff1a;明确学习定点乘法运算的目的和重点&#xff0c;以便有针对性地进行学习。 掌握基础知识&#xff1a;首先需要了解定点数和定点乘法的基础知识&…

【halcon】半透明和棋盘格(未完成)

背景 想实现一个这样的效果&#xff1a; 但是发现设置HSmartWindowControlWPF 的Background 根本就没有反应。 探索过程 于是就换个思路&#xff0c;把棋盘格画到Border里面。 <Border Grid.Row"1" Grid.ColumnSpan"2" Panel.ZIndex"0" >…

MySQL:数据库的基本操作

MySQL是一个客户端服务器结构的程序, 一.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等. …

mitmproxy抓包

0.mitmproxy功能简介 实时拦截、修改 HTTP/HTTPS 请求和响应可保存完整的 http 会话&#xff0c;方便后续分析和重放支持反向代理模式将流量转发到指定服务器支持 macOS 和 Linux上的透明代理模式支持用 Python 脚本对 HTTP 通信进行修改 1. 安装mitmproxy pip3 install mit…

wow.js scrollReveal.js 动画库 使用详解以及优劣

wow.js 1.简介 有的页面在向下滚动的时候&#xff0c;有些元素会产生细小的动画效果。比如需要做到滚动条滑到某个位置时&#xff0c;才能显示动画。wow.js 依赖 animate.css&#xff0c;所以它支持 animate.css 多达 60 多种的动画效果&#xff0c;能满足您的各种需求。 IE6、…

Python+Qt掌纹识别

程序示例精选 PythonQt掌纹识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt掌纹识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

安卓GB28181-2022 RTP over TCP

使用TCP传输RTP包&#xff0c;GB28181-2016和GB28181-2022 都是按IETF RFC4571来的。使用TCP发送RTP包&#xff0c;前面加个16位无符号长度字段就好(网络字节序)。具体定义格式如下&#xff1a; 需要注意的是LENGTH值可以是0&#xff0c;0的话表示空包; 另外UDP传输RTP包&#…

【华为云主机迁移服务SMS,使用指南 (linux版本)】

文章目录 华为云主机迁移服务SMS,使用指南 (linux版本)1.迁移前准备工作1.1 必要条件1.2 准备 (注意切换浏览器) 2.在源端(A服务器)安装Agent (linux版), 连接到B的华为云SMS3.设置目的端(B服务器)--在B浏览器内操作4.开始服务器复制5.启动目的端 (B)6.其他非必要操作 华为云主…

KDZD地埋线短路漏电试扎器

一、产品背景 多年以来&#xff0c;电力电缆的维护迁移过程中的识别与刺孔&#xff0c;均按照行业标准DL409-91《电业安全工作规程&#xff08;电力线路部分&#xff09;》第234条要求&#xff0c;采用人工刺孔&#xff0c;一旦电缆识别出错&#xff0c;误刺孔带电电缆将对人身…