最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3實現(xiàn)全局自動大寫轉(zhuǎn)換的兩種方案

 更新時間:2026年04月10日 08:48:09   作者:云吞王  
本文介紹了在Vue項目中使輸入框內(nèi)容自動轉(zhuǎn)為大寫的兩種方案:一種是自定義指令v-input-uppercase,適用于對特定輸入框進行精細化控制;另一種是全局插件,適用于全站所有輸入框,推薦使用,兩種方案均能處理中文輸入法兼容問題,合并成一個插件可同時實現(xiàn)兩個功能

做業(yè)務系統(tǒng)時,車牌號、零件號、訂單號……各種編號字段都需要大寫。后端存大寫、前端也顯示大寫,但用戶打字時往往習慣輸入小寫,每次都要等表單報錯才知道改。

與其讓用戶"試錯",不如在前端直接幫用戶轉(zhuǎn)大寫——體驗好,后端壓力也小。本文分享一套完整方案:自定義指令精準控制 + 全局插件一次搞定。

方案一:自定義指令v-input-uppercase

適合對特定輸入框做精細化控制。

創(chuàng)建指令文件

src/directives/inputUppercase.js

const globalUppercaseConfig = {
  defaultEnabled: true,
  processedInputs: new WeakSet(),
  disabledInputs: new WeakSet()
};

export default {
  mounted(el, binding) {
    const inputElement = el.querySelector('.el-input__inner')
      || el.querySelector('input')
      || el.querySelector('textarea');
    if (!inputElement) return;

    const config = binding.value || {};
    const enabled = config.enabled !== false;

    if (!enabled) {
      globalUppercaseConfig.disabledInputs.add(el);
      return;
    }
    if (globalUppercaseConfig.processedInputs.has(el)) return;
    globalUppercaseConfig.processedInputs.add(el);

    let isComposing = false;

    const toUpperCase = () => {
      if (isComposing || !inputElement.value) return;
      const oldValue = inputElement.value;
      const newValue = oldValue.toUpperCase();
      if (oldValue !== newValue) {
        inputElement.value = newValue;
        inputElement.dispatchEvent(new Event('input', { bubbles: true }));
      }
    };

    if (inputElement.value) toUpperCase();
    inputElement.addEventListener('input', toUpperCase);
    inputElement.addEventListener('paste', () => setTimeout(toUpperCase, 10));
    inputElement.addEventListener('compositionstart', () => { isComposing = true; });
    inputElement.addEventListener('compositionend', () => {
      isComposing = false;
      setTimeout(toUpperCase, 10);
    });

    el._toUpperCase = toUpperCase;
    el._inputElement = inputElement;
  },

  beforeUnmount(el) {
    if (el._inputElement && el._toUpperCase) {
      el._inputElement.removeEventListener('input', el._toUpperCase);
      el._inputElement.removeEventListener('paste', el._toUpperCase);
    }
    globalUppercaseConfig.processedInputs.delete(el);
  }
};

export { globalUppercaseConfig };

注冊指令

// src/main.js
import uppercase from './directives/inputUppercase.js'

app.directive('input-uppercase', uppercase)

使用

<!-- 自動大寫 -->
<el-input v-model="plateNo" v-input-uppercase placeholder="請輸入車牌號" />
<!-- 某些字段不需要轉(zhuǎn)大寫 -->
<el-input v-model="name" v-input-uppercase="{ enabled: false }" />

方案二:全局插件(推薦)

一個插件,覆蓋所有 el-input / el-textarea / el-select,無需逐個添加指令。

創(chuàng)建插件文件

src/plugins/globalUppercase.js

import { globalUppercaseConfig } from '../directives/inputUppercase.js';

// 排除某些頁面(如登錄頁不需要大寫)
const globalUppercasePluginConfig = {
  excludedPaths: ['/home/login', '/qp/tableModuSet']
};

export const GlobalUppercasePlugin = {
  install(app) {
    app.mixin({
      mounted() {
        this.$nextTick(() => {
          if (!this.$el || typeof this.$el.querySelectorAll !== 'function') return;

          const currentPath = window.location.hash || window.location.pathname;
          if (globalUppercasePluginConfig.excludedPaths.some(p => currentPath.includes(p))) return;

          const applyTo = (el) => {
            if (globalUppercaseConfig.processedInputs.has(el)) return;

            const actualInput = el.querySelector('.el-input__inner')
              || el.querySelector('input')
              || el.querySelector('textarea')
              || (['INPUT', 'TEXTAREA'].includes(el.tagName) ? el : null);
            if (!actualInput) return;

            let isComposing = false;
            const toUpperCase = () => {
              if (isComposing || !actualInput.value) return;
              const newVal = actualInput.value.toUpperCase();
              if (actualInput.value !== newVal) {
                actualInput.value = newVal;
                actualInput.dispatchEvent(new Event('input', { bubbles: true }));
              }
            };

            if (actualInput.value) toUpperCase();
            actualInput.addEventListener('input', toUpperCase);
            actualInput.addEventListener('paste', () => setTimeout(toUpperCase, 10));
            actualInput.addEventListener('compositionstart', () => { isComposing = true; });
            actualInput.addEventListener('compositionend', () => {
              isComposing = false;
              setTimeout(toUpperCase, 10);
            });

            globalUppercaseConfig.processedInputs.add(el);
            el._toUpperCase = toUpperCase;
            el._inputElement = actualInput;
          };

          // 處理 el-input
          this.$el.querySelectorAll('.el-input').forEach(applyTo);
          // 處理 el-textarea
          this.$el.querySelectorAll('.el-textarea').forEach(applyTo);

          // 處理 el-select(搜索模式下的輸入框)
          this.$el.querySelectorAll('.el-select').forEach(el => {
            const selectInput = el.querySelector('.el-select__input');
            if (selectInput) applyTo(selectInput);
          });
        });
      },

      beforeUnmount() {
        if (!this.$el) return;
        this.$el.querySelectorAll('.el-input, .el-textarea, .el-select').forEach(el => {
          if (el._inputElement && el._toUpperCase) {
            el._inputElement.removeEventListener('input', el._toUpperCase);
            el._inputElement.removeEventListener('paste', el._toUpperCase);
          }
          globalUppercaseConfig.processedInputs.delete(el);
        });
      }
    });
  }
};

export { globalUppercasePluginConfig };

注冊插件

// src/main.js
import { GlobalUppercasePlugin } from './plugins/globalUppercase.js'

app.use(GlobalUppercasePlugin)

完成! 全站所有輸入框自動大寫,用戶輸入 abc123 → 直接顯示 ABC123。

兩種方案對比

自定義指令全局插件
適用范圍單個輸入框全站
控制粒度精準全局 + 路徑排除
支持組件el-input / input / textareael-input / el-textarea / el-select
注冊方式app.directive()app.use()

和單引號禁止方案的對比

單引號禁止大寫轉(zhuǎn)換
核心操作replace(/'/g, '') 刪除toUpperCase() 轉(zhuǎn)換
行為輸入時被阻止輸入后自動轉(zhuǎn)換
默認觸發(fā)時機input + blurinput
特殊處理中文輸入法中文輸入法

兩套方案代碼結(jié)構(gòu)幾乎一致,如果你兩個功能都要,完全可以合并成一個插件,通過配置項切換行為。

合并成一套插件

export const GlobalInputFilterPlugin = {
  install(app, options = {}) {
    const { mode = 'uppercase' } = options; // 'uppercase' | 'noQuote' | 'both'

    app.mixin({
      mounted() {
        this.$nextTick(() => {
          // ...統(tǒng)一的處理邏輯
          const transform = (val) => {
            if (mode === 'uppercase') return val.toUpperCase();
            if (mode === 'noQuote') return val.replace(/'/g, '');
            if (mode === 'both') return val.toUpperCase().replace(/'/g, '');
            return val;
          };
          // ...
        });
      }
    });
  }
};

// 使用
app.use(GlobalInputFilterPlugin, { mode: 'both' })

總結(jié)

  • 全局覆蓋 → 插件 app.use() 一次搞定
  • 局部控制 → 指令 v-input-uppercase 精準禁用
  • 兩個功能都要 → 合并成一個插件,mode 參數(shù)切換
  • 中文輸入法兼容,始終是標配

以上就是Vue3實現(xiàn)全局自動大寫轉(zhuǎn)換的兩種方案的詳細內(nèi)容,更多關于Vue3全局自動大寫轉(zhuǎn)換的資料請關注腳本之家其它相關文章!

相關文章

  • 一文詳解Vue.js與TypeScript的生命周期

    一文詳解Vue.js與TypeScript的生命周期

    Vue與TypeScript的結(jié)合使得開發(fā)大型應用變得更加容易和高效,本文將詳細探討Vue.js組件中TypeScript的應用,特別是它的生命周期鉤子函數(shù),并通過豐富的示例,為你提供一個實戰(zhàn)指南,需要的朋友可以參考下
    2023-11-11
  • Vue 2中ref屬性的使用方法及注意事項

    Vue 2中ref屬性的使用方法及注意事項

    這篇文章主要給大家介紹了關于Vue 2中ref屬性的使用方法及注意事項的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • vue中使用element ui的input框?qū)崿F(xiàn)模糊搜索的輸入框

    vue中使用element ui的input框?qū)崿F(xiàn)模糊搜索的輸入框

    這篇文章主要介紹了vue中使用element ui的input框?qū)崿F(xiàn)模糊搜索的輸入框,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • vue項目中極驗驗證的使用代碼示例

    vue項目中極驗驗證的使用代碼示例

    這篇文章主要介紹了vue項目中極驗驗證的使用代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • vue?cli?局部混入mixin和全局混入mixin的過程

    vue?cli?局部混入mixin和全局混入mixin的過程

    這篇文章主要介紹了vue?cli?局部混入mixin和全局混入mixin的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Vue中img的src屬性綁定與static文件夾實例

    Vue中img的src屬性綁定與static文件夾實例

    本篇文章中主要介紹了Vue中img的src屬性綁定與static文件夾實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-05-05
  • 學習vue.js表單控件綁定操作

    學習vue.js表單控件綁定操作

    這篇文章主要和大家一起學習vue.js表單控件綁定操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解Vue-router嵌套路由

    詳解Vue-router嵌套路由

    這篇文章主要為大家介紹了Vue-router的嵌套路由,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 使用watch監(jiān)聽對象里面值的變化

    使用watch監(jiān)聽對象里面值的變化

    這篇文章主要介紹了使用watch監(jiān)聽對象里面值的變化,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue項目調(diào)試的三種方法總結(jié)

    vue項目調(diào)試的三種方法總結(jié)

    這篇文章主要給大家總結(jié)介紹了關于vue項目調(diào)試的三種方法,大家可以根據(jù)需要選擇調(diào)試方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-09-09

最新評論

红安县| 静宁县| 汉中市| 睢宁县| 林芝县| 玉树县| 什邡市| 六盘水市| 山丹县| 昭觉县| 贵定县| 从化市| 梅河口市| 宝山区| 吐鲁番市| 甘孜| 旅游| 普格县| 伊春市| 平乡县| 甘孜县| 定襄县| 资阳市| 葵青区| 靖西县| 河间市| 黑河市| 五指山市| 新竹县| 衡东县| 绵阳市| 嘉峪关市| 新密市| 望谟县| 卓尼县| 杭州市| 彭山县| 大英县| 祁阳县| 西充县| 电白县|