身份证号脱敏的正确实现

Uni-app / Vue 中身份证号脱敏的正确实现

一、业务背景说明

在医疗、政务、金融等小程序场景中,身份证号属于强隐私数据。常见的产品要求是:

  • 页面展示时 不能明文显示完整身份证号
  • 通常规则为:前 6 位 + 后 4 位可见,中间用 * 替代
  • 点击、提交、接口交互时仍使用原始完整数据

因此,前端的核心任务只有一个:

展示层脱敏,不影响原始数据结构

本文基于你当前的 uni-app + Vue2 项目,不做任何封装,只讲清楚「为什么错」「应该怎么写」「每种写法适合什么场景」。


二、最容易犯的错误

错误 1:直接在模板里对非字符串使用 slice

vue 复制代码
{{ doctor.id_card_no.slice(0,6) }}
问题原因
  • 后端返回的 id_card_no 可能是 number
  • slice 只存在于 String / Array

运行时就会报错:

复制代码
TypeError: e.slice is not a function

错误 2:把"带参数的函数"写进 computed

js 复制代码
computed: {
  maskIdCard(id) {
    return id.slice(0,6) + '****' + id.slice(-4)
  }
}

模板中使用:

vue 复制代码
{{ maskIdCard(item.id_card_no) }}
问题原因(非常关键)
  • computed 不是函数工具区
  • computed 本质是:基于响应式状态的属性
  • Vue 不会把它当成 methods 处理

最终就会报错:

复制代码
TypeError: e.maskIdCard is not a function

三、正确做法一:methods(最推荐、最直观)

methods 中定义脱敏函数

js 复制代码
methods: {
  maskIdCard(id) {
    // 1. 空值保护
    if (id === null || id === undefined) return '';

    // 2. 强制转字符串(关键)
    const str = String(id);

    // 3. 长度不足直接返回
    if (str.length <= 8) return str;

    // 4. 身份证标准脱敏规则
    return (
      str.slice(0, 6) +
      '*'.repeat(str.length - 10) +
      str.slice(-4)
    );
  }
}

模板中直接调用

vue 复制代码
<view class="name1">
  {{ maskIdCard(doctor.id_card_no) }}
</view>

优点

  • 写法直观,符合直觉
  • 支持传参
  • 不依赖响应式缓存
  • 非常适合「工具函数」

结论:带参数的展示逻辑 = methods


四、正确做法二:computed(仅限"当前就诊人")

如果页面只展示 一个固定对象 (例如 selectedPatient),可以用 computed。

computed 写法

js 复制代码
computed: {
  maskedIdCard() {
    const id = this.selectedPatient?.id_card_no;
    if (!id) return '';

    const str = String(id);
    if (str.length <= 8) return str;

    return (
      str.slice(0, 6) +
      '*'.repeat(str.length - 10) +
      str.slice(-4)
    );
  }
}

模板使用

vue 复制代码
<view class="name1">
  {{ maskedIdCard }}
</view>

限制说明

  • 不能传参
  • 不适合列表
  • 只适合「单对象展示」

五、列表场景为什么一定要用 methods

真实场景:

vue 复制代码
<pationsCard
  v-for="item in pationsList"
  :cardId="maskIdCard(item.id_card_no)"
/>

原因只有一句话:

computed 不能根据不同 item 动态计算

列表中:

  • 每一项都是不同身份证号
  • 每次渲染都需要传参

只能用 methods


六、最终推荐规范(非常重要)

场景 正确位置
列表身份证脱敏 methods
单个当前用户展示 computed
传参的展示逻辑 methods
工具型字符串处理 methods

七、一句话总结

在 Vue / Uni-app 中,computed 用于"状态派生值" ,methods 用于"带参数的展示逻辑" 。身份证号脱敏本质是字符串处理工具函数,在列表与组件参数中使用时,只能也必须写在 methods 中。

相关推荐
anyup_前端梦工厂1 小时前
将uni-app工程迁移uni-app x,AI 能帮我们做什么?
前端·人工智能·uni-app
凌云若寒2 小时前
BarTender官网下载打印机驱动
运维·服务器·前端·网络·产品经理
zd8451015002 小时前
基于 HTML 与 Modbus TCP 构建设备仪器上位机:可行性分析与代码结构设计
前端·tcp/ip·html
顽疲2 小时前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
Amumu121382 小时前
NodeJs介绍
前端·node.js
咧咧小侠2 小时前
Windows Codex 连接 Chrome 失败:一次 nodeRepl.fetch 报错排查记录
前端·chrome
Eider19982 小时前
大模型输出格式幻觉解决思路
开发语言·前端·javascript
广州智造2 小时前
Radioss时间步长(Time Step)
前端·设计·cad·建模·cae·radioss
志尊宝3 小时前
Vue3 零基础每日笔记(085):项目上线前 Checklist——环境变量、报错监控、安全自查
前端·javascript·笔记·安全·信息可视化·echarts
朱涛的自习室3 小时前
我让 Gemini 4 当高管、DeepSeek 当员工,开了一家软件公司(Day 1)
android·前端·人工智能