解决el-form、el-dialog、数据回显同时用时,重置失效问题

  • 无问题操作: 第一次打开网页,先点击新增按钮 -> dialog出现 ->
    el-form组件第一次挂载(关联的formData对象的属性的值为空字符串)el-form组件内绑定了初始值空字符串,所以后续调用resetFields的时候,它可以用到空字符串初始值来重置
  • 有问题: 第一次打开网页,先点击修改按钮 -> 虽然dialog变量为true了但是同步代码把formData对象里赋值了(默认值) ->DON更新异步 -> dialog出现 ->el-form组件第一次挂载(使用formData内置做数据回显然后第一次el-fonm内绑定了初始值(有值)) ->以后做重置,它就用绑定的默认值做重置

先调用修改回显再调用新增 this.$ref[‘form’] .resetFields()无法重置表单项

数据回显(Data Echoing)指的是将数据重新显示在用户界面上的过程,通常用于在用户提交表单后,或从服务器获取数据后,将数据填充回表单或展示在页面上。

element-ui的官方文档:调用编辑的时候,表单的初始值被设置为回显的值,每次重置时只是重置为初始值,不是空值。

原因:

  1. vue数据改变(先执行同步代码)再去更新DOM(异步更新)
  2. 当我们第一次打开Dialog,紧接着设置数据回显,因为Dialog还没执行完毕,这时form的初始值会被设置为回显的值,所以在调用this.$ref[‘form’] .resetFields()时form看起来没有重置。

解决办法:

在设置回显值的时候,不要直接赋值,在外边加上setTimeout或者this.$nextTick


dialogVisible(row){
	// 打开弹框,这个必须写在数据回显之前,不然仍然失效
	this.configDialogVisible = true
	
	// 表单需要渲染完成后再重置
	this.$nextTick(() => {
		this.formData= JSON.parse(JSON.stringify(row));
	})
}

拓展:

其他原因:

1.表单上没有添加ref属性

解决:在form上添加ref,需要与this.$ref[‘form’] 中名称一致

2.el-form-item没有添加prop属性

解决:prop属性需要与data绑定的属性一致

3.this.$nextTick 的主要作用是确保在下一次 DOM 更新周期之后执行指定的回调函数,从而避免操作未更新的 DOM 元素。因为 Vue.js 是异步更新 DOM 的,有时候我们需要在数据改变并且 DOM 完成更新之后执行某些操作,这时候就可以使用 nextTick 。

### 如何让 `el-form` 占满 `el-dialog` 的整个空间 为了使 `el-form` 完全占据 `el-dialog` 的可用空间,可以通过调整样式来实现。具体来说,需要确保对话框的内容区域没有任何多余的间距或边距干扰布局,并通过 CSS 设置表单及其子元素的高度和宽度。 以下是具体的解决方案: #### 1. 使用 Flexbox 实现高度填充 Flexbox 是一种强大的布局工具,能够轻松解决容器内的垂直和水平对齐问题。将 `el-dialog` 的主体部分设置为 Flexbox 容器,可以让内部的 `el-form` 自动扩展以填充满剩余的空间。 ```html <template> <el-dialog title="示例" :visible.sync="dialogVisible"> <div class="form-container"> <el-form ref="form" :model="formData" label-width="80px"> <!-- 表单项 --> <el-form-item label="名称"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="描述"> <el-input type="textarea" v-model="formData.description"></el-input> </el-form-item> </el-form> </div> </el-dialog> </template> <script> export default { data() { return { dialogVisible: true, formData: { name: '', description: '' } }; } }; </script> <style scoped> .form-container { display: flex; flex-direction: column; /* 确保内容按列排列 */ height: 100%; /* 让容器占满父级高度 */ } .el-form { flex-grow: 1; /* 让表单自动扩展以填满剩余空间 */ } </style> ``` 上述代码中,`.form-container` 被设为 Flexbox 容器并赋予 `height: 100%` 属性[^1],从而使其完全适应 `el-dialog` 的高度。而 `.el-form` 则设置了 `flex-grow: 1` 来动态扩展至最大可能尺寸。 --- #### 2. 移除默认内边距 Element Plus 默认会在 `el-dialog` 上应用一定的内边距(padding),这可能会限制内容区域能够使用的实际大小。因此,建议移除这些默认样式或者覆盖它们。 ```css /* 清除 el-dialog 的默认 padding */ .el-dialog__body { padding: 0 !important; /* 防止被其他样式覆盖 */ } ``` 此操作可确保 `el-form` 不受额外空白的影响,真正达到最大化利用空间的效果[^2]。 --- #### 3. 动态适配屏幕尺寸 对于响应式设计而言,还需要考虑不同设备分辨率下组件的表现形式。借助媒体查询或其他前端框架特性(如 Element UI 提供的栅格系统 Grid Layout),可以进一步增强兼容性和美观度。 例如,在较小屏幕上减少字体大小或将某些字段折叠成多行显示等方式提高易读性与交互体验。 --- ### 总结 综上所述,要让 `el-form` 在 `el-dialog` 中占满全部可用面积,则需注意以下几点: - 将外层包裹层配置为 Flexbox 并指定方向; - 明确设定各层次结构之间的宽高等属性关系; - 处理好由框架自带样式的潜在冲突情况。 最终效果不仅取决于静态 HTML/CSS 结构本身,还依赖于运行环境的具体参数以及用户偏好等因素共同决定[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值