Skip to content

CInputPercent

Ô nhập phần trăm, có sẵn dấu % ở cuối ô: gõ dấu phẩy hay dấu chấm thập phân đều được, ô hiển thị 12,5 theo quy ước Việt Nam, giới hạn số chữ số lẻ, và kẹp giá trị vào khoảng [min, max] khi rời ô.

Dùng khi: thuế suất, chiết khấu, tỉ lệ hoàn thành, phần trăm hoa hồng.

Không dùng khi: số tiền (CInputCurrency) hoặc số đếm (CInputNumber).

Giá trị là chuỗi

ts
const rate = ref<string>('12.5')
Kiểu modelstring — ô rỗng là ''
Người dùng gõ12,5 hoặc 12.5
Người dùng thấy12,5
Model'12.5' — luôn dùng dấu chấm

Model là chuỗi, không phải số — để giữ được những gì người dùng đang gõ dở ("12.", "12.50"). Khác với CInputCurrency vốn trả về số.

Dấu phẩy chỉ có ở phần hiển thị, model luôn dùng dấu chấm — tầng gọi API không phải đổi dấu, chỉ cần chuyển sang số khi gửi lên backend:

ts
await api('/orders', { method: 'POST', body: { ...model, rate: Number(model.rate) } })

Chuỗi rỗng nghĩa là chưa nhập — đừng đổi thành 0, hai thứ đó khác nhau về nghiệp vụ. Người dùng mới gõ dấu (-, ,) mà chưa có chữ số rồi rời ô thì ô cũng trở về rỗng.

Giới hạn và làm tròn

vue
<CInputPercent v-model:value="discount" :min="0" :max="30" :precision="1" />
PropMặc địnhTác dụng
min0Nhập nhỏ hơn → kẹp về min khi rời ô. Âm thì cho gõ dấu -
max100Nhập lớn hơn → kẹp về max khi rời ô
precision2Số chữ số thập phân giữ lại, cắt ngay khi gõ

Việc kẹp xảy ra lúc rời ô, không phải lúc gõ — người dùng gõ xong con số của họ rồi mới thấy giá trị được chỉnh, tránh cảm giác bị "giật" số khi đang nhập.

Số âm

Mặc định min0 nên dấu - bị bỏ ngay khi gõ. Tỉ lệ có thể âm (tăng trưởng, chênh lệch so với kế hoạch) thì đặt min âm:

vue
<CInputPercent v-model:value="growth" :min="-100" :max="1000" />
  • Chỉ giữ một dấu - ở đầu số; gõ - ở giữa hay cuối số thì bị bỏ.
  • Model vẫn là chuỗi dấu chấm: gõ -12,5'-12.5'.
  • Ô có min âm dùng bàn phím thường trên điện thoại (inputmode="text"), vì bàn phím số của iOS không có phím -. Ô còn lại giữ bàn phím số.

API

Props

TênKiểuMặc địnhMô tả
valuestring | number | nullundefinedv-model:value — phần trăm dạng chuỗi dấu chấm thập phân (`'12.5'`), giữ phần đang gõ dở (`'12.'`, `'12.50'`). Ô hiển thị bằng dấu phẩy (`12,5`).
minnumber0Giá trị nhỏ nhất; nhập nhỏ hơn sẽ bị kẹp về đây. Âm (vd `-100`) thì ô cho gõ dấu `-` ở đầu.
maxnumber100Giá trị lớn nhất; nhập lớn hơn sẽ bị kẹp về đây.
precisionnumber2Số chữ số thập phân giữ lại.

Sự kiện

TênPayloadMô tả
update:value[val: string]v-model:value — chuỗi dấu chấm (gõ `12,5` → `'12.5'`); khi blur kẹp [min, max], chỉ có dấu thì về `''`.
blur[e: FocusEvent]Rời khỏi ô nhập (sau khi đã kẹp và làm tròn).

Thuộc tính khác của a-input được chuyển tiếp: placeholder, disabled, size, addon-after

Lưu ý

  • Ô đã có sẵn dấu % ở cuối: đừng ghi thêm (%) vào nhãn hay đặt addon-after="%", sẽ thành hai dấu %. Cần đơn vị khác (vd %/năm) thì truyền suffix.
  • Ô không có dấu ngăn nghìn: dấu phẩy và dấu chấm đều là dấu thập phân (gõ 1.5 thấy 1,5), khác với CInputCurrency dùng dấu chấm để ngăn nghìn. Gõ nhiều dấu thì chỉ dấu đầu tiên được giữ.
  • Khoảng hợp lệ đặc thù nghiệp vụ (ví dụ chiết khấu tối đa 30%) vẫn phải kiểm ở backend: max chỉ chặn trên giao diện.

Liên quan