el-dialog嵌套表单使用【回车】问题

本文记录了一个关于 el-dialog 中使用 el-input 的奇怪 bug,当表单内仅包含一个 el-input 并聚焦后按回车键,页面会异常刷新。解决办法是在表单中增加另一个隐藏的 el-input。

被提到这个bug的时候,我就是这种状态

讲道理,第一次遇到这么怪的事儿,幸好一个同事遇到过这问题,太怪了;

具体问题: 打开el-dialog嵌套表单,给el-input聚焦,然后回车,直接刷新页面

问题原因:我el-form里面只有一个el-input,具体为什么回车变成那样也不晓得了

解决方法,加个el-input,设置隐藏

以上~

 

 

 

 

 

<template> <el-form ref="formRef" :model="form" :rules="rules" label-width="100px" :disabled="loading"> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="作业时间"> <el-input v-model="form.lastUpdateTime" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="降水预报截止时间" prop="ybjzsj"> <el-input v-model="form.ybjzsj" placeholder="请输入降水预报截止时间" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="时间跨度(h)"> <el-input v-model="form.sjkd" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="源文件下载地址"> <el-input v-model="form.url" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="源文件本地保存地址"> <el-input v-model="form.sourceFilePath" /> </el-form-item> </el-col> </el-row> <!-- 按钮区域,右对齐 --> <div class="btn-container"> <el-button @click="closeDialog" :disabled="loading">取消</el-button> <el-button type="primary" @click="save" :loading="loading">保存</el-button> </div> </el-form> </template> <script setup> import { ref, watch} from 'vue' import { ElMessage } from 'element-plus' import { getInfo, saveInfo } from '@/assets/js/api/workbench/sharedData/precipForecast' import Point from '@/components/pointMap.vue' const props = defineProps({ id: { type: [String, Number], default: null } }) const emit = defineEmits(['close']) const loading = ref(false) const form = ref({ lastUpdateTime: '', ybjzsj: '', sjkd: '', url: '', sourceFilePath: '', }) const rules = { ybjzsj: [{ required: true, message: '请输入降水预报截止时间', trigger: 'blur' }], } const formRef = ref(null) // 监听id变化,加载详情或重置表单 watch( () => props.id, (newId) => { if (newId) { loadInfo(newId) } else { resetForm() } }, { immediate: true } ) function resetForm() { form.value = { lastUpdateTime: '', ybjzsj: '', sjkd: '', url: '', sourceFilePath: '', } if (formRef.value) { formRef.value.clearValidate() } } async function loadInfo(id) { console.log(id) loading.value = true try { const res = await getInfo(id) if (res.code === 200) { form.value = res.data } else { ElMessage.error('获取详情失败') } } catch (error) { ElMessage.error('获取详情异常') } finally { loading.value = false } } function closeDialog() { emit('close') } function save() { if (!formRef.value) return formRef.value.validate(async (valid) => { if (!valid) return loading.value = true try { const params = { ...form.value } const res = await saveInfo(params) if (res.code === 200) { ElMessage.success('保存成功') closeDialog() } else { ElMessage.error(res.msg || '保存失败') } } catch (error) { ElMessage.error('保存异常') } finally { loading.value = false } }) } </script> <style lang="scss" scoped> .btn-container { width: 100%; margin-top: 100px; display: flex; justify-content: flex-end; } </style> 这段代码在哪里设置了某个字符编辑后的文字不会更新
最新发布
07-31
使用 `el-dialog` 组件时,嵌套表单和表格是常见的开发需求,尤其是在数据编辑、新增操作中。然而,这种嵌套结构在实际开发中容易遇到表单初始化、数据绑定、重置等问题。以下是针对 `el-dialog` 嵌套表单和表格的实现方式和问题解决方案。 ### 数据初始化与隔离 在编辑操作中,如果直接将表格行数据赋值给表单对象,可能会导致数据引用问题,即表单修改会直接影响表格数据源。为了避免这种相互影响,可以使用 JSON 深拷贝来实现数据隔离。例如: ```javascript editData(row) { this.dialogVisible = true; this.$nextTick(() => { this.ruleForm = JSON.parse(JSON.stringify(row)); }); } ``` 通过 `JSON.parse(JSON.stringify(row))` 实现深拷贝,确保表单数据与原始数据互不影响。此外,使用 `this.$nextTick` 是为了确保弹窗已经渲染完成,避免在弹窗尚未打开时赋值导致的表单重置失败问题 [^1]。 ### 表单重置机制 在 `el-dialog` 中使用 `el-form` 时,通常会调用 `resetFields()` 方法来重置表单字段。然而,在编辑场景下,由于表单初始值已经被设置为当前行数据,调用 `resetFields()` 不会将表单字段重置为空字符串,而是恢复为初始值。为了解决这一问题,可以在打开弹窗时手动将表单字段设置为空或默认值,再调用 `resetFields()`: ```javascript resetForm() { this.ruleForm = { field1: '', field2: '' }; this.$refs.form.resetFields(); } ``` 这样可以确保表单在重置时回到预期的初始状态。 ### 弹窗与表单的生命周期控制 在 Vue 中,`el-dialog` 的显示与隐藏会影响其内部组件的渲染状态。因此,在打开弹窗时应确保表单组件已经渲染完成,再进行数据赋值或重置操作。可以通过 `this.$nextTick` 来确保 DOM 更新完成后再执行相关逻辑 [^1]。 ### 示例代码 以下是一个完整的示例,展示如何在 `el-dialog` 中嵌套 `el-form` 和 `el-table` 并处理数据绑定与重置问题: ```html <template> <el-dialog :visible.sync="dialogVisible" title="编辑信息"> <el-form ref="form" :model="ruleForm" label-width="120px"> <el-form-item label="字段1"> <el-input v-model="ruleForm.field1"></el-input> </el-form-item> <el-form-item label="字段2"> <el-input v-model="ruleForm.field2"></el-input> </el-form-item> <el-form-item> <el-button @click="submitForm">提交</el-button> <el-button @click="resetForm">重置</el-button> </el-form-item> </el-form> </el-dialog> </template> <script> export default { data() { return { dialogVisible: false, ruleForm: { field1: '', field2: '' } }; }, methods: { editData(row) { this.dialogVisible = true; this.$nextTick(() => { this.ruleForm = JSON.parse(JSON.stringify(row)); }); }, resetForm() { this.ruleForm = { field1: '', field2: '' }; this.$refs.form.resetFields(); }, submitForm() { // 提交逻辑 } } }; </script> ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值