element-plus中,vue3项目,el-input密码框禁止浏览器自动弹出浏览器历史密码提示框

原代码(密码框是text框):

<el-form-item label="用户名" :label-width="formLabelWidth" v-if="!localOrhuawei" prop="userName">
          <el-input v-model="formDialog.userName" />
        </el-form-item>
        <el-form-item label="密码" :label-width="formLabelWidth" v-if="!localOrhuawei" prop="passWord">
          <el-input v-model="formDialog.passWord" />
        </el-form-item>

现加需求:el-input改为密码框,但要求el-input密码框禁止浏览器自动弹出浏览器历史密码提示框

<el-form-item label="用户名" :label-width="formLabelWidth" v-if="!localOrhuawei" prop="userName">
          <el-input v-model="formDialog.userName" />
        </el-form-item>
        <el-form-item label="密码" :label-width="formLabelWidth" v-if="!localOrhuawei" prop="passWord">
          <el-input v-model="formDialog.passWord" show-password />
        </el-form-item>

效果:当密码有值时正常显示,当密码无值时就会自动弹出历史的用户密码列表弹框。

那如何不显示历史记录弹框呢?

想到通过v-if去控制显示密码框,代码如下:

<el-form-item label="密码" :label-width="formLabelWidth" v-if="!localOrhuawei" prop="passWord">
          <el-input  ref="passwordInput" v-model="formDialog.passWord" v-if="passwordType === 'password'" type="password" show-password autocomplete="new-password"/>
          <el-input 
            v-else
            ref="passwordInput"
            v-model="formDialog.passWord" 
            type="text"
            autocomplete="off"
          />
        </el-form-item>

import { reactive, ref, onMounted, watch,nextTick } from "vue";

const passwordType = ref('text');
const passwordInput = ref();

watch(
  () => formDialog.passWord,
  (nv,ov) => {
    if(!nv){
      passwordType.value = 'text'
    }else{
      passwordType.value = 'password'
    }
  }
);

 效果:当清空值时,确实不会再弹出浏览器的历史记录列表了,但我发现当我输入一个数字后,input框就自动失焦了,但如果再次聚焦就可以连续输入了。

根本原因分析

  1. 当密码清空时,组件从密码类型切换到文本类型(重新渲染)

  2. 输入第一个字符时触发 v-model 更新,值不为空又切换回密码类型(再次重新渲染)

  3. 每次重新渲染都会导致焦点丢失。

解决方式:在监听值改变后,修改密码框类型后,直接聚焦即可解决问题;

watch(
  () => formDialog.passWord,
  (nv,ov) => {
    if(!nv){
      passwordType.value = 'text'
    }else{
      passwordType.value = 'password'
    }
    //切换input框类型后,重新聚焦
    nextTick(() => {
      passwordInput.value?.focus()
    })
  }
);

 

您可以使用以下步骤使el-input输入框弹出历史记录框: 1. 创建一个历史记录组件,该组件可以包含以前输入的值。您可以使用v-for指令从历史记录数组中循环遍历值,并将每个值显示为下拉选项。 2.el-input组件中设置一个v-model绑定,它将存储当前输入框中的值。 3.el-input组件添加一个@focus事件监听器,该事件将触发下拉框的显示。在事件处理程序中,您可以设置下拉框的位置和显示方式。 4. 在下拉框中,您可以为每个选项添加一个@click事件监听器,当用户选择一个选项时,它将被设置为输入框的值,并将下拉框隐藏。 下面是一个简单的示例代码,可以帮助您快速入门: ```html <template> <div> <el-input v-model="inputValue" @focus="showHistory"> <el-dropdown :show="showDropdown" style="width:100%"> <el-dropdown-menu> <el-dropdown-item v-for="(item,index) in history" :key="index" @click="selectItem(item)">{{item}}</el-dropdown-item> </el-dropdown-menu> </el-dropdown> </el-input> </div> </template> <script> export default { data() { return { inputValue: &#39;&#39;, showDropdown: false, history: [&#39;value1&#39;, &#39;value2&#39;, &#39;value3&#39;] }; }, methods: { showHistory() { this.showDropdown = true; }, selectItem(item) { this.inputValue = item; this.showDropdown = false; } } }; </script> ``` 在这个例子中,我们使用了Element UI库中的el-inputel-dropdown组件。在data函数中,我们初始化了输入框的值,下拉框的显示状态和历史记录数组。在showHistory方法中,我们将下拉框的show属性设置为true,以显示下拉框。在selectItem方法中,我们将选择的项设置为输入框的值,并将下拉框隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值