关于Vue3中,element-plus的el-dialog对话框无法显示的可能原因。

最近今天在写一个停车场管理系统的项目时,在用vue3写前端时,在前端模板选择上,我一时脑抽,突然决定放弃SpringBoot,选择了以前几乎很少用的element-plus,然后果不其然,错误连连。最让我头疼的,就是dialog对话框无法显示的原因。

第一个原因:忘记将默认值修改为true。
简单说下逻辑,在element-plus中,你需要在data()方法中定义一个‘dialogVisible’值,不是dialogVisible也行,官网是这么定义的,其实就算你定义成‘wdnmd’也没有任何问题,如如:

data() {
 return {
   form: {},
   wdnmd: false
 }
},


这个'wdnmd'就相当于是否显示对话框的钥匙,默认定义为 false,就是不显示,一般dialog对话框不显示的原因,大概率就是你忘记在按钮的方法中wdnmd修改为true.例如:

methods: {
 editUser() {
   wdnmd = true
 },


第二个原因:将 :visible.sync="wdnmd"修改为v-model="wdnmd"(也是最蛋疼的一个原因)
例如:

<el-dialog  title="编辑"  :visible.sync="wdnmd" width="30%">
   <el-button @click="wdnmd = false">取消</el-button>
     <el-button type="primary" @click="save">修改</el-button>
     </span>
 </template>
</el-dialog>


修改为:

<el-dialog  title="编辑" v-model="wdnmd" width="30%">
   <el-button @click="wdnmd = false">取消</el-button>
     <el-button type="primary" @click="save">修改</el-button>
     </span>
 </template>
</el-dialog>


这是element-plus最新修改的用法,如果你是从网上或者ai那里弄来的代码,大概率是一脸懵逼(没错,我就是这样),这是最近半年左右element-plus更新的用法,智障ai和网上的大部分源码都远离这个时间段,甚至是用vue2。

总结
如果以后在遇到这样搞不清楚的问题,记得先从基础开始,也就是从官网开始。

我简单说下我解决这个问题的过程,先是debug,在控制台确认wdnmd的值确实被修改为true,我便开始怀疑不是我个人的问题,于是我开始上网搜索,网上的答案都试过,没有用后,进入element-plus官网,找到对应的el-dialog用法,将官方的模板在自己的电脑上跑一下,然后依次对比错误的代码,就是改一段测一段,最后找到了这个问题。

总之,找到代码错在何处,大部分看官网就完事了。 作者:怠惰の于 https://www.bilibili.com/read/cv23518098 出处:bilibili

### 创建自定义指令实现 `el-dialog` 缩放功能 为了实现在 Vue 3Element Plus 中创建自定义指令以支持 `el-dialog` 组件的缩放功能,可以遵循以下方法: #### 自定义指令设计思路 通过绑定自定义指令到 `.el-dialog__wrapper` 或者特定于对话框的内容区域,允许用户点击并拖动指定的手柄(通常是四角之一)来改变对话框尺寸。考虑到用户体验和交互逻辑,需确保当用户在特殊 HTML 元素上释放鼠标按钮时仍能正常结束拖拽操作[^1]。 #### 关键点处理 - **样式调整**:移除默认设置中的 `right` 和 `bottom` 属性,仅保留 `left` 和 `top` 来定位对话框的位置。 - **边界检测**:保证用于触发拖拽行为的元素始终位于视口内可见范围之内,防止因超出屏幕而造成良体验。 - **解决 onmouseup 失效问题**:针对某些情况下无法捕获 `onmouseup` 事件的问题,可以通过监听全局文档级别的 `mouseup` 事件作为替代方案,从而确保即使是在非标准元素处松开鼠标也能正确终止当前的操作流程。 #### 实现代码示例 下面是一个简单的例子展示如何利用 Vue 3 的 Composition API 结合自定义指令完成上述需求: ```javascript import { DirectiveBinding } from &#39;vue&#39;; export default { mounted(el: HTMLElement, binding: DirectiveBinding) { let startX = 0; let startY = 0; let startWidth = 0; let startHeight = 0; const resizeHandler = (e: MouseEvent) => { e.preventDefault(); // 更新宽度高度 el.style.width = `${startWidth + e.clientX - startX}px`; el.style.height = `${startHeight + e.clientY - startY}px`; // 设置最大最小宽高限制 if(parseInt(el.style.width)<200){ el.style.width=&#39;200px&#39; } if(parseInt(el.style.height)<200){ el.style.height=&#39;200px&#39; } // 发布更新后的尺寸给父组件或其他地方使用 binding.value && typeof binding.value === "function" && binding.value({ width: parseInt(el.style.width), height: parseInt(el.style.height)}); }; const mouseUpHandler = () => { document.removeEventListener(&#39;mousemove&#39;, resizeHandler); document.removeEventListener(&#39;mouseup&#39;, mouseUpHandler); }; const handleMouseDown = (event: MouseEvent) => { startX = event.clientX; startY = event.clientY; startWidth = parseFloat(getComputedStyle(el).width.replace(&#39;px&#39;,&#39;&#39;)); startHeight = parseFloat(getComputedStyle(el).height.replace(&#39;px&#39;,&#39;&#39;)); // 添加移动和抬起事件监听器至整个document对象 document.addEventListener(&#39;mousemove&#39;, resizeHandler); document.addEventListener(&#39;mouseup&#39;, mouseUpHandler); // 阻止冒泡影响其他元素 event.stopPropagation(); }; // 将mousedown事件绑定到目标元素上 el.querySelector(&#39;.resize-handle&#39;)?.addEventListener(&#39;mousedown&#39;, handleMouseDown); // 移除原有样式中可能干扰布局的属性 Object.assign(el.style,{ position:&#39;absolute&#39;, right:&#39;unset&#39;,// 只保留left/top两个方向上的绝对定位 bottom:&#39;unset&#39;// 同理取消底部固定 }); }, }; ``` 此段代码展示了如何构建一个能够响应鼠标的按下、移动以及释放动作来自由调节 `el-dialog` 对话框大小的功能模块。需要注意的是实际应用过程中还需要考虑更多细节如动画过渡效果的支持等。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值