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,并保留增强后的指令实现。

相关推荐
yuyuxun113 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
FungLeo18 小时前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
码云社区21 小时前
智慧物业系统选型指南:房屋档案、账单管理与报修协作
前端·javascript·vue.js·智慧物业
ruanno_top1 天前
表单重置后,验证码还显示已通过:Vue 受控组件的 3 种假同步
vue.js
ruanno_top2 天前
给标签页加 roving tabindex,整组反而键盘进不去了
vue.js
仨孩子的爹2 天前
CSS打印样式:字体族与行高在纸上的对照实测
vue.js
OpenTiny社区2 天前
AI Agent场景组件库 TinyRobot v1.0 正式发布:一站式打造您的AI助手
vue.js·github
ruanno_top2 天前
轮播每 3 秒自己翻页:键盘停不下来,读屏也不知道换了页
vue.js
1-1=02 天前
Vue 3 模板语
前端·javascript·vue.js