在MessageBox中使用el-date-picker实现互动时间选择

516 阅读3分钟

在前端开发中,UI 组件的封装和使用方式对用户交互体验至关重要。Vue.js 提供了许多便捷的工具,帮助开发者创建高效且响应式的用户界面。作为 Vue.js 中最受欢迎的组件库之一,Element UI 提供了丰富的表单组件,其中 el-date-picker它支持多种日期格式、日期范围选择、时间选择等功能,极大地方便了开发者的使用,满足了大多数日期时间选择的需求。然而,在某些特殊场景下,如在msgbox中直接使用 el-date-picker 可能会遇到响应效果丧失的问题。本文将探讨如何将 el-date-picker 嵌入到 msgbox 中,并实现一个动态、响应式的时间选择器。

一、背景与需求

通常情况下,日期选择器是独立的组件,并通过点击按钮或表单提交来触发。但在某些特定场景下,我们可能希望将日期选择功能集成到弹出框(例如 msgbox)中,提供一种更直观和互动性强的方式来选择时间。为了实现这一功能,我们需要使用 Element UI 的 el-date-pickerthis.$msgbox 来封装并展示时间选择框。

需求

  • msgbox 弹框中嵌套 el-date-picker
  • 禁止用户选择当前时间之前的日期和时间。
  • 保证日期选择器的值能正确绑定和更新。

二、基本结构

首先,我们在 Vue 组件的 data 中定义了一个响应式的 selectedDateTime 用于存储用户选择的日期和时间。此外,我们还为 el-date-picker 定义了禁用选择当前日期之前的时间的配置。

data() {
  return {
    selectedDateTime: '',
    pickerOptions: {
      disabledDate(time) {
        return time.getTime() < Date.now(); // 禁用今天以前的日期
      }
    }
  };
},

selectedDateTime 变量用于保存用户选择的时间,pickerOptions 中的 disabledDate 方法用来禁用过去的日期。

三、msgbox 的使用

this.$msgbox 是 Element UI 提供的一种弹框工具,能够动态地弹出对话框。在这个例子中,我们将通过 this.$msgbox 来创建一个弹窗,并将 el-date-picker 嵌套在弹窗中,让用户在弹窗内选择日期时间。

editTime() {
  const h = this.$createElement;
  var that = this;

  this.$msgbox({
    title: '时间选择',
    message: h(
      Vue.component('msgboxDatePicker', {
        render(h) {
          return h('div', null, [
            h('el-date-picker', {
              props: {
                value: that.selectedDateTime,
                'value-format': 'yyyy-MM-dd HH:mm',
                format: 'yyyy-MM-dd HH:mm',
                type: 'datetime', // 设置为时间选择器
                placeholder: '请选择日期时间',
                pickerOptions: that.pickerOptions
              },
              on: {
                input: v => {
                  that.selectedDateTime = v;
                },
                change: v => {
                  console.log(v);
                }
              }
            })
          ]);
        }
      })
    ),
    showCancelButton: true,
    closeOnClickModal: false,
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    beforeClose: (action, instance, done) => {
      if (action === 'confirm' && !that.selectedDateTime) {
        this.$message.warning('请先选择时间');
        return;
      }
      done();
    }
  })
    .then(() => {
      that.$message.success(`你选择的时间是:${that.selectedDateTime}`);
    })
    .catch(() => {});
}

在这个方法中,我们首先通过 h 函数动态创建一个包含 el-date-picker 的 Vue 组件。

el-date-picker 的配置项包括:

  • value: 绑定了 selectedDateTime,表示当前选中的时间。
  • formatvalue-format: 分别设置了时间的显示格式和返回格式。
  • type: 'datetime': 表示这是一个日期时间选择器。
  • pickerOptions: 通过 pickerOptions 设置了禁用过去日期的功能。

on: { input: ... }change: ... 事件用来监听用户的操作,并将时间更新到 selectedDateTime 中。

四、禁用选择过去的日期

在日期选择器中,禁用过去的日期通常是一个常见需求。我们通过 pickerOptions 对象中的 disabledDate 方法实现这一点。

pickerOptions: {
  disabledDate(time) {
    return time.getTime() < Date.now(); // 禁用今天以前的日期
  }
}

这里的 disabledDate 方法会判断传入的 time 参数是否小于当前时间的时间戳,如果小于则禁用该日期。这可以有效避免用户选择未来时间之前的日期。

五、弹窗关闭与确认

在弹窗的 beforeClose 钩子函数中,我们做了一些额外的验证。当用户点击确定按钮时,我们需要确保用户选择了有效的日期时间。如果没有选择日期,我们将弹出警告提示。

beforeClose: (action, instance, done) => {
  if (action === 'confirm' && !that.selectedDateTime) {
    this.$message.warning('请先选择时间');
    return;
  }
  done();
}

如果没有选择时间,this.$message.warning 会提示用户选择时间,然后阻止弹窗关闭。否则,弹窗将关闭,并在 then 方法中显示选中的时间。

六、总结

通过结合使用 el-date-pickermsgbox,我们成功的在 Vue.js 中创建了一个集成时间选择器的弹框。这个方法在特定的场景下能够带来良好的用户体验。开发者可以根据具体需求,进一步扩展这个功能,例如设置日期范围、禁用某些特定日期等。