imask 可直接初始化实现输入框实时格式化,无需手动监听事件;关键在于正确配置 mask 选项,如电话用 '(000) 000-0000',信用卡用 '0000 0000 0000 0000',中文金额需设 radix: ',' 和 thousandsseparator: ' ',取值用 unmaskedvalue,切换掩码须 destroy 后重建。

直接用 IMask 初始化输入框就能实现实时格式化,不需要监听 input 事件或手动处理光标——这是最常被误以为“必须自己写逻辑”的地方。
初始化时传入正确 mask 配置
关键不是“怎么绑定”,而是“传什么配置”。mask 选项决定格式行为,不同场景对应不同掩码类型:
- 电话号码:用字符串模式,如
mask: '(000) 000-0000',其中0匹配任意数字 - 信用卡号:同样用模式,但注意空格位置,如
mask: '0000 0000 0000 0000',lazy: false可让占位符始终显示 - 带国家码的电话:支持动态前缀,如
mask: '+{86} (000) 0000-0000',{86}是固定字面量,不会被用户覆盖 - 纯数字输入(如金额):必须用
mask: Number,否则无法正确处理小数点、千分位等
数字掩码必须显式配置 radix 和 thousandsSeparator
默认情况下,mask: Number 使用英文习惯(小数点为 .,千分位为 ,)。如果项目面向中文用户,不改就会出问题:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 输入
1000.5显示为1,000.50—— 正确但不符合国内习惯 - 想显示成
1 000,50(空格分隔、逗号作小数点),就得写:radix: ','和thousandsSeparator: ' ' - 漏掉
scale会导致小数位不固定,比如用户输100后按回车,后端收到的是100而非100.00
值同步问题:unmaskedValue 才是你要存的字段
表单提交或 API 请求时,千万别直接取 input.value —— 它是格式化后的字符串(如 (123) 456-7890),后端通常无法解析。
- 要获取原始数字,用
mask.unmaskedValue(如电话号变成1234567890) - 要设置初始值(比如编辑已有数据),别赋给
input.value,而是设mask.unmaskedValue = '1234567890',否则格式错乱 - 如果外部 JS(比如 Vue 的响应式更新)直接改了
input.value,控制台会报"Element value was changed outside of mask",这时必须立刻调用mask.updateValue()
动态切换掩码时不能只改 mask 配置
比如根据下拉框选中项,在「手机号」和「座机号」之间切换掩码,不能简单重写 mask.mask 属性。
- 必须先
mask.destroy(),再用新配置重新IMask(input, newOptions) - 或者更稳妥:销毁旧实例,清空 input 值,再新建;否则残留状态可能导致光标跳、输入卡顿
- 尤其注意
unmaskedValue在切换前后是否一致——座机可能允许带横线,手机号则必须纯数字,不做校验容易埋坑
最易忽略的一点:imask 不处理粘贴内容的合法性校验。用户粘贴 abc123 进去,它只会过滤掉字母,留下 123,但不会阻止这个行为本身。真要强校验,得配合 onAccept 回调或提交前检查 unmaskedValue 长度/正则。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










