element-ui下拉输入框+resetFields无法回显

ops/2025/1/11 22:55:53/

文章目录

  • 描述
  • 原因
  • 问题重现
  • 解决方案
    • 方法一
    • 方法二
  • 总结

描述

第一次进入页面,不做任何操作,点击重置按钮,再进行下拉选择,输入框并不能回显数据,点击搜索后,选中的数据就能显示出来。

请添加图片描述

重置代码,resetForm的底层用的是表单的resetFields。

resetFields的作用:对整个表单进行重置,将所有字段重置为初始值(而不是设置为空值)并移除校验结果

注意:一定要加上prop,否则无法清除

    // 重置按钮操作resetQuery: _.debounce(function () {//重置表单this.resetForm("queryForm");//搜索this.handleQuery();}, 500),

在这里插入图片描述

原因

表单绑定的是搜索的对象内容,而表单的内容使用的是v-model来绑定,如果没给表单内容初始值,那么绑定的内容就不是响应式,打印出来也可以看见。所以就会出现搜索后才会回显选中的内容。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这时候就有两种解决方法

  1. 给表单初始值,让它变成响应式,但是如果表单内容有100个的话,得一个个加。
  2. 清空的时候,不必使用表单的清除属性resetField,而是使用封装好的清空对象方法。

问题重现

这里只给了请假类型初始值,而未给请假方式初始值。

请添加图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<template><div style="margin-top: 100px"><el-form:model="form"ref="ruleForm"label-width="100px"class="demo-ruleForm"><el-form-item label="请假类型" prop="leaveType"><el-select v-model="form.leaveType" placeholder="请选择请假类型"><el-option label="事假" value="1"></el-option><el-option label="病假" value="2"></el-option></el-select></el-form-item><el-form-item label="请假方式" prop="leaveWay"><el-select v-model="form.leaveWay" placeholder="请选择请假方式"><el-option label="单次请假" value="1"></el-option><el-option label="长期请假" value="2"></el-option></el-select></el-form-item><el-form-item><el-button type="primary" @click="submitForm('ruleForm')">确定</el-button><el-button @click="resetForm('ruleForm')">重置</el-button></el-form-item></el-form></div>
</template><script>
export default {data() {return {form: {leaveType: "",},};},methods: {resetForm(formName) {console.log("form", this.form);this.$refs[formName].resetFields();},},
};
</script><style lang="scss" scoped></style>

解决方案

方法一

给表单初始值,让它变成响应式,可以很明显地看到表单的初始化内容,都有响应式。

form: {leaveType: "",leaveWay: "",},

在这里插入图片描述

缺点是需要一个个加,很费时间。

方法二

不使用表单的resetFields清空表单,而是使用清空对象的cleanObject方法。

<template><div style="margin-top: 100px"><el-form:model="form"ref="ruleForm"label-width="100px"class="demo-ruleForm"><el-form-item label="请假类型" prop="leaveType"><el-select v-model="form.leaveType" placeholder="请选择请假类型"><el-option label="事假" value="1"></el-option><el-option label="病假" value="2"></el-option></el-select></el-form-item><el-form-item label="请假方式" prop="leaveWay"><el-select v-model="form.leaveWay" placeholder="请选择请假方式"><el-option label="单次请假" value="1"></el-option><el-option label="长期请假" value="2"></el-option></el-select></el-form-item><el-form-item><el-button type="primary">确定</el-button><el-button @click="resetForm(form)">重置</el-button></el-form-item></el-form></div>
</template><script>
export default {data() {return {form: {},};},methods: {resetForm(formName) {this.cleanObject(formName);},cleanObject(obj) {// 判断对象是否为非对象或nullif (typeof obj !== "object" || obj === null) {return obj;}// 判断对象是否为数组if (Array.isArray(obj)) {// 递归处理数组中的每个元素return obj.map((item) => this.cleanObject(item));}// 如果是对象,则遍历其属性for (const key in obj) {// 判断值是否为数组if (Array.isArray(obj[key])) {// 如果是数组,则将其置为空数组obj[key] = [];} else {// 递归处理对象中的每个值obj[key] = this.cleanObject(obj[key]);}}},},
};
</script><style lang="scss" scoped></style>

总结

实际场景用方法二会比较好点,如果有100个下拉框,给初始值的话,那你就要给100个内容进行初始化,很浪费时间。在vue3中也存在这样的情况,不知道这是不是resetFields遗留下来的bug,还需要看一下resetFields的源码。具体的原理还需要大家在评论区进行补充,附上vue3试验的代码。

<template><el-form :model="form" ref="form" label-width="100px" class="demo-ruleForm"><el-form-item label="请假类型" prop="leaveType"><el-select v-model="form.leaveType" placeholder="请选择请假类型"><el-option label="事假" value="1"></el-option><el-option label="病假" value="2"></el-option></el-select></el-form-item><el-form-item label="请假方式" prop="leaveWay"><el-select v-model="form.leaveWay" placeholder="请选择请假方式"><el-option label="单次请假" value="1"></el-option><el-option label="长期请假" value="2"></el-option></el-select></el-form-item><el-form-item><el-button type="primary">确定</el-button><el-button @click="resetForm(form)">重置</el-button></el-form-item></el-form>
</template><script setup>
import { ref } from "vue";const form = ref({});const resetForm = (formEl) => {if (!formEl) return;formEl.resetFields();
};
</script>

http://www.ppmy.cn/ops/149274.html

相关文章

选择器css

1.a标签选择 // 选中所具有herf 的元素 [herf] {color: skyblue; } // 选中所具有herfhttps://fanyi.youdao.com/ 的元素 [herf$"youdao.com"] {color:pink; } // 按此顺序书写 link visited hover active // 未访问状态 a:link {color:orange } // 访问状态 a…

Java手动打印执行过的sql

1. 拦截器 package com.xxx.platform.common.interceptor;import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.xxx.platform.common.aop.OLAPQuery; import com.xxx.platform.constant.CommonConstant; import com.xxx.platform.uti…

在Ubuntu中使用systemd设置后台自启动服务

引言 在Ubuntu系统中&#xff0c;systemd 是一个非常强大的系统和服务管理器。它不仅负责系统的启动和初始化&#xff0c;还可以帮助我们管理各种后台服务。通过使用 systemd&#xff0c;我们可以轻松地设置服务在系统启动时自动运行&#xff0c;并且能够方便地管理服务的启动…

python实现自动登录12306抢票 -- selenium

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码&#xff0c;但是都不是最新的&#xff0c;我也是从网上找别人的帖子&#xff0c;看B站视频&…

HTTPS协议的基础与工作原理

什么是HTTPS&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP协议的安全版本&#xff0c;它通过SSL/TLS协议对通信数据进行加密&#xff0c;确保数据的安全传输。与HTTP相比&#xff0c;HTTPS能防止数据被窃取、篡改或伪造&#xff0c;广…

基于微信小程序的水果销售系统的设计与实现springboot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

文件上传漏洞 (网络安全)

文件上传漏洞&#xff08;File Upload Vulnerability&#xff09;是一种常见的安全漏洞&#xff0c;发生在允许用户上传文件的应用程序中。如果系统没有适当验证用户上传文件的类型、内容或权限&#xff0c;就可能允许攻击者上传恶意文件&#xff0c;这些文件能够在目标服务器上…

如何在 Ubuntu 22.04 上安装和配置邮件服务器教程

简介&#xff1a; 在本指南中&#xff0c;我们将演示如何在 Ubuntu 22.04 上安装和配置邮件服务器&#xff0c;因为大中型公司可以从拥有私人邮件服务器中获益匪浅。通过使用邮件服务器&#xff0c;可以密切监视所有电子邮件流量。此外&#xff0c;自定义设置的灵活性使得建立…