vue3 全局注册自定义指令,input聚焦失焦展示对应值

简单举例:聚焦大写英文、失焦小写英文

创建一个专门的文件来存放自定义指令,例如 directives/modifyOnFocusBlur.js

TypeScript 复制代码
export const modifyOnFocusBlur = {
  mounted(el: { value: string; dispatchEvent: (arg0: Event) => void; addEventListener: (arg0: string, arg1: { (): void; (): void }) => void; _focusHandler: () => void; _blurHandler: () => void }, binding: { arg: string; modifiers: { required: any }; value: string }) {
    // 聚焦时的处理函数
    const handleFocus = () => {
      // 自定义聚焦时的行为
      if (binding.arg === 'upperlower') {
        el.value = el.value.toUpperCase();
      }
      // 通知 v-model 更新
      el.dispatchEvent(new Event('input'));
    };

    // 失焦时的处理函数
    const handleBlur = () => {
      if (binding.arg === 'upperlower') {
        el.value = el.value.toLowerCase();
      }
      // 通知 v-model 更新
      el.dispatchEvent(new Event('input'));
    };

    // 添加事件监听器
    el.addEventListener('focus', handleFocus);
    el.addEventListener('blur', handleBlur);

    // 保存事件处理函数引用,以便后续移除
    el._focusHandler = handleFocus;
    el._blurHandler = handleBlur;
  },

  beforeUnmount(el: { removeEventListener: (arg0: string, arg1: any) => void; _focusHandler: any; _blurHandler: any }) {
    // 移除事件监听器,防止内存泄漏
    el.removeEventListener('focus', el._focusHandler);
    el.removeEventListener('blur', el._blurHandler);
    delete el._focusHandler;
    delete el._blurHandler;
  },
};

全局注册指令

TypeScript 复制代码
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import { modifyOnFocusBlur } from './directives/modifyOnFocusBlur';

const app = createApp(App);

// 全局注册自定义指令
app.directive('modify-on-focus-blur', modifyOnFocusBlur);

app.mount('#app');

在组件中使用自定义指令

TypeScript 复制代码
<input v-model="message" v-modify-on-focus-blur:upperlower placeholder="输入内容">
相关推荐
Forever7_15 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
不会敲代码115 小时前
前端组件化样式隔离实战:React CSS Modules、styled-components 与 Vue scoped 对比
css·vue.js·react.js
Angelial15 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
SuperEugene16 小时前
Vue状态管理扫盲篇:如何设计一个合理的全局状态树 | 用户、权限、字典、布局配置
前端·vue.js·面试
阿懂在掘金17 小时前
defineModel 是进步还是边界陷阱?双数据源组件的选择逻辑
vue.js·源码阅读
李剑一17 小时前
要闹哪样?又出现了一款新的格式化插件,尤雨溪力荐,速度提升了惊人的45倍!
前端·vue.js
阿虎儿18 小时前
React Context 详解:从入门到性能优化
前端·vue.js·react.js
滕青山20 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力20 小时前
ts+vue3开发规范
vue.js·typescript
梦想CAD控件21 小时前
在线CAD开发包结构与功能说明
前端·javascript·vue.js