首页 > 其他分享 >vue input数据动态脱敏

vue input数据动态脱敏

时间:2022-11-14 17:22:06浏览次数:52  
标签:el vue const value slice ind 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();
        }
      });
    },

 

标签:el,vue,const,value,slice,ind,input,脱敏
From: https://www.cnblogs.com/niuyourou/p/16889631.html

相关文章

  • 【Vue-05】修改Vue的默认配置
    修改Vue的默认配置Vue脚手架隐藏了所有webpack相关的配置,若想查看具体的webpack配置,请执行:vueinspect>output.js,若要个性化配置Vue脚手架,就需要创建vue.config.js这一......
  • Vue3.0中如何监听props方法
    exportdefaultdefineComponent({ props:{  isOpen:Boolean, }, emits:{  "close-modal":null, }, setup(props,context){  watch(......
  • Vue使用第三方库(Swiper 轮播图)
    使用库之前肯定是先安装库:(tips:指定版本可以在后面加上@8.4.4)cnpminstall--saveswiper这种方式可以将库保存到package.json中:  然后就是使用:首先是引......
  • vue
    一、vue核心1、vue简介1.1、vue概念动态构建用户界面的渐进式JavaScript框架1.2、vue特点采用组件化模式,提高代码复用率、且让代码更好维护 声明式编码,让编码人员......
  • Vue生命周期
    Vue生命周期有四个阶段,八个函数:beforeCreate(){console.log("beforeCreate:创建之前")},created(){console.log("created:创建完成")},beforeMo......
  • Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构
    在前一篇文章中分享了搭建组件库的基本开发环境、创建了foo组件模块和组件库入口模块,本文分享组件库的样式架构设计。1常见的CSS架构模式常见的CSS架构模式有很多......
  • Vue通过事件交互将数据从子组件传递到父组件
    首先有两个组件:父组件:App.vue子组件:ComponentForOne.vue<template><imgalt="Vuelogo"src="./assets/logo.png"><!--下面使用组件:组件标签名--><......
  • vue中的几个高级概念
    混入mixins官方解释混入(mixin)提供了一种非常灵活的方式,来分发Vue组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的......
  • Vue虚拟dom是如何被创建的
    先来看生成虚拟dom的入口文件:...import{parse}from'./parser/index'import{optimize}from'./optimizer'import{generate}from'./codegen/inde......
  • vue3实战-完全掌握ref、reactive
    知道大家使用Vue3的时候有没有这样的疑惑,“ref、rective都能创建一个响应式对象,我该如何选择?”,“为什么响应式对象解构之后就失去了响应式?应该如何处理?”今天咱们就来......