vue3+element-plus表单重置resetFields方法不生效踩坑

前言:按照项目需求,多处都会使用dialog+form组件,而form大多都会有重置需求,但点击重置按钮,有的时候resetFields方法就仿佛失效一样。

首先需要明白resetFields方法是将表单重置为form组件dom刚渲染时的初始值

本文实现的重置是:

1、以新增按钮打开弹窗,将数据重置为数据1

2、以编辑按钮打开弹窗,将数据重置为数据2

// html
<el-dialog v-model="pa.dialog.show" :title="pa.dialog.title" @close="handleClose">
    <el-form :model="pa.dialog.form" ref="formRef">
        <el-form-item label="名字:" prop="name">
           <el-input v-model="pa.dialog.form.name" autocomplete="on"/>
        </el-form-item>
        ...
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="pa.dialog.show = false">取消</el-button>
        <el-button @click="resetEvent">重置</el-button>
        <el-button type="primary" @click="sureSubmit">确定</el-button>
      </span>
    </template>
</el-dialog>

情景一:如果打开修改弹框时,数据时直接传递过来的

const pa = reactive({ //数据1
    dialog:{
        form:{
            name:'',
            age:10
        }
    }
})
const backupData = JSON.parse(JSON.stringify(pa.dialog.form))

// 这是打开dialog弹框的事件
const openDialogEvent = (v1:string,v2?:any) => {
  pa.dialog.show = true
  pa.dialog.type = v1
  if(v1 == '1') { //add
    pa.dialog.title = '新增'
  }else {
    pa.dialog.title = '修改'
    pa.dialog.form = v2  // --------------------- 这里很重要,数据2
  }
}

const resetEvent = () => {
  formRef.value.resetFields()  // 此时的resetFields方法没有任何问题
}

// 当你点击了编辑按钮使得 pa.dialog.form获取了新数据(称为数据2)
// 但当你关闭弹框时, pa.dialog.form值依然是数据2,并不会变回为数据1
// 当你再点击新增按钮时,会导致form组件显示的数据是数据2
// 因此笔者给弹框设置了一个关闭事件
const handleClose = () => {
  // 这一步是防止(仅用下面这一步的话)点击增加在里面输入内容后关闭第二次点击增加再输入内容再关闭再点击增加会出现未初始化
  formRef.value.resetFields()  
  // 这一步是防止(仅用上面那一步)先点击编辑后再关闭弹窗再点击增加,显示的为数据2
  pa.dialog.form = backupData 
}

情景二:如果打开修改弹框时,数据是请求的接口

const pa = reactive({  //数据1
    dialog:{
        form:{
            name:'',
            age:10
        }
    }
})
let backupData = "{}"

// 这是打开dialog弹框的事件
const openDialogEvent = (v1:string,v2?:any) => {
  pa.dialog.show = true
  pa.dialog.type = v1
  if(v1 == '1') { //add
    pa.dialog.title = '新增'
  }else {
    pa.dialog.title = '修改'
    _findInfoById({id:v2.id}).then((res:any) => {
        pa.dialog.form = res.data   // 数据2
        backupData = JSON.stringify(res.data)  // -------------很重要
    }) 
  }
}

// 当你点击编辑按钮打开弹窗时,dom刚渲染的数据依然是数据1
// 因此调用resetFields()方法,重置显示的是数据1
// 解决如下
const resetEvent = () => {
  formRef.value.resetFields() 
  if(pa.dialog.type == '2') {
    pa.dialog.form = JSON.parse(backupData)
  }
}

// 这一步依然必须存在,否则当你点击新增按钮输入内容(数据3),关闭后,再点击新增按钮,显示的就是数据3
const handleClose = () => {
  formRef.value.resetFields() 
}

补充一下:

1、form组件上必须要有ref

2、form-item上必须要有prop属性

3、情景一不能使用nextTick

const openDialogEvent = (v1:string,v2?:any) => {
  pa.dialog.show = true
  pa.dialog.type = v1
  if(v1 == '1') { //add
    pa.dialog.title = '新增'
  }else {
    pa.dialog.title = '修改'
    // 如果使用了这个,那么弹框dom渲染时获取到的依然是数据1
    // 那么不能实现将弹框的参数值重置为传递过去的v2数据
    // 如果非要使用,想要实现本文的重置效果,其做法与情景二一样
    nextTick(()=>{
        pa.dialog.form = v2
    })
  }
}

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Vue3 中使用 Element Plus 进行表单验证可以按照以下步骤进行: 1. 安装 Element Plus 和 VeeValidate ``` npm install element-plus vee-validate@next ``` 2. 在 main.js 中引入 Element Plus 和 VeeValidate ```js import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import { defineRule, ErrorMessage, configure } from 'vee-validate' import { required, min, max, email } from '@vee-validate/rules' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) // 注册 VeeValidate 规则 defineRule('required', required) defineRule('min', min) defineRule('max', max) defineRule('email', email) // 配置 VeeValidate configure({ generateMessage: ({ field, rule }) => { const messages = { required: `${field}不能为空`, min: `${field}至少为${rule.params.min}个字符`, max: `${field}不能超过${rule.params.max}个字符`, email: `${field}必须是有效的邮箱地址` } return messages[rule.name] || `${field}无效` } }) app.component('ErrorMessage', ErrorMessage) app.mount('#app') ``` 3. 在组件中使用 VeeValidate ```html <template> <el-form :model="form" :rules="rules" ref="form"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> <error-message name="username"></error-message> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="form.password"></el-input> <error-message name="password"></error-message> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script> import { defineComponent } from 'vue' import { useVeeValidate } from '@vee-validate/vue3' export default defineComponent({ setup() { const { handleSubmit, resetForm, errors, setErrors } = useVeeValidate() const form = { username: '', password: '' } const rules = { username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 6, max: 16, message: '用户名长度在 6 到 16 个字符', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, max: 16, message: '密码长度在 6 到 16 个字符', trigger: 'blur' } ] } const submitForm = handleSubmit(async () => { // 提交表单逻辑 }) return { form, rules, submitForm, resetForm, errors, setErrors } } }) </script> ``` 在这个例子中,我们使用了 `useVeeValidate()` hook 来管理表单验证,定义了一个 `form` 对象来存储表单数据,定义了 `rules` 对象来定义表单验证规则,使用了 `handleSubmit()` 方法来触发表单提交逻辑,并且使用了 `ErrorMessage` 组件来展示错误信息。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值