首页 > 其他分享 >element plus + vue3表单第一次数据未清空的bug问题解决

element plus + vue3表单第一次数据未清空的bug问题解决

时间:2023-02-08 18:12:42浏览次数:48  
标签:nextTick 回显 resetFields vue3 element plus 清空 表单 数据

使用框架:element Plus + vue3

场景描述:

场景一:
表单的添加和修改功能,公用同一个弹框,点击修改后,点击添加表单显示的是上次修改的数据。
场景二:
点击修改,数据回显到表单,然后点击取消关闭弹框,在关闭的时候使用resetFields()清空数据,第二次点击修改的时候,回显的数据可以清空,但是表单的值会默认到第一次回显的数据。而且点击添加的时候,默认展示的就是第一次回显的数据。

官方提供表单校验以及清除数据的方法
在这里插入图片描述


场景一问题解决:

element plus的弹框有一个close方法,这个方法为弹框关闭时触发,在这个close方法内调用清空表单方法resetFields(),清空表单校验以及初始化表单数据。

<el-dialog
      :close-on-click-modal="false"
      @close="closeGift(giftBoxRef)"
      :title="!isUpdate ? '添加' : '修改'"
      v-model="BoxShow" >
</el-dialog>
 
 // 关闭弹框
const closeGift = (formEl: FormInstance | undefined) => {
  BoxShow.value = false;
  if (!formEl) return;
  formEl.resetFields();  // 清除表单校验以及表单数据初始化
};

场景二问题解决:

原因:在dialog弹框打开的时候,form表单的数据回显,这个时候表单的初始化数据其实是被回显的数据替换掉了,resetFields()在清空数据的时候,会默认恢复数据到数据的初始值,如果第一次表单回显时初始化数据被替换,那么后续resetFields()清空数据后恢复到的值会一直是第一次回显的值。

vue2
vue2中可以使用 this.$nextTick(() => {// 这里对表单进行赋值}) 的方法解决

/* 修改 */
const updateBox = async (row: any) => {
	this.$nextTick(() => {
	// 这里对表单进行赋值
	// formData = row
	})
}

vue3
vue3中也可以使用nextTick解决

import { nextTick } from "vue";

/* 修改 */
const dialogShow = ref(false);  // 开启对话框
const updateBox = async (row: any) => {
    dialogShow.value = true;
    nextTick(() => {
      // formData = row
    });
};

nextTick 是将回调推迟到下一个 DOM 更新周期之后执行。在更改了一些数据以等待 DOM 更新后立即使用它。

注意:nesxTick建议放在函数的最后一步,如果dialogShow放在nextTick后,nextTick将不会产生作用。


表单清空的注意事项

elementresetFields()函数清空表单数据其实是跟表单上的prop属性有关的,只有表单上存在对应的prop属性,数据才会被清除。

<el-form
        :model="data"
        :rules="rule"
        ref="giftBoxRef"
        label-width="100px"
        label-suffix=":"
      >
        <el-form-item label="名称" prop="name">
          <el-input v-model="data.name" placeholder="请输入名称" />
        </el-form-item>
        <el-form-item label="描述">
          <el-input v-model="data.priceDesc" placeholder="请输入描述" />
        </el-form-item>
</el-form>

const data = ref({
  name : null,
  priceDesc : null
})

在这里,名称的输入框添加了prop=name,描述的部分没有添加,所以使用resetFields()清空表单数据时,只会重置data内的name值。而priceDesc的值不会有任何变化,需要手动重置。

标签:nextTick,回显,resetFields,vue3,element,plus,清空,表单,数据
From: https://www.cnblogs.com/wang-fan-w/p/17102840.html

相关文章

  • element表单嵌套检验+动态添加
    在写表单的时候,容易碰到这种嵌套表单的数据校验,并且这种表单是动态添加的,网上大部分的做法是表单套表单,实际上只需要一个表单就可以了。为了方便观看,这里只列举了两条数......
  • vue3 和vue2的区别
    1.数据的响应式不同答:vue2是通过object.defineProperty()方法,get是获取属性,set是修改属性。但是新加的属性和删除的属性则没有响应式,还有就是通过数组的下标来修改值,......
  • RPM 安装好19c后SQLPLUS登录报错ORA-12547
    问题描述:RPM安装好19c后SQLPLUS登录报错ORA-12547,如下所示:1、异常重现2、问题排查--查?/bin/oracle权限,确认无问题.--查/home/oracle/.bash_profile文件,发现ORACLE_HOME目......
  • 【vue3】父子组件通信之 vue3 defineProps,defineEmits ,defineExpose
    1、简介父组件通过v-bind绑定一个数据,然后子组件通过defineProps接受传过来的值,2、代码示例1)给Menu组件传递了一个title字符串类型是不需要v-bind<template><d......
  • 【pinia-plugin-persistedstate】Vue3 pinia 数据持久化插件 pinia-plugin-persisteds
    为什么需要持久化?刷新浏览器后,重新加载页面时会重新初始化vue、pinia,而pinia中状态的值仅在内存中存在,而刷新导致浏览器存储中的数据就没了。在实际开发中,浏览器刷新......
  • 直播平台搭建,elementui的导航路由递归报错解决
    直播平台搭建,elementui的导航路由递归报错解决menu.vue-父组件: <template>  <div>   <el-menu :default-active="activeIndex" background-color="#0f......
  • Element Plus
    ElementPlus是基于vue3的UI框架官网https://element-plus.gitee.io/zh-CN/安装cnpminstallelement-plus--save查看package.json导入在main.js中加入import......
  • vue+element DatePicker日期选择器封装(可自定义快捷选择时间)
    前言今天封装了一个DatePicker日期选择器,发现带快捷选择的不太好封装,我需要在不同的地方快捷选择不同的时间,并且快捷显示的时间是从昨天开始,在网上找了一圈都没找到便自己......
  • 基于vue3的跑马灯组件|vue3-marquee
    vue3-marquee是Vue3的一个简单的跑马灯组件,可以创建可定制的跑马灯效果。该组件为您的内容使用插槽,提供多种配置选项来控制跑马灯的效果。安装//npmnpminstallv......
  • MyBatis-Plus——saveOrUpdate方法如何确定主键
    saveOrUpdate方法:先更新,更新失败返回0;发起查找,查找失败返回0,最后进行插入操作有三种执行情况1.插入的数据不带id插入成功。同时MyBatis-Plus会自动生成一个19位的id,默认主......