vue 项目给输入框增加trim()方法

方案:

  1. 在模板使用指令(最简单、最稳妥)
  • 在需要的输入上加 v-trim(支持 a-input):
js 复制代码
<a-input v-trim v-model="form.xxx" />

js 复制代码
<input v-trim v-model="xxx" />
  • 为了兼容 a-input 内部异步渲染的 input,把指令改得更稳一些(插入与更新都尝试绑定):
js 复制代码
  Vue.directive('trim', {
    inserted(el, binding, vnode) {
      const bind = () => {
        const input = el.querySelector('input,textarea');
        if (!input || input.type === 'password' || input.__vTrimBound) return;
        input.__vTrimBound = true;
        input.addEventListener('blur', () => {
          const oldValue = input.value;
          const newValue = oldValue.trim();
          if (newValue !== oldValue) {
            input.value = newValue;
            input.dispatchEvent(new Event('input', { bubbles: true }));
          }
        });
      };
      vnode.context.$nextTick(bind);
    },
    componentUpdated(el, binding, vnode) {
      vnode.context && vnode.context.$nextTick(() => {
        const input = el.querySelector('input,textarea');
        if (input && !input.__vTrimBound) {
          el.dispatchEvent(new Event('blur', { bubbles: true })); // 触发一次以绑定
        }
      });
    }
});
  1. 全局捕获 blur(无需在模板写 v-trim,对异步节点同样有效)
  • 在 main.js 添加一次性全局监听(放在创建 Vue 实例之前或之后都可):
js 复制代码
document.addEventListener('blur', (e) => {
    const t = e.target;
    if (!t) return;
    const isTextInput = (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA');
    if (!isTextInput || t.type === 'password') return;
    const oldValue = t.value;
    const newValue = typeof oldValue === 'string' ? oldValue.trim() : oldValue;
    if (newValue !== oldValue) {
      	t.value = newValue;
      	t.dispatchEvent(new Event('input', { bubbles: true }));
    }
}, true);
  • 优点:覆盖所有动态/第三方输入,省去模板标记。

  • 注意:如有不希望被裁剪的特例,需要在逻辑中额外过滤(比如通过 data-no-trim 属性跳过)。

建议

  • 快速落地:选方案 2 全局监听,一行代码解决全面生效问题。

  • 精细控制:选方案 1,在需要的输入上显式使用 v-trim,并保留增强后的指令实现。

相关推荐
2301_32241428042 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
专业程序开发源4 小时前
springbootLivehouse票务系统-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·pygame
leoZ2314 小时前
2026-09-10-静态扫描连错三次-用运行环境当裁判
前端·javascript·vue.js·人工智能·opencv·机器学习·数据挖掘
卓怡学长4 小时前
w233基于vue和springboot的宠物管理系统的设计与实现
java·vue.js·spring boot·spring·intellij-idea
梨涡泥窝6 小时前
JavaWeb——基于 Spring Boot + Vue 的图书管理系统的设计与实现
vue.js·spring boot·后端
huali8 小时前
vue-split-screen:让 Vue Router 的导航轨迹变成两个页面
前端·javascript·vue.js
雪芽蓝域zzs10 小时前
第三十六节:keep-alive 页面缓存(Vue3 + 后台管理系统)
前端·vue.js·缓存
边境悍匪10 小时前
蜗牛学苑 Java 智能体学习 Day41|ElementPlus 布局、Vue‑Router 登录、Axios 思维导图复盘
java·vue.js·学习
志尊宝10 小时前
Vue3 零基础每日笔记(017):事件处理进阶——$event、多事件与事件修饰符全家桶
javascript·vue.js·笔记
Bs_MoneyMagnet21 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring