当前位置: 首页 > news >正文

适用于 vue2、vue3 的自定义指定:v-int(正整数)

在项目中,我们经常会遇到输入框只允许输入数字的情况,下面是一段自定义指定 代码,复制到项目中,注册指定即可使用

  • 用法如下:
  1. 创建一个IntInput.js 文件,将下面代码复制到文件中保存
  2. 在项目中的 main.js 文件中导入创建的 IntInput.js 文件
  3. 注册全局指令:app.directive(‘int’, IntInput) ,注册后即可使用 v-int 绑定元素(兼容了大多数组件库中输入框组件)
    注意:以下代码中的钩子函数是 vue3 写法,如需在 vue2 项目中使用,修改对应的钩子函数即可(代码中有注释说明)
/*** 查找并返回元素内部的原生 <input> 节点。*/
function getInputElement(el) {if (el.tagName.toLowerCase() === 'input') {return el;}const input = el.querySelector('input');if (!input) {throw new Error('v-integer directive requires the element to contain an <input> tag.');}return input;
}/*** 将字符串中的全角数字转换为半角数字。*/
function toHalfWidth(str) {return str.replace(/[\uff10-\uff19]/g, (char) => {return String.fromCharCode(char.charCodeAt(0) - 65248);});
}export default {/*** Vue 2: bind / Vue 3: mounted*/mounted(el) {const input = getInputElement(el);// ⭐ 核心:引入一个状态标志来跟踪输入法组合状态el._v_integer_is_composing = false;const onCompositionStart = () => {el._v_integer_is_composing = true;};const onCompositionEnd = (event) => {// 组合结束后,标志位复原el._v_integer_is_composing = false;// ⭐ 关键:手动触发一次 input 事件(或直接调用处理函数)来执行清理// 使用 dispatchEvent 更符合事件流,并能被其他可能的监听器捕获event.target.dispatchEvent(new Event('input'));};// onKeydown 逻辑保持不变,用于拦截非组合状态下的无效按键const onKeydown = (event) => {if (el._v_integer_is_composing) {return;}};const onInput = () => {// ⭐ 关键:如果在组合状态中,则不执行任何操作if (el._v_integer_is_composing) {return;}const originalValue = input.value;const normalizedValue = toHalfWidth(originalValue);const sanitizedValue = normalizedValue.replace(/[^\d]/g, '');if (originalValue !== sanitizedValue) {const selectionStart = input.selectionStart;const valueChange = originalValue.length - sanitizedValue.length;input.value = sanitizedValue;// 简单恢复光标位置if (selectionStart) {input.selectionStart = input.selectionEnd = selectionStart - valueChange;}input.dispatchEvent(new Event('input', { bubbles: true }));}};// 存储所有处理器以便解绑el._v_integer_handlers = {keydown: onKeydown,input: onInput,compositionstart: onCompositionStart,compositionend: onCompositionEnd,};// 绑定所有事件监听器input.addEventListener('keydown', onKeydown);input.addEventListener('input', onInput);input.addEventListener('compositionstart', onCompositionStart);input.addEventListener('compositionend', onCompositionEnd);},/*** Vue 2: unbind / Vue 3: unmounted*/unmounted(el) {try {const input = getInputElement(el);if (el._v_integer_handlers) {input.removeEventListener('keydown', el._v_integer_handlers.keydown);input.removeEventListener('input', el._v_integer_handlers.input);input.removeEventListener('compositionstart', el._v_integer_handlers.compositionstart);input.removeEventListener('compositionend', el._v_integer_handlers.compositionend);delete el._v_integer_handlers;delete el._v_integer_is_composing;}} catch (e) {console.warn('Could not unbind v-integer listeners.', e);}}
};
http://www.lryc.cn/news/579910.html

相关文章:

  • HDMI延长器 vs 分配器 vs KVM切换器 vs 矩阵:技术区别与应用场景
  • Django+DRF 实战:从异常捕获到自定义错误信息
  • VS中将cuda项目编译为DLL并调用
  • Excel 如何处理更复杂的嵌套逻辑判断?
  • Java并发性能优化|读写锁与互斥锁解析
  • openEuler 24.03 全流程实战:用 Ansible 5 分钟部署分布式 MinIO 高可用集群
  • 分布式集合通信--学习笔记
  • Data的时区格式BUG
  • 4 位量化 + FP8 混合精度:ERNIE-4.5-0.3B-Paddle本地部署,重新定义端侧推理效率
  • 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的颜色表达
  • 替代MT6701,3D 霍尔磁性角度传感器芯片
  • Python 机器学习核心入门与实战进阶 Day 2 - KNN(K-近邻算法)分类实战与调参
  • PyTorch实战(14)——条件生成对抗网络(conditional GAN,cGAN)
  • vue-39(为复杂 Vue 组件编写单元测试)
  • MySQL分布式ID冲突详解:场景、原因与解决方案
  • FFmpeg、WebAssembly 和 WebGL 在 Web 端的结合应用
  • GO 语言学习 之 结构体
  • 【深度学习新浪潮】如何使用大模型等技术基于序列预测蛋白质的结构,功能和靶点?
  • 韩顺平之第九章综合练习-----------房屋出租管理系统
  • hive中2种常用的join方式
  • 基于 PyTorch 的猫狗图像分类实战
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(四十) -> 灵活定制编译选项
  • 判断文件是否有硬链接
  • 类图+案例+代码详解:软件设计模式----单例模式
  • 【基础算法】贪心 (二) :推公式
  • PHP:从入门到进阶的全面指南
  • SRE - - PV、UV、VV、IP详解及区别
  • Ubuntu安装ClickHouse
  • 基于探索C++特殊容器类型:容器适配器+底层实现原理
  • 设计模式之代理模式--数据库查询代理和调用日志记录