【问题标题】:Vue2 Element-UI Datepicker force refresh for dynamic disabledDateVue2 Element-UI Datepicker 强制刷新动态 disabledDate
【发布时间】:2019-09-22 07:28:31
【问题描述】:

在下面的代码笔中,我设置了一个 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')

【问题讨论】:

    标签: dynamic datepicker vuejs2 refresh element-ui


    【解决方案1】:

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

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

    您似乎将null 传递到选项中,但选择另一个月份将强制更新选项。

    你能试试这个吗? How to Initialize Data Properties with Prop Values 在 attr 中创建一个 v-if="pickerOptions"

    【讨论】:

      【解决方案2】:

      我将此作为功能请求发布在 Element UI 的 git hub 上并收到了回复:

      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"));
        }
      }
      

      添加对选择器的引用允许我覆盖不需要的返回到先前查看的月份的功能并解决了我的问题。随之而来的警告是,由于这不是公共 API 的一部分,因此它可能会在未来的版本中发生变化。

      这是一个工作代码笔的链接:

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

      【讨论】:

        猜你喜欢
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        • 1970-01-01
        相关资源
        最近更新 更多