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

如何在JavaScript中将子串移至字符串末尾?Vue@keyup实现遇异常

解决Vue中固定“ [Personal]”在字符串末尾的问题

原代码的问题

  • 未赋值返回结果:replace是纯函数,不会修改原变量this.target.name,必须将返回值重新赋值才会生效。
  • 正则匹配覆盖不全:原正则仅匹配 [Personal]位于字符串中间的情况,若它在开头/末尾或多次出现,正则无法处理。
  • keyup事件触发过频:每次按键都执行字符串处理,导致输入卡顿。

修正方案

1. 修复字符串处理逻辑

先移除所有已存在的 [Personal],再统一添加到末尾,确保始终只有一个且位于最后:

handleNameFormat() {
  if (!this.target.name) return;
  // 移除所有" [Personal]"标签
  const cleanName = this.target.name.replace(/ \[Personal\]/g, '');
  // 重新添加标签到末尾
  this.target.name = `${cleanName} [Personal]`;
}

2. 优化事件处理避免卡顿

用防抖函数延迟执行处理逻辑,减少触发频率,同时改用@input事件覆盖所有输入场景(如粘贴、输入法选词):

// 组件内定义防抖工具函数
debounce(fn, delay = 200) {
  let timer;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, args), delay);
  };
},

// 初始化时绑定防抖后的处理方法
mounted() {
  this.debouncedFormat = this.debounce(this.handleNameFormat);
},

// 字符串格式化核心方法
handleNameFormat() {
  if (!this.target.name) return;
  const cleanName = this.target.name.replace(/ \[Personal\]/g, '');
  this.target.name = `${cleanName} [Personal]`;
}

模板中使用@input绑定防抖方法:

<input v-model="target.name" @input="debouncedFormat" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:01:11