如何通过自定义指令实现ElementUI消息框的拖拽功能?

ElementUI 消息框拖拽功能自定义指令实现详解

本文将详细介绍如何通过自定义指令,为elementui的el-message-box组件添加拖拽功能,解决产品需求中所有错误消息弹窗可拖拽的问题。现有代码中,错误消息弹窗通过this.$showalert.showerrormsg(errmsg)方法弹出。

如何通过自定义指令实现ElementUI消息框的拖拽功能?

一、创建自定义指令

在项目src目录下创建directive/el-drag-dialog文件夹,包含drag.jsindex.js两个文件,分别封装指令逻辑和注册指令。

二、编写指令代码

drag.js (核心拖拽逻辑):

export default {  bind(el, binding, vnode) {    const dialogHeader = el.querySelector('.el-dialog__header');    const dialog = el.querySelector('.el-dialog');    dialogHeader.style.cursor = 'move';    dialog.style.top = '0px';    const getStyle = (function() {      if (window.document.currentStyle) {        return (dom, attr) => dom.currentStyle[attr];      } else {        return (dom, attr) => window.getComputedStyle(dom, null)[attr];      }    })();    dialogHeader.onmousedown = (e) => {      const disX = e.clientX - dialogHeader.offsetLeft;      const disY = e.clientY - dialogHeader.offsetTop;      const dragWidth = dialog.offsetWidth;      const dragHeight = dialog.offsetHeight;      const screenWidth = document.body.clientWidth;      const screenHeight = document.body.clientHeight;      let minLeft = 0;      let maxLeft = screenWidth - dragWidth;      let minTop = 0;      let maxTop = screenHeight - dragHeight;      let originalLeft = parseInt(getStyle(dialog, 'left'), 10) || 0;      let originalTop = parseInt(getStyle(dialog, 'top'), 10) || 0;      document.onmousemove = (e) => {        let left = e.clientX - disX + originalLeft;        let top = e.clientY - disY + originalTop;        left = Math.max(minLeft, Math.min(left, maxLeft));        top = Math.max(minTop, Math.min(top, maxTop));        dialog.style.left = `${left}px`;        dialog.style.top = `${top}px`;        vnode.child.$emit('dragDialog'); // 触发自定义事件      };      document.onmouseup = () => {        document.onmousemove = null;        document.onmouseup = null;      };    };  },};

index.js (指令注册):

import drag from './drag';const install = (Vue) => {  Vue.directive('el-drag-dialog', drag);};if (typeof window !== 'undefined' && window.Vue) {  window.elDragDialog = drag;  window.Vue.use(install);}drag.install = install;export default drag;

三、在组件中使用指令

导入指令: 在需要使用拖拽功能的组件中导入自定义指令:

import elDragDialog from '@/directive/el-drag-dialog';

应用指令:el-dialog组件上添加v-el-drag-dialog指令:

  

监听事件 (可选): 在组件中监听dragDialog事件,以便在拖拽结束后执行其他操作:

  methods: {  onDragEnd() {    console.log('Dialog drag ended');    // 在这里添加拖拽结束后的操作  }}

通过以上步骤,即可实现ElementUI消息框的拖拽功能。 请根据你的项目实际路径调整导入路径。 代码已优化,处理了边界情况和初始位置,并添加了自定义事件dragDialog方便后续扩展。

以上就是如何通过自定义指令实现ElementUI消息框的拖拽功能?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1563457.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月22日 08:20:17
下一篇 2025年12月22日 08:20:31

相关推荐

  • Vue组件选项卡如何动态创建多个相同组件实例?

    利用vue组件和选项卡动态渲染多个组件实例 本文介绍如何使用Vue.js创建动态选项卡,并在每个选项卡中渲染同一个组件的不同实例,每个实例接收不同的参数。我们将分析一个实际案例并提供解决方案。 问题描述: 用户希望通过选项卡(例如,使用Element UI的el-radio-group)动态加载和显…

    2025年12月22日
    000
  • Vue组件中如何优雅地实现动态节点渲染?

    vue组件中优雅的动态节点渲染 在Vue.js开发中,灵活控制组件内容至关重要。本文剖析一段代码,它利用Vue的条件渲染和动态属性,实现了优雅的动态节点渲染。 核心代码: 其中,title是传入组件的prop属性。让我们分析其工作机制: 立即学习“前端免费学习笔记(深入)”; 首先,v-if=”ty…

    2025年12月22日
    000
  • 页面刷新时onload事件何时触发?div元素能用onload事件吗?

    页面刷新与onload事件以及div元素的onload事件详解 本文分析onload事件在页面刷新时的执行时机,以及div元素是否支持onload事件。 onload事件仅在页面所有DOM元素和依赖资源(如样式表、图片)加载完成后触发。因此,页面刷新时,除非浏览器缓存了页面内容或使用了非强制刷新方式…

    2025年12月22日
    000
  • Vue 3 + Vite 项目中,.ts 文件缺失 .d.ts 类型声明文件如何解决?

    vue 3 + vite 项目:解决 .ts 文件缺少 .d.ts 类型声明文件的问题 在使用 Vue 3 和 Vite 开发项目时,你可能会遇到一个常见问题:你的 .ts 文件没有生成对应的 .d.ts 类型声明文件,导致在 .vue 文件中引入 .ts 文件时出现错误。本文将分析这个问题的原因并…

    2025年12月22日
    000
  • 如何在Vuex中访问Vue路由的元数据?

    在vue应用中访问路由元数据:vuex与路由信息的结合 在开发Vue.js应用时,常常需要在Vuex store等JavaScript文件中获取当前路由信息,例如路由元数据(meta)。本文将演示如何在Vuex中便捷地访问这些元数据。 问题:如何有效获取当前路由的meta信息并在Vuex中使用? 解…

    2025年12月22日
    000
  • 浏览器究竟渲染的是什么:HTML、CSS,还是JavaScript的动态产物?

    浏览器渲染页面的本质是什么? 学习前端开发的过程中,一个常见疑问是:无论使用JavaScript、Vue、React还是其他框架,浏览器最终呈现的页面,是不是仅仅是HTML和CSS的简单组合?这些框架和技术,只是改变了HTML代码的生成方式吗? 答案并非绝对。虽然最终显示在浏览器上的确是HTML、C…

    2025年12月22日
    000
  • Vue项目中Axios拦截器无法获取响应头token,是什么原因?

    vue项目使用axios访问后端接口时,开发者工具显示响应头包含token,但axios拦截器却无法获取,这可能是由以下几个原因导致的: 首先,请仔细检查拦截器中打印的response对象和response.headers是否正确。建议打印完整的response对象以及{…res.headers…

    2025年12月22日
    000
  • Vue组件选项卡如何实现多个组件实例的动态显示并保持独立状态?

    使用vue组件和选项卡动态显示多个组件实例并保持独立状态 本文介绍如何利用Vue的component标签和选项卡组件(示例中使用Element UI的el-radio-group和el-radio-button模拟),实现动态显示多个相同组件的实例,并为每个实例传递不同的参数,确保每个实例状态独立。…

    2025年12月22日
    000
  • Vue3+Vite项目中TypeScript类型声明文件缺失该如何解决?

    vue3 + vite项目:解决typescript类型声明文件缺失问题 在使用Vue3和Vite构建项目时,开发者经常遇到TypeScript(.ts)源文件无法生成对应的类型声明文件(.d.ts)的问题,导致在.vue组件中引入.ts文件时编译错误。本文将分析问题原因并提供多种解决方案。 问题:…

    2025年12月22日
    000
  • Vue3中如何高效校验非表单元素并精准定位错误?

    vue3非表单元素校验与错误精准定位 本文介绍如何在Vue3应用中有效校验非表单元素,并在校验失败时精确定位错误DOM节点并显示错误信息。 问题源于用户保存数据时需要校验,但校验触发在父组件,校验逻辑在子组件,使用自定义指令监听父组件变量时出现响应式问题。 用户尝试使用自定义指令监听父组件布尔变量触…

    2025年12月22日
    000
  • Vue3+Vite项目中TypeScript声明文件(.d.ts)缺失如何解决?

    vue3 + vite项目:解决typescript声明文件(.d.ts)缺失问题 在使用Vue 3和Vite开发项目时,您可能会遇到在.vue文件中引入.ts文件后,编译器无法生成对应的.d.ts声明文件,导致TypeScript编译报错的情况。本文将分析此问题并提供解决方案。 问题: 在.vue…

    2025年12月22日
    000
  • Vue项目中按钮点击导出两个文件,为何有时只导出一个?

    vue项目按钮点击导出两个文件,有时只导出一个? 本文分析了在Vue项目中,点击按钮导出两个文件时,有时只导出一个文件的问题。该问题可能源于接口调用方式、浏览器兼容性以及资源释放等方面。 问题场景:开发者希望通过一个按钮点击事件,调用两个接口获取数据,并分别导出两个文件。然而,实际情况是导出结果不稳…

    2025年12月22日
    000
  • Vue项目中如何动态设置Element UI表格表头显示“上周”和“本周”?

    本文介绍如何在vue项目中使用element ui框架,动态设置表格表头显示“上周”和“本周”。 通过结合element ui的el-table-column组件的动态属性和javascript代码,实现灵活的表头配置。 核心思路是:利用JavaScript计算上周和本周的日期范围,并将结果动态绑定…

    2025年12月22日
    000
  • Vue中如何高效清除keep-alive缓存中指定的组件?

    高效清除vue keep-alive缓存中指定组件的方法 在Vue应用中,结合keep-alive和component组件构建带移除选项卡的管理页面时,需要动态清除指定组件的缓存。本文将详细讲解如何根据page_id清除keep-alive缓存中的特定组件。 核心问题在于如何精准控制keep-ali…

    2025年12月22日
    000
  • SVG动画如何实现参数化文本传递?

    svg动画参数化文本传递详解 在SVG动画中,如果文本内容是固定的,可以使用标签提高效率。但动态文本内容则需要其他方法。本文将介绍如何通过参数传递,动态改变SVG文本内容并实现复用。 关键在于将外部变量传递到SVG文本元素。直接在SVG代码中硬编码文本显然不适合动态变化的需求。解决方案依赖于Java…

    2025年12月22日
    000
  • Vue.js中如何从Vuex Store访问当前路由的元数据?

    在vue.js应用中获取并使用路由元数据 本文介绍如何在Vue.js应用中,特别是Vuex store内,访问当前路由的元数据(meta)。这对于构建更动态和响应式的应用至关重要。 核心在于获取Vue Router的当前路由实例。Vue Router 提供 router.currentRoute 属…

    2025年12月22日
    000
  • 页面刷新时onload事件的执行时机及与DOM元素的关系是什么?

    页面刷新时onload事件的执行时机 本文将探讨onload事件在页面刷新时的执行情况,以及body和div元素各自的onload事件的执行顺序。 onload事件会在整个页面(包括所有DOM元素、样式表和图片等外部资源)加载完成后触发。 因此,回答第一个问题,刷新页面时,onload事件一定会执行…

    好文分享 2025年12月22日
    000
  • Vue.js中:如何在Vuex Store或其他JS文件中访问路由元数据?

    在vue.js应用中,高效访问路由元数据(meta)的方法详解 许多Vue.js开发者在构建应用时,经常需要在Vuex store或其他JavaScript文件中获取当前路由的元数据信息。本文将详细介绍如何在Vuex或其他JS文件中便捷地访问这些元数据,并解决常见问题。 核心在于利用Vue Rout…

    2025年12月22日
    000
  • 如何在SVG动画中实现文本内容的参数化复用?

    svg文本动画的参数化复用:高效创建动态文本 本文探讨如何在SVG动画中实现文本内容的参数化复用,避免重复代码并提高效率。 虽然标签能复用静态元素,但它无法直接用于动态改变文本内容。 问题:如何像复用静态元素一样,复用带有不同文本内容的SVG文本元素? 目标是通过参数传递来改变文本内容。 解决方案:…

    2025年12月22日
    000
  • Vue.js条件渲染页面闪烁:如何用v-cloak指令解决?

    vue.js 条件渲染中的页面闪烁问题及解决方案 在使用 Vue.js 进行开发时,常常会遇到利用 v-if 和 v-else 进行条件渲染的情况。然而,初次加载页面时,有时会出现短暂的闪烁现象,即在最终渲染结果显示之前,会先显示未渲染的 DOM 结构,影响用户体验。 这篇文章将针对这个问题,探讨其…

    好文分享 2025年12月22日
    000

发表回复

登录后才能评论
关注微信