前端表单输入框自动填充和覆盖逻辑的实现

简介: 本文介绍Web开发中表单联动的实现方案,针对输入框与下拉框的数据填充需求,提出两种解决思路:一是通过比对选项label判断是否覆盖,二是监听用户输入行为设置flag开关。结合Vue与Element-UI实战代码,详解如何智能控制数据填充逻辑,避免覆盖用户手动输入内容,提升表单交互体验。

目录

前言

你好,我是喵喵侠。在Web开发中,动态表单的联动操作,是非常常见的需求,尤其是在需要实现复杂逻辑时,更是不可或缺。正好我在工作中,好几次遇到了输入框内容需要被填充的需求,本文将会为你详细介绍这样的需求案例,展示具体实现的思路和实战代码。

需求描述

现在我们来探讨一个具体的需求场景:页面上有一个表单,其中包含一个公司名称输入框(input)和一个所有公司下拉菜单(select),下拉菜单的选项,比方说有腾讯、阿里巴巴、百度和字节跳动。当选中下拉菜单的某个选项时,将该选项的值,会自动填充到输入框中。但如果输入框已经有用户手动输入的值,且该值不在选项列表中,则不覆盖。

更通俗的理解就是,Input 里面有用户手动输入的内容,无论你的选择哪个,都不会覆盖用户原本输入的值,除非他全部删掉,后续的选择才会填充到 Input 里面。如果一开始用户没有输入,则每次的选中都会覆盖上一次的 Input 结果。

其实我接到真实的需求是,有一个地图弹窗,里面有一个百度地图,点击地图任意点位,地图会标点并显示该定位的位置名称,弹窗确定后,这个位置名称会被填充到 Input 输入框中。这里我为了方便理解,把地图弹窗简化成了 Select,核心功能是一样的,掌握了这个方式的实现,类似的都大同小异。

实现思路

我们来拆解下这个需求,把功能点进行拆分如下:

  1. input 为空,select 选中后自动填充;
  2. input 有值,且为用户输入,则 select 选中后不填充;
  3. input 有值,且为上次 select 填充结果,则 select 选中后覆盖填充。

自动填充很好实现,select 的 change 事件进行赋值就好了,难点在于如何判断当前的 input 的值,是用户输入的,还是 select 填充的呢?

对此我有两种解决方案:

方案一:select 选项 label比对

这个方案很好理解,就是每次 select 选中的时候,当 change 事件触发时,判断当前 input 的值,是否能与 select 的 option 选项中的某一项的 label 匹配的上,如果这个 input 值和这一项的 label 完全相等,那么可以视为这个 input 值是来自于上次的 select 选择,否则change 事件不执行覆盖填充操作。

这里有个细节,那就是存在输入的值和 select 值完全相等的情况,不过这个不影响,因为从效果上来看,都是一样的。

方案二:设置根据用户输入行为设置一个 flag 开关

这种方案和方案一的关注点不同,它不关心 option 里面有什么样的 label,而是关注这个 input 内容是不是来自用户的。要想判断其实很简单,只需要监听一下 input 事件就好了。如果 input 事件执行了,且 input 的值不为空,那么可以视为这个 input 的值是来自于用户手动输入,不能select 选中后无法覆盖,否则 select 选中后可以覆盖。

顺便说一下,粘贴文本到 input 输入框,也是可以触发 input 事件的。

具体实现

基于方案一的代码实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Element-UI 表单示例</title>
  <!-- 引入Element-UI的CSS和JavaScript -->
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.13/theme-chalk/index.min.css">
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.13/index.min.js"></script>
</head>
<body>
  <div id="app">
    <el-form>
      <el-form-item label="公司名称">
        <el-input v-model="form.companyName" style="width: 200px" placeholder="请输入"></el-input>
      </el-form-item>
      <el-form-item label="选择公司">
        <el-select v-model="form.selectedCompany" @change="handleCompanyChange">
          <el-option
            v-for="item in companies"
            :key="item.value"
            :label="item.label"
            :value="item.label">
          </el-option>
        </el-select>
      </el-form-item>
    </el-form>
  </div>

  <script>
    new Vue({
      el: '#app',
      data() {
        return {
          form: {
            companyName: '',
            selectedCompany: '',
          },
          companies: [
            { value: '腾讯', label: '腾讯' },
            { value: '阿里巴巴', label: '阿里巴巴' },
            { value: '百度', label: '百度' },
            { value: '字节跳动', label: '字节跳动' },
          ],
        };
      },
      methods: {
        handleCompanyChange(value) {
          const isfindCompanyName = this.companies.some(company => company.label == this.form.companyName);
          console.log(isfindCompanyName)
          if (!isfindCompanyName && this.form.companyName) {
            return false
          }
          this.form.companyName = value;
        },
      },
    });
  </script>
</body>
</html>

实现效果如下:

请在此添加图片描述

基于方案二的代码实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Element-UI 表单示例</title>
  <!-- 引入Element-UI的CSS和JavaScript -->
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.13/theme-chalk/index.min.css">
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.13/index.min.js"></script>
</head>
<body>
  <div id="app">
    <el-form>
      <el-form-item label="公司名称">
        <el-input v-model="form.companyName" style="width: 200px" placeholder="请输入" @input="handleInput"></el-input>
      </el-form-item>
      <el-form-item label="选择公司">
        <el-select v-model="form.selectedCompany" @change="handleCompanyChange">
          <el-option
            v-for="item in companies"
            :key="item.value"
            :label="item.label"
            :value="item.label">
          </el-option>
        </el-select>
      </el-form-item>
    </el-form>
  </div>

  <script>
    new Vue({
      el: '#app',
      data() {
        return {
          form: {
            companyName: '',
            selectedCompany: '',
          },
          companies: [
            { value: '腾讯', label: '腾讯' },
            { value: '阿里巴巴', label: '阿里巴巴' },
            { value: '百度', label: '百度' },
            { value: '字节跳动', label: '字节跳动' },
          ],
          inputFlag: false
        };
      },
      methods: {
        handleInput(value) {
          this.inputFlag = !!value // Vue Cli项目注意是 event.target.value
        },
        handleCompanyChange(value) {
          if (this.inputFlag) {
            return false
          }
          const findCompanyLabel = this.companies.find(item=>item.value == value)?.label
          this.form.companyName = findCompanyLabel
          this.inputFlag = false;
        },
      },
    });
  </script>
</body>
</html>

实现效果也是一样的,这里就不重复放效果图了。

只是注意一点,handleInput方法接受的第一个参数,在 Vue Cli 里面 event 是这个input 的 dom 对象,需要通过 event.target.value获取输入的值,而 上面html 版本的 vue demo 中,第一个参数实际上变成了 value。

总结

虽然这是一个很小的业务功能点,但里面的细节还是有一些的。通过实现公司名称和选择公司选项的联动功能,我们可以大大提升用户填写表单的便捷性和体验。当用户选择公司的时候,自动填充公司名称不仅减少了手动输入的麻烦,还能避免输入错误。这种精细的用户体验设计,虽然看似简单,却能显著提升用户对表单的使用满意度,增强系统的易用性和专业性。做好这些细节的优化,对于整个应用的用户体验都有积极的作用。

如果你有更好的实现思路或看法,欢迎在评论区与我交流。

目录
相关文章
|
1月前
|
人工智能 JavaScript UED
如何实现两个下拉选择框 select选中联动效果?
本文通过一个公司与产品联动的下拉选择案例,详细讲解了Element UI中双向联动下拉框的实现方法。涵盖数据过滤、回显处理、重置功能及注意事项,结合Vue实战代码,帮助开发者提升表单交互体验,适用于各类关联选择场景的开发参考。(238字)
209 0
如何实现两个下拉选择框 select选中联动效果?
|
JSON 前端开发 数据可视化
AMIS【部署 01】amis前端低代码框架可视化编辑器amis-editor本地部署流程
AMIS【部署 01】amis前端低代码框架可视化编辑器amis-editor本地部署流程
3073 0
|
26天前
|
SQL 人工智能 自然语言处理
Qoder @database功能上线!自动关联数据库 Schema,后端 AI Coding 效率拉满
Qoder是JetBrains平台唯一深度支持“数据库原生感知”的AI编程插件,内置@database能力,可将IDE中的数据库连接直接转化为AI上下文,实现精准SQL生成、架构评审与数据模拟。无需手动复制DDL,解决AI因缺乏表结构导致的“乱写代码”问题,真正闭环数据库开发流程,提升研发效率。
347 1
|
移动开发 小程序 JavaScript
Uniapp 中,能够同时兼容H5、web、app、微信小程序的引入高德地图的语法格式
Uniapp 中,能够同时兼容H5、web、app、微信小程序的引入高德地图的语法格式
1883 0
|
数据安全/隐私保护
sm4加密工具类
sm4加密工具类
253 4
|
安全 网络协议 关系型数据库
最好用的17个渗透测试工具
渗透测试是安全人员为防止恶意黑客利用系统漏洞而进行的操作。本文介绍了17款业内常用的渗透测试工具,涵盖网络发现、无线评估、Web应用测试、SQL注入等多个领域,包括Nmap、Aircrack-ng、Burp Suite、OWASP ZAP等,既有免费开源工具,也有付费专业软件,适用于不同需求的安全专家。
2556 2
|
JavaScript 前端开发
js如何获得浏览器的宽高
js如何获得浏览器的宽高
277 5
|
编解码 Python Windows
python有没有包 可以检测 这个视频是否可以播放
python有没有包 可以检测 这个视频是否可以播放
|
前端开发 JavaScript API
网页自动提交Form表单的方法
在数字化时代,自动化任务如网页自动提交Form表单,能大幅提升效率。这涉及自动填写注册信息等场景。本文概述了多种实现方式:JavaScript可直接在前端自动填充并提交;Python结合Selenium模拟真实用户操作;AOKSend作为API工具发送表单数据;第三方工具如iMacros、AutoHotkey和Zapier提供非编程自动化选项。根据需求选择合适方法,可显著提升工作效能,减少重复性劳动。
Node历史版本下载及配置npm镜像
Node历史版本下载及配置npm镜像
1508 1