You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue自定义uppercase指令异常:输入值最后一位仍为小写

问题原因及修复方案

问题原因

你编写的v-uppercase指令仅在元素挂载完成时执行一次,但Vue的v-model双向绑定是基于input事件触发同步的:

  • 用户输入字符时,浏览器先触发input事件,v-model会立刻把输入的原始字符(未转大写的最后一个字符)同步到testInput
  • 之后指令才会修改输入框的value为大写,但此时v-model的同步流程已经结束,所以testInput里的最后一个字符始终是小写。

修复方案

需要让指令监听输入事件,实时处理输入值,并手动触发input事件让v-model同步转大写后的值:

app.directive('uppercase', (el) => {
  const updateValue = () => {
    el.value = el.value.toUpperCase()
    // 手动触发input事件,通知v-model更新同步后的值
    el.dispatchEvent(new Event('input'))
  }

  // 初始化时处理已有值
  updateValue()
  // 监听输入事件,实时转换
  el.addEventListener('input', updateValue)
  // 监听失焦事件,确保最终值完全大写
  el.addEventListener('blur', updateValue)

  // 组件卸载时清理监听,避免内存泄漏
  return () => {
    el.removeEventListener('input', updateValue)
    el.removeEventListener('blur', updateValue)
  }
})

这样修改后,每次用户输入字符时,会先将输入框的值转为大写,再触发input事件让v-model同步这个大写值,testInput就会和输入框显示的内容完全一致了。

内容的提问来源于stack exchange,提问作者gespinha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:59:49