Vue2 Element-UI Datepicker force refresh for dynamic disabledDate

Vue2 Element-UI Datepicker force refresh for dynamic disabledDate

在下面的代码笔中,我设置了一个 Element-UI 日期选择器,以显示基于随机数的动态禁用日期。

每次日期选择器输入成为焦点时,禁用日期的数量都会改变。

我的问题是日期选择器在您单击其他月份之前不会刷新禁用的日期。日期选择器还会在您点击关闭并返回时显示您之前所在的最后一个月。

有没有办法强制Element-UI Datepicker刷新?我想在设置新的禁用值后在焦点事件中刷新日期选择器。

https://codepen.io/anon/pen/rbXjLr

Element-UI Datepicker Documentation

<div id="app">
<template>
  <div class="block">
    <span class="demonstration">Picker with quick options</span>
    <el-date-picker           
      v-model="value2"
      type="date"             
      placeholder="Enter Date"
      @focus="focus()"
      :default-value="defaultValue"
      :picker-options="pickerOptions">
    </el-date-picker>
  </div>
</template>
</div>

var is10Days = "";
var Randomizer = (function(){
  var is10DaysSetter = function(){
    if(is10Days === "") {
      is10Days = Math.round(Math.random()) === 1;        
    }
    //console.log("is10Days: " + is10Days);
    return is10Days;
  }
  return {
    Is10DaysSetter: is10DaysSetter
  }
})()

var Main = {
    data() {
      return {
        defaultValue: "",
        pickerOptions: {
          disabledDate(time) {
            var self = this;
            var date = moment()._d;
            var mindate = moment().subtract(5,'d')._d;
            var maxDate = moment()._d;         
            var isBeforeMinDate = time.getTime() < mindate;
            var isAfterMaxDate =  time.getTime() > maxDate; 

            if(is10Days !== "" && is10Days){
              var alternateMinDate = date.setDate(date.getDate() - 10);
               isBeforeMinDate = time.getTime() < alternateMinDate;
            }
            //console.log("disabledDate");
            return isBeforeMinDate || isAfterMaxDate;
          }
        },
        value2: '',
      };
    },
    methods:{
      focus: function() {
        var self = this;
        is10Days = "";
        self.defaultValue = moment().format("YYYY-MM-DD");
        Randomizer.Is10DaysSetter();
        console.log("reset is10Days: " + (is10Days ? "10 days" : "5 days"));
      }
    }
  };
var Ctor = Vue.extend(Main)
ELEMENT.locale(ELEMENT.lang.en)

new Ctor().$mount('#app')

我认为这是关于组件渲染的。当您的主要 Vue 应用程序初始化时,<el-date-picker> 首先完全呈现。

问题是日期选择器完成渲染后,主要的 vue 数据准备好了吗?

您似乎将 null 传递给选项,但 select 再过一个月将强制更新选项。

你能试试这个吗? How to Initialize Data Properties with Prop Values 在 attr

中创建一个 v-if="pickerOptions"

我将此作为功能请求发布到 Element UI 的 git 中心并收到回复:

https://github.com/ElemeFE/element/issues/15380

<el-date-picker 

  ref="picker" //Added this

  v-model="value2"
  type="date"             
  placeholder="Enter Date"
  @focus="focus()"
  :picker-options="pickerOptions">
</el-date-picker>

    methods:{
  focus: function() {
    var self = this;

    is10Days = "";
    Randomizer.Is10DaysSetter();

    //Added this
    this.$nextTick(_ => {
      this.$refs.picker.picker.date = new Date()
    })

    console.log("reset is10Days: " + (is10Days ? "10 days" : "5 days"));
  }
}

添加对选择器的引用允许我覆盖不需要的返回到之前查看的月份的功能并解决了我的问题。这带有警告,因为这不是 public API 的一部分,它可能会在未来的版本中更改。

这里是一个link工作代码笔:

https://codepen.io/steveshore/pen/rbXjLr