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="输入内容">
相关推荐
破烂三角裤2 小时前
Vue 3 自动生成汉字拼音:pinyin-pro、Ruby 标签
vue.js
顽疲2 小时前
java vue springboot 养老系统源码详解:退住 care_out 审批结算与腾床事务实践
java·vue.js·spring boot·vue养老·springboot养老·java养老
雪芽蓝域zzs2 小时前
第 10 节:地图点击逆地理编码(点击地图获取经纬度 + 地址)
vue.js
斯内普吖2 小时前
(开源)线上花店系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
溪语流沙4 小时前
【Web全栈进阶】Vue Router + Pinia:SPA路由与全局状态
前端·javascript·vue.js
u0111026755 小时前
WebP 转成 PNG 后为什么更大?图片格式转换不等于压缩
前端·javascript·vue.js
seconp5 小时前
基于Spring Boot和Vue 3的智慧旅游网站:住宿预订、行程规划与千问接入
vue.js·spring boot·毕业设计·软件工程·课程设计·旅游·毕设
daols886 小时前
vue 甘特图组件 vxe-gantt 修改滚动条样式-让滚动条自动隐藏
javascript·vue.js·甘特图
特立独行的猫A7 小时前
仓颉UI开发实战:我用仓颉写了个桌面版力扣:从判题机到 100 道题
vue.js
用户1733598075377 小时前
纯前端 PDF 双面打印避坑指南:翻页顺序错了整个白印?
前端·javascript·vue.js