直播软件源码,vue 自定义指令过滤特殊字符

直播软件源码,vue 自定义指令过滤特殊字符
最新回答
把酒不离食

2022-09-04 17:25:45

这段代码实现了一个 Vue 自定义指令 v-emoji,用于过滤输入框中的特则悉锋殊字符,仅允许输入数字、字母和汉字。以下是对代码的详细解析和优化建议:

代码解析
  1. 指令功能

    通过正则表达式 /[^a-zA-Z0-9_u4e00-u9fa5]+$/gi 匹配非数字、字母、下划线和汉字的字符,并在输入时实时替换为空字符串。

    在 blur 和 focus 事件中调用 trim(),去除输入值两端的空格。

  2. 关键逻辑

    正则表达式

    a-zA-Z:匹配大小写字母。

    0-9:匹配数字。

    u4e00-u9fa5:匹配汉字 Unicode 范围。

    _:允许下划线(根据需求可移除)。

    [^...]:否定字符集,匹配不在括号内的字符。

    事件监陆余听

    oninput:实时过滤非法字符。

    onblur/onfocus:处理空格(但逻辑重复,可优化)。

  3. 注册指令

    通过 app.directive('emoji', {...}) 全局注册指令,使用时直接在模板中添加 v-emoji。

优化建议
  1. 避免重复 trim()onblur 和 onfocus 中均调用 trim(),可能引发不必要的性能开销。建议仅保留 onblur 中的处理。孙晌

  2. 正则表达式优化

    当前正则末尾的 $ 会导致仅匹配字符串末尾的非法字符,可能遗漏中间部分。建议移除 $:

    const pattern = new RegExp(/[^a-zA-Z0-9_u4e00-u9fa5]/gi);
  3. 兼容性增强

    添加对 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, '');}
  4. 指令解绑在 unmounted 生命周期中移除事件监听,避免内存泄漏:

    app.directive('emoji', { mounted(el) { /* ... */ }, unmounted(el) { el.oninput = null; el.onblur = null; el.onfocus = null; }});
完整优化代码export default (app) => { app.directive('emoji', { mounted(el) { const pattern = /[^a-zA-Z0-9_u4e00-u9fa5]/gi; let isComposing = false; const filterInput = () => { if (el.value) el.value = el.value.replace(pattern, ''); }; el.addEventListener('compositionstart', () => isComposing = true); el.addEventListener('compositionend', () => { isComposing = false; filterInput(); }); el.oninput = (e) => { if (!isComposing) filterInput(); }; el.onblur = (e) => { e.target.value = e.target.value.trim(); }; }, unmounted(el) { el.oninput = null; el.onblur = null; } });};使用示例<template> <input v-emoji v-model="username" placeholder="仅允许数字、字母、汉字" /></template><script setup>import { ref } from 'vue';const username = ref('');</script>总结
  • 核心功能:通过正则表达式和事件监听实现输入过滤。
  • 优化点:处理输入法兼容性、避免重复操作、清理事件监听。
  • 扩展性:可根据需求调整正则表达式(如移除 _ 或添加其他符号)。

此指令适用于直播软件中需要严格限制输入内容的场景(如用户名、弹幕等),确保数据安全性和一致性。