vue3 elementUI 关于el-dialog组件中el-form初始值设置问题以及el-dialog懒加载变即加载解决方案

文章讲述了在el-dialog中使用el-form时,如何处理form重置和多个初始值的问题。解决方法包括提前初始化表单以避免加载延迟,以及使用深层克隆技术管理不同初始状态。
摘要由CSDN通过智能技术生成

问题简述

       1.对于form表单重置resetFields()方法,恢复初始值,是恢复表单创建时候初始化时候的值。当我们在el-dialog弹出框中使用el-form的时候应该注意,在弹窗第一次打开的时候,才去加载弹窗内容(即form组件),所以其初始值在此时取得。此种情景就会 造成了我在开始赋值的时候,没有生效,而是在第一次打开之前变更设置的那个值生效了(生效:变为初始值,resetFields()恢复的值)。

        2.问题拓展:一个el-form组件对应一个初始值,如何使得一个el-form组件对应多个“初始值”?实际场景中的我们的弹窗表单很可能只是一个组件,然后点击不同数据,点击重置的时候希望回到不同数据的初始状态。具体比如一个table表中点击不同的行 修改数据, 然后一个弹窗表单组件需要去装载不同的对应行的数据,我们点击重置需要让表单初始值回到对应的这行的数据。

解决方案

  1. 关于以上问题1是因为加载时间问题造成的,其解决方案其他博主有很多,但是这里个人提供一个新的解决办法。加载时间问题的根源是由于el-dialog中内容为懒加载,变为即加载即可。方式可以为:在el-dialog组件中 model-value / v-model 的变量值开始设置为true,即默认去初始化el-dialog中的el-form组件。然后在组件初始化完成钩子onMounted中关闭( v-model变量值设为false)即可。亲测可变即加载,且不会有弹窗闪烁。
  2. 关于扩展问题2的解决方案:我是在自己封装的el-form组件中,引入了一个缓存变量。在el-form数据变更时候,将新的传入(或处理后的)值分为两份(注意要分为不同的引用,不能两个变量指向同一引用),一份去绑定el-form的model,一份留存。重置时候:调用重置方法时候resetFields(),这时候的初始值不是期望值,然后再去将缓存的数据深拷贝一份到el-form的model绑定变量。以下为核心代码片段
    const loadData = (formData) =>{
        info.form = formData;//装载表单数据<el-form ref="formRef" :model="info.form"
        info.formTemp = _.cloneDeep(formData);
    }
    
    const reset = () => {
      if (!formRef) return
      formRef.value?.resetFields() 
    //resetFields:对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
      info.form = _.cloneDeep(info.formTemp)
    }

    _.cloneDeep来自于import _ from 'lodash' ,这个插件的深度克隆方法,避免不同变量指向同一引用。

 总结

关于组件赋值有效性问题,需要注意组件实际生成加载时机。尤其是当我们在使用el-dialog时候,需要注意懒加载产生的系列问题。

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值