【vue2+uniapp】密码框输入密码显示和隐藏小功能(两种方法实现)

该文章展示了如何在Vue.js应用中通过切换类名或图片路径来实现输入框密码显示与隐藏的效果。通过数据绑定和事件监听,当点击眼睛图标时,可以改变密码输入框的可见状态,同时更新图标的状态以反馈当前密码是否可见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、通过切换类名实现

1.html布局

<view class="content">
      <view class="label">请输入退款密码</view>
      <input v-model="params.pwd" placeholder="退款密码" :password="openPassword"/>
      <view :class="[!openPassword ? 'psd-eye-active' : 'psd-eye']" @click="changePassword"></view>
</view>

2.样式部分(自己看着写)

.content{
    position:relative;
.psd-eye-active{
        width: 45rpx;
        height: 45rpx;
        background:url(../../../static/login/icon_turn.png) no-repeat center center;
        position: absolute;
        right: 50rpx;
        top: 50%;
        z-index:10;
    }
.psd-eye{
        width: 45rpx;
        height: 45rpx;
        background:url(../../../static/login/eye.png) no-repeat center center;
        position: absolute;
        right: 50rpx;
        top: 50%;
        z-index:10;
    }
}

3.功能部分

<script>
    data() {
            return {
                openPassword: true
            }
        },
    methods: {
        changePassword() {
             this.openPassword = !this.openPassword;
             }
        }
</script>

二、通过图片路径切换

1.html布局

<view class="content">
      <view class="label">请输入退款密码</view>
      <input v-model="params.pwd" placeholder="退款密码" :password="openPassword"/>
      <image class="psd-eye" :src="psdUrl"  mode="aspectFill" @click="changePassword"></image>
</view>

2.样式部分(自己看着写)

.content{
    position:relative;
.psd-eye{
    width: 45rpx;
    height: 45rpx;
    position: absolute;
    right: 50rpx;
    top: 55%;
    z-index:10;
   }
}

3.功能部分

<script>
    data() {
            return {
                openPassword: true,
                psdUrl:'../../../static/login/eye.png'
            }
        },
    methods: {
        changePassword() {
             this.openPassword = !this.openPassword;
             if(this.openPassword){
                    this.psdUrl = '../../../static/login/eye.png'
                }else{
                    this.psdUrl = '../../../static/login/icon_turn.png'
                }
             }
        }
</script>

展示图

<think>好的,我现在需要帮用户在UniApp实现输入框中间部分文字加密的效果。首先,用户的需求是在输入时,中间的内容被加密,比如显示星号,而开头结尾保持可见。这种效果常见于某些需要部分隐藏敏感信息的场景,比如信用卡号显示为1234****5678。 首先,我需要考虑UniApp中的输入框组件。UniApp通常使用原生组件如input或textarea,但可能更推荐使用uView的组件,因为引用[1]提到uView的pickeractionSheet可以帮助实现表单解决方案。所以用户可能已经在使用uView的组件,比如u-input。 接下来,要实现中间加密,可能需要处理输入的内容,实时替换中间部分为星号,同时保留原始数据。但直接修改输入框的值会导致光标位置问题,因为每次输入都会触发替换,光标可能会跳到末尾。这会影响用户体验,特别是当用户需要编辑中间部分时。 所以,可能的解决方法是使用两个变量:一个存储原始数据(rawValue),另一个存储处理后的显示值(displayValue)。当用户输入时,捕获原始值,处理后显示加密后的字符串。同时,保持光标位置可能需要计算,但在小程序或H5环境中,直接操作光标可能比较困难,可能需要借助组件的selection-startselection-end属性,但需要测试兼容性。 处理逻辑方面,当用户输入时,监听input事件,获取输入值,保存到rawValue。然后处理该值:如果长度小于等于2,直接显示;否则,保留前两位后两位,中间替换为星号。例如,输入"123456"会变成"12**56"。然后将处理后的字符串赋给displayValue,用于输入框显示。 但这里有个问题,输入框绑定的是displayValue,用户输入时,实际输入的是原始值,但显示的是处理后的值。这可能导致输入时的显示与实际值不一致,需要确保在每次输入时更新rawValue,并同步处理displayValue。同时,当用户尝试编辑中间部分时,由于显示的是星号,可能无法直接编辑,需要进一步处理,比如在用户聚焦时显示原始值,失去焦点时再加密。但这样会增加复杂度,可能影响用户体验。 另一种方法是使用文本覆盖,比如在输入框上方覆盖一个显示加密效果的视图,而实际输入框隐藏或透明,但这样需要处理点击事件输入同步,可能更复杂。 考虑到实现难度用户体验,可能第一种方法更可行,但需要处理光标问题。或者,用户可能接受只能在末尾输入,中间部分自动加密。这种情况下,可以实时替换中间部分,但需要确保原始数据正确存储,用于提交表单。 另外,引用[1]提到的uView组件可能有相关的属性或插槽可以自定义显示内容,需要查阅uView的文档,看看是否有类似mask功能或自定义格式化输入的支持。如果有,可以直接使用uView的组件特性来实现,否则需要自行处理。 最后,代码部分需要绑定input事件,处理值的变化,并维护两个变量。同时,可能需要使用v-model的双向绑定,或者手动管理输入框的值事件。在UniApp中,可能需要使用@input事件:value绑定来实现。 测试时需要注意不同平台的兼容性,比如小程序H5中的输入框行为可能不同,尤其是在处理光标位置时。可能需要使用nextTick来尝试保持光标位置,但实际效果需验证。 总结步骤: 1. 使用uView的u-input组件。 2. 创建rawValuedisplayValue变量。 3. 在input事件处理函数中,更新rawValue,并生成displayValue。 4. 将displayValue绑定到输入框显示值。 5. 提交表单时使用rawValue的真实数据。 6. 处理光标位置问题,可能需要忽略或寻找解决方案。 可能存在的问题: - 用户无法编辑中间部分,因为显示的是星号。 - 光标跳转问题影响输入体验。 - 不同平台的表现不一致。 因此,可能需要权衡需求,如果用户必须能够编辑中间部分,可能需要更复杂的方案,比如分段输入或使用多个输入框。否则,当前方案可以满足基本需求。</think>### 实现 UniApp 输入框中间文字加密效果的方法UniApp实现输入时中间文字加密的效果,可以通过以下步骤结合 **数据绑定** **正则替换** 实现。以下以 `uView` 的 `u-input` 组件为例: --- #### 1. 基本实现逻辑 - **原始数据**:存储用户真实输入内容(用于表单提交)。 - **显示数据**:对中间部分加密后的内容(用于界面显示)。 - **实时转换**:通过监听输入事件,动态处理文本的加密显示。 ```vue <template> <u-input v-model="displayValue" @input="onInput" placeholder="请输入内容" /> </template> <script> export default { data() { return { rawValue: '', // 存储真实数据 displayValue: ''// 存储加密后的显示数据 }; }, methods: { onInput(value) { this.rawValue = value; // 更新真实数据 // 加密处理:保留前22位,中间替换为* if (value.length <= 4) { this.displayValue = value; // 短文本不加密 } else { const start = value.substring(0, 2); const end = value.substring(value.length - 2); this.displayValue = `${start}${'*'.repeat(value.length - 4)}${end}`; } } } }; </script> ``` --- #### 2. 提交表单时的处理 提交数据时需使用 `rawValue` 而非 `displayValue`: ```javascript submitForm() { console.log('提交的真实数据:', this.rawValue); } ``` --- #### 3. 优化用户体验 - **光标问题**:加密后光标可能跳转至末尾,可通过记录光标位置并恢复(需结合 `selection-start` 属性,但部分平台如小程序可能不支持)。 - **自定义组件**:若需更复杂交互,可封装自定义组件,结合 `<input>` 透明遮罩层实现局部隐藏效果[^1]。 --- #### 4. 其他场景扩展 - **密码输入**:直接使用 `type="password"` 属性实现隐藏。 - **分段加密**:例如手机号显示为 `138****1234`,可通过类似逻辑调整正则匹配规则。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值