ElementUI组件Dialog弹窗再次打开表单仍显示上次数据的解决方法

Vue+Element表单重置
本文介绍在Vue+Element UI框架中解决表单数据未重置的问题。通过在弹窗打开时重置表单数据,确保每次打开都是空白表单。

问题描述:在使用vue+element开发Dialog嵌套表单的时候,表单交数据关闭之后再次打开表单没有重置,仍显示上次输入的数据。

点击新增,显示弹窗
在这里插入图片描述
添加后,数据显示在页面中。当再次点击新增时出现以下界面:仍保留上次的数据,而且若修改表单中数据页面中的数据也会被修改。根本原因是form表单对象保留了上次的数据,应该将其置空

重置方法

嵌套表单的弹窗的代码:

<el-button type="text" @click="dialogFormVisible = true" 
	@open="resetForm">弹窗</el-button>    //@open事件绑定打开表格时重置

<el-dialog title="收货地址" :visible.sync="dialogFormVisible">
    <el-form :model="form" ref="form" :rules="rules">
       <el-form-item prop="id" label="编号" :label-width="formLabelWidth">
            <el-input v-model="form.id" autocomplete="off"></el-input>
       </el-form-item>
       <el-form-item prop="name" label="名称" :label-width="formLabelWidth">
            <el-input v-model="form.name" autocomplete="off"></el-input>
       </el-form-item>
       <el-form-item prop="type" label="型号" :label-width="formLabelWidth">
            <el-input v-model="form.type" autocomplete="off"></el-input>
       </el-form-item>
       <el-form-item prop="company" label="厂家" :label-width="formLabelWidth">
            <el-input v-model="form.company" autocomplete="off"></el-input>
       </el-form-item>
    </el-form>
  <div slot="footer" class="dialog-footer">
    <el-button @click="dialogFormVisible = false">取 消</el-button>
    <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
  </div>
</el-dialog>

<script>
  export default {
    form:{
            id:'',
            name:'',
            type:'',
            company:''
                }
    methods:{
    	resetForm(){
              this.form={};   //重置表格对象
                }
    	}
    }
  };
</script>

将Dialog弹窗的打开事件绑定方法,然后在方法中使用this.form={}进行重置。this.form={}这个的意思是把表单初始化为一个空对象,后期可以往这个对象里赋值。

<think>我们正在处理一个关于ElementUI中el-dialog弹窗设置的问题。用户希望了解如何使el-dialog弹窗可拖拽和可拉伸(即改变大小)。根据提供的引用内容,我们可以总结如下: 1. 可拖拽功能:通过自定义指令实现(如引用[2]所示)。 2. 可拉伸(改变大小)功能:引用[3]提到了一种方式,通过自定义一个可拖拽的区域(如图标或文字)来实现缩放,但该引用并未给出完整代码。 由于ElementUI默认的el-dialog不支持拖拽和改变大小,我们需要自定义指令或添加额外的功能来实现。 ### 解决方案步骤 #### 1. 实现拖拽功能 我们可以创建一个自定义指令(例如`v-el-drag-dialog`),用于使el-dialog的头部成为拖拽手柄。参考引用[2]的代码,但我们需要自行实现`drag.js`。 **drag.js 示例代码:** ```javascript export default { bind(el, binding, vnode, oldVnode) { // 获取弹窗头部(使用el-dialog的header类) const dialogHeaderEl = el.querySelector('.el-dialog__header'); const dragDom = el.querySelector('.el-dialog'); if (!dialogHeaderEl || !dragDom) return; // 设置鼠标样式 dialogHeaderEl.style.cursor = 'move'; // 获取原有属性 const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null); dialogHeaderEl.onmousedown = (e) => { // 计算当前元素距离可视区的距离 const disX = e.clientX - dialogHeaderEl.offsetLeft; const disY = e.clientY - dialogHeaderEl.offsetTop; // 获取body的宽高(防止拖出可视区域) const bodyWidth = document.body.clientWidth; const bodyHeight = document.body.clientHeight; // 获取弹窗的宽高 const dragDomWidth = dragDom.offsetWidth; const dragDomHeight = dragDom.offsetHeight; // 计算可移动的范围 const minLeft = -dragDom.offsetWidth / 2 + dragDomWidth / 2; const maxLeft = bodyWidth - dragDom.offsetLeft - dragDomWidth / 2; const minTop = -dragDom.offsetTop + dragDomHeight / 2; const maxTop = bodyHeight - dragDom.offsetTop - dragDomHeight / 2; // 获取弹窗的left和top值(注意:需要去掉px,转换为数字) let styL, styT; if (dragDom.style.left.includes('%')) { // 如果有%单位,则按百分比计算 styL = +document.body.clientWidth * (+dragDom.style.left.replace(/%/g, '') / 100); styT = +document.body.clientHeight * (+dragDom.style.top.replace(/%/g, '') / 100); } else { styL = +dragDom.style.left.replace(/px/g, ''); styT = +dragDom.style.top.replace(/px/g, ''); } document.onmousemove = function(e) { // 计算移动的距离 let left = e.clientX - disX; let top = e.clientY - disY; // 边界处理 if (left < minLeft) { left = minLeft; } else if (left > maxLeft) { left = maxLeft; } if (top < minTop) { top = minTop; } else if (top > maxTop) { top = maxTop; } // 移动当前元素 dragDom.style.left = `${left + styL}px`; dragDom.style.top = `${top + styT}px`; }; document.onmouseup = function() { document.onmousemove = null; document.onmouseup = null; }; }; } }; ``` 在main.js中全局注册指令: ```javascript import Vue from 'vue'; import drag from './directives/drag'; Vue.directive('el-drag-dialog', drag); ``` 在el-dialog上使用指令: ```vue <el-dialog v-el-drag-dialog ...> ... </el-dialog> ``` #### 2. 实现可拉伸(改变大小)功能 ElementUI的el-dialog本身不支持改变大小,我们可以通过添加一个自定义的拖拽区域(例如右下角的图标)来实现。参考引用[3]的思路,我们可以创建一个用于改变大小的手柄。 **步骤:** 1. 在el-dialog内部添加一个用于改变大小的元素(例如一个div),并定位到右下角。 2. 为该元素添加鼠标按下事件,记录初始位置和弹窗的初始宽高。 3. 在鼠标移动时,计算新的宽高,并设置给弹窗。 **示例代码:** 在drag.js中我们也可以添加改变大小的功能,但为了分离关注点,我们可以创建另一个指令(例如`v-resize-dialog`)或者将两个功能合并到一个指令中。这里为了简化,我们单独实现一个改变大小的指令。 **resize.js 示例代码:** ```javascript export default { bind(el, binding, vnode, oldVnode) { const dragDom = el.querySelector('.el-dialog'); if (!dragDom) return; // 创建改变大小的元素 const resizeEl = document.createElement('div'); resizeEl.style.cssText = ` position: absolute; right: 0; bottom: 0; width: 10px; height: 10px; background: #409EFF; cursor: se-resize; z-index: 1000; `; dragDom.appendChild(resizeEl); resizeEl.onmousedown = (e) => { e.preventDefault(); const startX = e.clientX; const startY = e.clientY; const startWidth = dragDom.clientWidth; const startHeight = dragDom.clientHeight; document.onmousemove = (e) => { const moveX = e.clientX - startX; const moveY = e.clientY - startY; // 计算新的宽高(不能小于最小宽高) const minWidth = 100; // 最小宽度 const minHeight = 100; // 最小高度 const newWidth = Math.max(minWidth, startWidth + moveX); const newHeight = Math.max(minHeight, startHeight + moveY); dragDom.style.width = `${newWidth}px`; dragDom.style.height = `${newHeight}px`; }; document.onmouseup = () => { document.onmousemove = null; document.onmouseup = null; }; }; } }; ``` 在main.js中注册: ```javascript import resize from './directives/resize'; Vue.directive('resize-dialog', resize); ``` 在el-dialog上使用: ```vue <el-dialog v-el-drag-dialog v-resize-dialog ...> ... </el-dialog> ``` ### 注意事项 1. 拖拽和改变大小功能可能会影响弹窗的原有样式,需要适当调整样式,比如设置弹窗的`position`为`absolute`(ElementUI默认就是absolute)。 2. 在改变大小时,如果弹窗内容有滚动条,可能需要调整内容区域的高度(例如设置`height: 100%`或使用flex布局)。 3. 边界处理:在拖拽时防止拖出可视区域,改变大小时设置最小宽高。 ### 完整示例 下面是一个完整的Vue组件示例: ```vue <template> <div> <el-button @click="dialogVisible = true">打开弹窗</el-button> <el-dialog title="可拖拽和缩放的弹窗" :visible.sync="dialogVisible" v-el-drag-dialog v-resize-dialog > <div>内容区域</div> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="dialogVisible = false">确 定</el-button> </span> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false }; } }; </script> ``` ### 相关问题 1. 如何限制el-dialog弹窗拖拽的范围? 2. 如何设置el-dialog弹窗改变大小的最小和最大尺寸? 3. 如何保存el-dialog弹窗的位置和大小,以便下次打开时保持上次的状态? 4. 在多个弹窗同时存在时,如何确保拖拽和缩放功能互不干扰?</think>### 在 ElementUI 中实现 el-dialog 弹窗拖拽和拉伸功能 #### 1. 实现拖拽功能 通过自定义指令使弹窗可拖拽(基于引用[1][2]): ```javascript // drag.js export default { bind(el) { const dialogHeader = el.querySelector('.el-dialog__header'); const dragDom = el.querySelector('.el-dialog'); dialogHeader.style.cursor = 'move'; dialogHeader.onmousedown = (e) => { // 计算相对位置 const disX = e.clientX - dialogHeader.offsetLeft; const disY = e.clientY - dialogHeader.offsetTop; document.onmousemove = (e) => { // 计算新位置(限制在可视区域内) const left = e.clientX - disX; const top = e.clientY - disY; dragDom.style.left = `${Math.max(0, left)}px`; dragDom.style.top = `${Math.max(0, top)}px`; }; document.onmouseup = () => { document.onmousemove = null; document.onmouseup = null; }; }; } }; ``` **注册指令**: ```javascript import drag from './drag'; Vue.directive('el-drag-dialog', drag); ``` **使用方式**: ```vue <el-dialog v-el-drag-dialog> ... </el-dialog> ``` --- #### 2. 实现拉伸功能 通过添加缩放手柄实现弹窗尺寸调整(基于引用[3]): ```vue <template> <el-dialog> <!-- 缩放手柄 --> <div class="resize-handle" @mousedown="startResize"></div> </el-dialog> </template> <script> export default { methods: { startResize(e) { const dialog = this.$el.querySelector('.el-dialog'); const startWidth = dialog.offsetWidth; const startHeight = dialog.offsetHeight; const startX = e.clientX; const startY = e.clientY; document.onmousemove = (e) => { // 计算新尺寸(限制最小尺寸) const newWidth = Math.max(400, startWidth + (e.clientX - startX)); const newHeight = Math.max(300, startHeight + (e.clientY - startY)); dialog.style.width = `${newWidth}px`; dialog.style.height = `${newHeight}px`; }; document.onmouseup = () => { document.onmousemove = null; }; } } } </script> <style> .resize-handle { position: absolute; right: 0; bottom: 0; width: 15px; height: 15px; background: url('data:image/svg+xml;utf8,<svg ...></svg>'); /* 缩放图标 */ cursor: se-resize; z-index: 2000; } </style> ``` --- #### 3. 全局样式优化 添加必要的样式支持(基于引用[1][3]): ```css /* 确保弹窗使用绝对定位 */ .el-dialog { position: absolute !important; margin: 0 !important; } /* 拖拽手柄样式 */ .el-dialog__header { cursor: move; padding: 15px 20px; } /* 缩放图标位置 */ .resize-handle { right: 2px; bottom: 2px; } ``` --- #### 完整实现要点 1. **拖拽原理**: - 监听 header 的 `mousedown` 事件 - 通过 `mousemove` 计算弹窗新位置 - 使用 `offsetLeft/Top` 确保位置计算准确 2. **拉伸原理**: - 在右下角添加缩放手柄 - 通过鼠标移动差值计算新尺寸 - 设置 `min-width/min-height` 防止过小 3. **注意事项**: - 弹窗需设置 `position: absolute` - 移除默认的 `margin` 样式 - 缩放后可能需要调整内容区域高度 - 多弹窗场景需使用 `z-index` 管理层级 --- ### 相关问题 1. 如何限制弹窗拖拽不能超出浏览器窗口边界? 2. 实现拖拽功能时如何避免与弹窗表单元素的点击冲突? 3. 如何保存弹窗的位置和尺寸,实现下次打开时保持上次状态? 4. 在多个弹窗叠加的场景下,如何确保拖拽时正确置顶当前弹窗? 5. 如何为弹窗添加最小化和最大化功能(类似引用[1]中的全屏图标)?
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值