返回

Vuetify密码框标签重叠及自动赋值admin问题解决

vue.js

Vuetify 中密码字段标签重叠问题解决指南

使用前端框架构建用户界面可以有效提升效率。Vuetify 作为基于 Vue.js 的流行组件库,提供了丰富的 UI 组件。 在使用 Vuetify 的 v-text-field 构建登录表单时,如果将密码输入框类型设置为 password, 可能会遇到密码字段标签与其他字段的文字重叠问题,且字段会自动赋值'admin'字符串,这一现象往往让人费解。

问题原因剖析

此问题源于浏览器的自动填充行为。浏览器会尝试自动填充已保存的用户名和密码。自动填充机制的逻辑在不同浏览器间有细微的差异,在处理表单信息时可能存在异常。开发过程中可能会出现类似“admin”的密码字符串和字段重叠。 经过问题排查发现,这个'admin'的密码信息恰巧是用户之前开发一个网站时配置并储存在了浏览器中。

因此,推测,浏览器的自动填充机制将之前开发的站点的密码字符串错误的关联到了本次开发的站点登录组件,出现了信息错配,进而出现label文字重叠的情况。
因为浏览器尝试将此信息自动填充到字段中,但在应用了 v-text-field 特定的样式和布局逻辑之后,其行为和外观发生了变化,最后出现字段重叠的效果。

解决方案详解

针对此问题,有多种可行的解决方法:

方案一:禁用浏览器的自动填充功能

可以给表单中,每一个 v-text-field 都加上autocomplete="off"的属性来避免。在某些浏览器中,为了阻止密码被填充可能off也还不行,此时可能需要一个随机字符串代替这个off来达成目的。最方便的方法是设置autocomplete="new-password"

操作步骤:

  1. 定位到 v-text-field 组件的代码。
  2. v-text-field 标签中添加 autocomplete="new-password" 属性。
  3. 同时, 移除type='password' 属性, 将由Vuetify提供的显隐图标自动识别此v-text-field是password字段

代码示例:

<template>
  <v-form>
    <v-container>
      <v-text-field 
        label="E-mail"
        v-model="email"
        autocomplete="new-password"
        >
      </v-text-field>
      <v-text-field
        label="Password"
        v-model="password"
        autocomplete="new-password"
        
        >
      </v-text-field>
      <v-btn 
        color="blue" 
        @click="login()"
      >Submit
      </v-btn>
    </v-container>
    <pre>
    {{ $data}}
  </pre>
  </v-form>
</template>

<script>
  import firebase from 'firebase'
  export default {
    data() {
      return {
        email: '',
        password: ''
      }
    },
    methods: {
      login(){
        firebase.auth().signInWithEmailAndPassword(this.email, this.password)
          .then(user => console.log('User connected'), error => console.log(error))
      }
    }
  }
</script>

原理说明:

autocomplete="new-password" 告诉浏览器不要尝试记住这个值, 如果没有此设置, 一旦Vuetify组件初始化后设置了它的值, label会自动地移动位置并避开, 而由于组件本身初始的样式问题, 在Vuetify应用它的效果之前自动填充的值仍然出现在输入框中并无法去除, 最终显示结果就是一个值填在了另一个值上面。 启用 autocomplete="new-password"属性,使组件能主动阻止浏览器针对输入框内容进行关联或者错误识别并自动填充, 这是更准确且通用的方法。

方案二:清除浏览器自动填充数据

直接清理浏览器的自动填充设置也可以规避这个问题。

操作步骤:

不同的浏览器有不同的操作,这里用谷歌Chrome举例:

  1. 打开 Chrome 浏览器。
  2. 点击右上角的三个垂直点,选择“设置”。
  3. 在左侧导航栏中,选择“自动填充”。
  4. 点击“密码”或“地址和其他信息”。
  5. 查找并删除错误的自动填充数据或清除所有相关数据。

原理说明:

删除对应的自动填充数据直接删除导致错误数据的根本原因,也是最为彻底地解决方案,避免今后在各种可能的应用中都继续触发自动填充。

方案三:使用表单的autocomplete属性(不是太推荐)

此方法与第一个方案同理, 把autocomplete直接设置到表单form层面上。 但是要注意的是, 此属性并不被所有的浏览器支持, 所以兼容性不是最佳选择。

操作步骤:

  1. v-form 标签添加 autocomplete="off"

代码示例:

<template>
  <v-form autocomplete="off">
      <!-- 其余代码同上一个代码例子, 在这里不再赘述-->
  </v-form>
</template>

原理说明:

同理于对一个一个标签添加 autocomplete, 但是一次性直接为所有表单添加此属性. 但要注意其浏览器支持情况并不理想, 所以更推荐为v-text-field标签单独添加autocomplete属性.

总结

在使用Vuetify过程中遇到密码框问题。问题的根源在于浏览器的自动填充机制,而不是Vuetify本身。可以选择关闭自动填充或者删除浏览器自动填充信息解决这个问题。 使用 autocomplete="new-password" 是相对较为常用的处理方案。通过采用这些策略, 用户体验能得到保证,信息展示问题得到妥善处理。