Vue2 輸入元件優化實戰:讓使用者只能輸入整數
遇到的問題
最近做管理系統時,碰到一個很常見的需求:某些設定欄位只能輸入整數,不能有小數點。聽起來很簡單,但實際做下去要考慮的東西還不少。
主要是不想為了這個小功能又寫一個新元件,希望能在現有的 editInput.vue 上加個開關就搞定。
解決方案
1. 在元件裡加個開關
在原本的 props 加一個 isIntegerOnly 參數:
props: {
// 其他屬性...
isIntegerOnly: {
type: Boolean,
default: false,
required: false,
},
}
這樣就能決定這個輸入框是「純整數模式」還是「一般模式」。
2. 根據模式做不同的驗證
在處理輸入和送出時,用條件判斷決定要怎麼檢查:
changeCurrentValue() {
if (this.isIntegerOnly) {
// 整數模式:只允許輸入整數
} else {
// 一般數字的處理邏輯
}
}
3. 給使用者友善的錯誤提示
當使用者輸入不符合規定時,立刻跳出提示:
submit() {
if (this.isIntegerOnly) {
if (
this.currentValue === '' ||
isNaN(Number(this.currentValue)) ||
!Number.isInteger(Number(this.currentValue)) ||
(this.currentValue.toString().includes('.') &&
parseFloat(this.currentValue) !== parseInt(this.currentValue, 10))
) {
this.warnText = '請輸入有效的整數';
this.warnShow = true;
return;
}
}
// 其他驗證...
}
4. 使用起來超簡單
在要用的地方,只要加個 :isIntegerOnly="true":
<edit-input
:unit="scope.row.unitName"
@submit="updateAction(scope.row, scope.$index)"
:min="0"
:digits="0"
:isIntegerOnly="true"
v-model="scope.row.minValue"
/>
為什麼這樣設計?
一開始也想過要不要另外寫一個專門處理整數的元件,但後來覺得在現有元件加開關更好:
- 省事:不用維護兩套類似的程式碼
- 一致性:介面和行為一樣,使用者比較不會搞混
- 好擴充:以後要加其他限制,加個參數就行
用 if-else 處理不同模式,在 Vue2 裡特別好用,不用搞複雜的元件結構,效能也比較好。
實際效果
- 資料品質變好:不會再有奇怪的小數點跑進設定
- 使用者體驗提升:輸入錯誤馬上知道,不用等送出才發現
- 程式碼更乾淨:一個元件處理多種情況
- 維護更輕鬆:改 bug 或加功能只要改一個地方
心得
- 能擴充就不要重寫:先想想能不能在現有元件加開關,通常比重寫一個省事。
- 使用者體驗很重要:即時的錯誤提示差很多,使用者不用一直猜哪裡打錯。
- 模組化設計:一個元件職責清楚,要改東西就很容易。
這種做法在 Vue2 + Element UI 的專案很實用。以後要加其他限制(只能輸入正數、限制位數等),用同樣方式加個參數就搞定。