2022-09-04 17:25:45
这段代码实现了一个 Vue 自定义指令 v-emoji,用于过滤输入框中的特则悉锋殊字符,仅允许输入数字、字母和汉字。以下是对代码的详细解析和优化建议:
代码解析指令功能
通过正则表达式 /[^a-zA-Z0-9_u4e00-u9fa5]+$/gi 匹配非数字、字母、下划线和汉字的字符,并在输入时实时替换为空字符串。
在 blur 和 focus 事件中调用 trim(),去除输入值两端的空格。
关键逻辑
正则表达式:
a-zA-Z:匹配大小写字母。
0-9:匹配数字。
u4e00-u9fa5:匹配汉字 Unicode 范围。
_:允许下划线(根据需求可移除)。
[^...]:否定字符集,匹配不在括号内的字符。
事件监陆余听:
oninput:实时过滤非法字符。
onblur/onfocus:处理空格(但逻辑重复,可优化)。
注册指令
通过 app.directive('emoji', {...}) 全局注册指令,使用时直接在模板中添加 v-emoji。
避免重复 trim()onblur 和 onfocus 中均调用 trim(),可能引发不必要的性能开销。建议仅保留 onblur 中的处理。孙晌
正则表达式优化
当前正则末尾的 $ 会导致仅匹配字符串末尾的非法字符,可能遗漏中间部分。建议移除 $:
const pattern = new RegExp(/[^a-zA-Z0-9_u4e00-u9fa5]/gi);兼容性增强
添加对 compositionstart 和 compositionend 事件的支持,避免中文输入法未确认时的误过滤:
let isComposing = false;el.addEventListener('compositionstart', () => isComposing = true);el.addEventListener('compositionend', () => { isComposing = false; filterInput();});el.oninput = (e) => { if (!isComposing) filterInput();};function filterInput() { if (el.value) el.value = el.value.replace(pattern, '');}指令解绑在 unmounted 生命周期中移除事件监听,避免内存泄漏:
app.directive('emoji', { mounted(el) { /* ... */ }, unmounted(el) { el.oninput = null; el.onblur = null; el.onfocus = null; }});此指令适用于直播软件中需要严格限制输入内容的场景(如用户名、弹幕等),确保数据安全性和一致性。