vue input数据动态脱敏
页面中放两个输入框,一个绑定真实数据、一个绑定脱敏数据,仅展示脱敏数据。
<van-field v-model="person.cardNo" v-show="false" name="证件号码" label="证件号码" left-icon="coupon" placeholder="证件号码" required /> <van-field v-model="person.cardNoShow" name="证件号码" label="证件号码" left-icon="coupon" placeholder="证件号码" @input="desenInputText($event, person, 'cardNo', 'cardNoShow', 4, 6)" required />
脱敏方法,以光标为界,分输入和删除两种情况处理:
desenText(str, preNum, endNum) { let res = str || ""; const len = str.length; let pre = ""; let last = ""; pre = str.slice(0, preNum); last = str.slice(Math.max(len - endNum, preNum)); const star = Math.max(0, len - preNum - endNum); res = pre + "*".repeat(star) + last; return res; }, /**输入框动态脱敏, * el 承载真实数据与脱敏数据的对象 * key 真实数据的 key * showKey 脱敏数据的 key * **/ desenInputText(e, el, key, showKey, preNum, endNum) { if (!el) return; const ind = e.target.selectionStart - 1; let value = el[key]; const showValue = el[showKey]; const isAdd = showValue.length > value.length; const num = Math.abs(value.length - showValue.length); if (isAdd) { value = value.slice(0, ind - num + 1) + showValue.slice(ind - num + 1, ind + 1) + value.slice(ind - num + 1); } else { value = value.slice(0, ind + 1) + value.slice(ind + num + 1); } el[key] = value; el[showKey] = this.desenText(value, preNum, endNum); // 光标复位 this.$nextTick(() => { const elem = e.target; if (elem.setSelectionRange) { // 标准浏览器 elem.setSelectionRange(ind + 1, ind + 1); } else { // IE9- const range = elem.createTextRange(); range.moveStart("character", ind + 1); range.moveEnd("character", ind + 1); range.select(); } }); },
当你看清人们的真相,于是你知道了,你可以忍受孤独
分类:
JS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?