整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框

lement Plus 的 Dialog 组件默认情况下,点击遮罩层(即背景蒙版)会关闭对话框。然而,你可以通过修改组件的 close-on-click-modal 属性来改变这个行为。

如果你想要实现点击遮罩层不关闭 Dialog,你需要将 close-on-click-modal 属性设置为 false。这可以在组件的局部设置中进行,也可以全局配置。

局部设置

在 Dialog 组件的模板中,直接添加 :close-on-click-modal="false":

<el-dialog  
  :visible.sync="dialogVisible"  
  :close-on-click-modal="false"  
  width="50%">  
  <!-- 对话框内容 -->  
</el-dialog>

全局配置

如果你希望所有 Dialog 组件都默认拥有这个行为,你可以通过全局配置来实现。在 Vue 应用的入口文件(通常是 main.js 或 main.ts)中,配置 Element Plus 并修改 ElDialog 组件的默认属性:

import { createApp } from 'vue';  
import ElementPlus from 'element-plus';  
import 'element-plus/lib/theme-chalk/index.css';  
import App from './App.vue';  
  
const app = createApp(App);  
  
app.use(ElementPlus);  
  
// 全局配置 Dialog 组件,使得点击遮罩层不关闭弹窗  
app.config.globalProperties.$ELEMENT = {  
  size: 'small', // 其他全局配置...  
  zIndex: 3000 // 其他全局配置...  
};  
  
// 修改 ElDialog 组件的 closeOnClickModal 属性的默认值  
app._context.components.ElDialog.props.closeOnClickModal.default = false;  
  
app.mount('#app');

请注意,直接修改 app._context.components.ElDialog.props.closeOnClickModal.default 并不是官方推荐的做法,因为这涉及到对 Vue 内部状态的直接操作,未来 Vue 或 Element Plus 的更新可能会导致此方法失效。不过,在 Element Plus 的当前版本中,这是一个可行的方法。

更好的方式是使用 Element Plus 的自定义主题功能或者等待 Element Plus 官方提供更为正式的全局配置 API。同时,也要关注 Element Plus 的更新日志,以便及时调整你的代码。

如果你发现你的 Dialog 组件在设置了 close-on-click-modal="false" 后仍然会在点击遮罩层时关闭,可能是因为你的项目中存在其他代码或插件影响了这个行为。这时,你需要检查你的项目代码,确保没有其他地方在修改这个属性,或者查看是否有其他事件监听器在监听遮罩层的点击事件并触发了关闭操作。

文由掘金@天行天忌授权发布,前端晚间课对其内容进行微改。


HTML,超文本标记语言,是一种用于创建网页的标准标记语言。自从引入 HTML 以来,它就一直用于构建互联网。与 JavaScript 和 CSS 一起,HTML 构成前端开发的三剑客。

尽管许多新技术使网站创建过程变得更简单、更高效,但 HTML 始终是核心。随着 HTML5 的普及,在 2014 年,这种标记语言发生了很多变化,变得更加友好,浏览器对新标准的支持热度也越来越高。而HTML并不止于此,还在不断发生变化,并且可能会获得一些特性来证明对 HTML6 的命名更改是合理的。

支持原生模式

该元素<dialog> 将随 HTML6 一起提供。它被认为等同于用 JavaScript 开发的模态,并且已经标准化,但只有少数浏览器完全支持。但这种现象会改变,很快它将在所有浏览器中得到支持。

这个元素在其默认格式下,只会将光标显示在它所在的位置上,但可以使用 JavaScript 打开模式。

<dialog>
  <form method="dialog">
    <input type="submit" value="确定" />
    <input type="submit" value="取消" />
  </form>
</dialog>

在默认形式下,该元素创建一个灰色背景,其下方是非交互式内容。

可以在 <dialog> 其中的表单上使用一种方法,该方法将发送值并将其传递回自身 <dialog>

总的来说,这个标签在用户交互和改进的界面中变得有益。

可以通过更改 <dialog> 标签的 open 属性以控制打开和关闭。

<dialog open>
  <p>组件内容</p>
</dialog>

没有 JavaScript 的单页应用程序

FutureClaw 杂志主编 Bobby Mozumder 建议:

将锚元素链接到 JSON/XML、API 端点,让浏览器在内部将数据加载到新的数据结构中,然后浏览器将 DOM 元素替换为根据需要加载的任何数据。初始数据(以及标准错误响应)可以放在标题装置中,如果需要,可以稍后替换。

据他介绍,这是单页应用程序网页设计模式,可以提高响应速度和加载时间,因为不需要加载 JavaScript。

这个是一个比较有意思的提案,就有点类似我们以前没有做前后端分离之前的混合编程的模式,HTML变成模板语言,通过JSON API请求数据,不一样的是变成浏览器来默认解析,浏览器内部加载数据到新的数据结构中,然后浏览器将按需加载到的数据替换成 DOM 元素

大家可以看一下InfoQ上的这篇文章《针对非正式 HTML6 提案“无需 JavaScript 的单页应用”引发的论战》,了解更多!

https://www.infoq.cn/article/2015/03/html6-without-javascript


自由调整图像大小

HTML6 爱好者相信即将到来的更新将允许浏览器调整图像大小以获得更好的观看体验。

每个浏览器都难以呈现相对于设备和屏幕尺寸的最佳图像尺寸,不幸的是,src 标签 img 在处理这个问题时不是很有效。

这个问题可以通过一个新标签 <srcset> 来解决,它使浏览器在多个图像之间进行选择的工作变得更加容易。

专用库

将可用库引入 HTML6 绝对是提高开发效率的重要一步。

微格式

很多时候,需要在互联网上定义一般信息,而这些一般信息可以是任何公开的信息,例如电话号码、姓名、地址等。微格式是能够定义一般数据的标准。微格式可以增强设计者的能力,并可以减少搜索引擎推断公共信息所需的努力。

自定义菜单

尽管标签<ul>、<ol>非常有用,但在某些情况下仍有一些不足之处。可以处理交互元素的标签将是一个不错的选择。

这就是创建标签 <menu> 的驱动力,它可以处理按钮驱动的列表元素。

<menu type="toolbar">
  <li><button>个人信息</button></li>
  <li><button>系统设置</button></li>
  <li><button>账号注销</button></li>
</menu>

因此 <menu>,除了能够像普通列表一样运行之外,还可以增强 HTML 列表的功能。

增强身份验证

虽然HTML5在安全性方面还不错,浏览器和网络技术也提供了合理的保护。毫无疑问,在身份验证和安全领域还有很多事情可以做。如密钥可以异地存储;这将防止不受欢迎的人访问并支持身份验证。使用嵌入式密钥而不是 cookie,使数字签名更好等。

集成摄像头

HTML6 允许以更好的方式使用设备上的相机和媒体。将能够控制相机、它的效果、模式、全景图像、HDR 和其他属性。

总结

没有什么是完美的,HTML 也不是完美的,所以 HTML 规范可以做很多事情来使它更好。应该对一些有用的规范进行标准化,以增强 HTML 的能力。小的变化已经开始推出。如增强蓝牙支持、p2p 文件传输、恶意软件保护、云存储集成,下一个 HTML 版本可以考虑一下。

弹出模态框,常用于消息提示、消息确认,或在当前页面内完成特定的交互操作。

弹出框组件支持函数调用和组件调用两种方式。



函数调用

Dialog 是一个函数,调用后会直接在页面中弹出相应的模态框。

import { Dialog } from 'vant';

Dialog({ message: '提示' });

组件调用

通过组件调用 Dialog 时,可以通过下面的方式进行注册:

import Vue from 'vue';
import { Dialog } from 'vant';

// 全局注册
Vue.use(Dialog);

// 局部注册
export default {
  components: {
    [Dialog.Component.name]: Dialog.Component,
  },
};

代码演示

消息提示

用于提示一些消息,只包含一个确认按钮。

Dialog.alert({
  title: '标题',
  message: '弹窗内容',
}).then(() => {
  // on close
});

Dialog.alert({
  message: '弹窗内容',
}).then(() => {
  // on close
});

消息确认

用于确认消息,包含取消和确认按钮。

Dialog.confirm({
  title: '标题',
  message: '弹窗内容',
})
  .then(() => {
    // on confirm
  })
  .catch(() => {
    // on cancel
  });

异步关闭

通过 beforeClose 属性可以传入一个回调函数,在弹窗关闭前进行特定操作。

function beforeClose(action, done) {
  if (action === 'confirm') {
    setTimeout(done, 1000);
  } else {
    done();
  }
}

Dialog.confirm({
  title: '标题',
  message: '弹窗内容',
  beforeClose,
});

全局方法

引入 Dialog 组件后,会自动在 Vue 的 prototype 上挂载 $dialog 方法,在所有组件内部都可以直接调用此方法。

export default {
  mounted() {
    this.$dialog.alert({
      message: '弹窗内容',
    });
  },
};

组件调用

如果需要在弹窗内嵌入组件或其他自定义内容,可以使用组件调用的方式。

<van-dialog v-model="show" title="标题" show-cancel-button>
  <img src="https://img.yzcdn.cn/vant/apple-3.jpg" />
</van-dialog>
export default {
  data() {
    return {
      show: false,
    };
  },
};

API

方法

方法名说明参数返回值Dialog展示弹窗optionsPromiseDialog.alert展示消息提示弹窗optionsPromiseDialog.confirm展示消息确认弹窗optionsPromiseDialog.setDefaultOptions修改默认配置,对所有 Dialog 生效optionsvoidDialog.resetDefaultOptions重置默认配置,对所有 Dialog 生效-voidDialog.close关闭弹窗-void

Options

通过函数调用 Dialog 时,支持传入以下选项:

参数说明类型默认值title标题string-width v2.2.7弹窗宽度,默认单位为pxnumber | string320pxmessage文本内容,支持通过\n换行string-messageAlign内容对齐方式,可选值为left rightstringcenterclassName自定义类名any-showConfirmButton是否展示确认按钮booleantrueshowCancelButton是否展示取消按钮booleanfalseconfirmButtonText确认按钮文案string确认confirmButtonColor确认按钮颜色string#1989facancelButtonText取消按钮文案string取消cancelButtonColor取消按钮颜色stringblackoverlay是否展示遮罩层booleantrueoverlayClass v2.2.7自定义遮罩层类名string-overlayStyle v2.2.7自定义遮罩层样式object-closeOnPopstate v2.0.5是否在页面回退时自动关闭booleanfalsecloseOnClickOverlay是否在点击遮罩层后关闭弹窗booleanfalselockScroll是否锁定背景滚动booleantrueallowHtml v2.8.7是否允许 message 内容中渲染 HTMLbooleantruebeforeClose关闭前的回调函数,
调用 done() 后关闭弹窗,
调用 done(false) 阻止弹窗关闭(action, done) => void-transition v2.2.6动画类名,等价于 transtion 的name属性string-getContainer指定挂载的节点,用法示例string | () => Elementbody

Props

通过组件调用 Dialog 时,支持以下 Props:

参数说明类型默认值v-model是否显示弹窗boolean-title标题string-width v2.2.7弹窗宽度,默认单位为pxnumber | string320pxmessage文本内容,支持通过\n换行string-message-align内容对齐方式,可选值为left rightstringcentershow-confirm-button是否展示确认按钮booleantrueshow-cancel-button是否展示取消按钮booleanfalseconfirm-button-text确认按钮文案string确认confirm-button-color确认按钮颜色string#1989facancel-button-text取消按钮文案string取消cancel-button-color取消按钮颜色stringblackoverlay是否展示遮罩层booleantrueoverlay-class v2.2.7自定义遮罩层类名string-overlay-style v2.2.7自定义遮罩层样式object-close-on-popstate v2.0.5是否在页面回退时自动关闭booleanfalseclose-on-click-overlay是否在点击遮罩层后关闭弹窗booleanfalselazy-render是否在显示弹层时才渲染节点booleantruelock-scroll是否锁定背景滚动booleantrueallow-html v2.8.7是否允许 message 内容中渲染 HTMLbooleantruebefore-close关闭前的回调函数,
调用 done() 后关闭弹窗,
调用 done(false) 阻止弹窗关闭(action, done) => void-transition v2.2.6动画类名,等价于 transtion 的name属性string-get-container指定挂载的节点,用法示例string | () => Element-

Events

通过组件调用 Dialog 时,支持以下事件:

事件说明回调参数confirm点击确认按钮时触发-cancel点击取消按钮时触发-open打开弹窗时触发-close关闭弹窗时触发-opened打开弹窗且动画结束后触发-closed关闭弹窗且动画结束后触发-

Slots

通过组件调用 Dialog 时,支持以下插槽:

名称说明default自定义内容title自定义标题