【问题标题】:(Bootstrap) Vue Datepicker: How to define start and end date, so that the end date can't be before the start date?(引导程序)Vue Datepicker:如何定义开始和结束日期,使结束日期不能早于开始日期?
【发布时间】:2020-12-08 12:19:25
【问题描述】:

我在 Vue.js 的表单中有两个 BootstrapVue 日期选择器。我想实现一个假期管理器,这样您就可以定义假期的开始(输入 3)和结束日期(输入 4)。结束日期应大于或等于开始日期。我当前的实现如下所示:

<b-form-group
      id="input-group-3"
      label="Anfangsdatum:"
      label-for="input-3"
>
<b-form-datepicker
      id="input-3"
      v-model="von"
      placeholder="Anfangsdatum auswählen"
      required
      :min="minAnfang"
></b-form-datepicker>
</b-form-group>

<b-form-group id="input-group-4" label="Enddatum:" label-for="input-4">
<b-form-datepicker
     id="input-4"
     v-model="bis"
     placeholder="Enddatum auswählen"
     :min="minEnde"
     required
></b-form-datepicker>
</b-form-group>

Vue中的数据部分实现如下:

  data() {
    const datum = new Date();
    const datum_heute = new Date(datum.getFullYear(), datum.getMonth(), datum.getDate());
    
    const minVon = new Date(datum_heute);
    minVon.setDate(minVon.getDate()+ 1);

    const minBis = new Date(datum_heute);
    minBis.setDate(minVon.getDate()+1);

    return {
        Urlaubsart: "",
        Grund: "",
        von: "",
        bis: "",
        Status: "",
        BenutzerID: 24,
        minAnfang: minVon,
        minEnde: minBis,
      arten: [
        { value: null, text: "Wählen Sie die Urlaubsart aus" },
        { value: "Urlaub", text: "Urlaub" },
        { value: "Sonderurlaub", text: "Sonderurlaub" },
      ],
      gruende: [
        { value: "Umzug", text: "Umzug" },
        { value: "Hochzeit", text: "Hochzeit" },
        { value: "Geburt", text: "Geburt" },
        { value: "Umzug", text: "Sonstiges" },
      ],
      Urlaubstage: "",
    };
  }

那么如何确保结束日期等于或大于开始日期?

【问题讨论】:

  • 一种选择是使用 get/set 将结束日期设为计算属性,如下所述:vuejs.org/v2/guide/computed.html#Computed-Setter 在设置期间,您可以检查输入并与开始日期进行比较。更好的是:在get中做check,当开始日期改变时,结束日期也会改变。
  • 你能提供一个代码sn-p吗?我真的不明白你的意思。

标签: javascript vue.js datepicker bootstrap-vue


【解决方案1】:

我为你创建了一个代码笔:https://codepen.io/mtveerman/pen/gOwwNoL (注意我使用 vuetify 作为布局引擎,但你会明白的)

我做了什么:

  • 定义一个internalBis 属性
  • 使用getset 函数定义计算的bis 属性:
  • set函数中设置internalBis属性
  • 比较get函数中的voninternalBis,如果internalBis小于von,则返回von

在您的组件和表单提交中,您应该只使用bis,因为它总是会返回正确的值。请注意,如果 von 现在更改为原始 bis 之后的日期,bis 也会自动更改。

对你来说,最有趣的代码是这样的:

data: () => ({
     von: new Date().toISOString().substr(0, 10),
     internalBis: new Date().toISOString().substr(0, 10)
  }),
  computed: {
    bis: {
      // getter
      get: function () {
        if (this.internalBis < this.von) {
          return this.von
        }
        return this.internalBis
      },
      // setter
      set: function (newValue) {
        this.internalBis = newValue
      }
    }
  }

【讨论】:

  • 渲染时出现错误:“InternalError: too much recursion”。我从数据中删除了 bis 属性并将其添加到计算中。我还删除了 minBis 属性和 minEnde。代码如下:computed: { bis: { get: function () { if (this.bis &lt; this.von) { return this.von } return this.bis }, set: function(newValue) { this.bis = newValue } } }
  • 不,看看我的代码。我使用internalBis 是有原因的。您不能在 setter 中设置 this.bis,因为这将递归调用 setter。
  • 好的,谢谢!现在它可以工作了,所以当我选择一个 von 日期时,bis 日期等于 von 日期,但仍然可以选择一个 bis 日期,即在 von 日期之前..
  • 好吧,您需要使用:min 属性,例如将其设置为:min="von",或者为此创建另一个计算属性,在此您返回von + 1 天.
  • 我已经更新了codepen来告诉你原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2012-08-19
  • 2016-11-03
  • 2018-03-06
  • 1970-01-01
相关资源
最近更新 更多