Vue 2 日期选择器组件

Posted

技术标签:

【中文标题】Vue 2 日期选择器组件【英文标题】:Vue 2 Datepicker Component 【发布时间】:2017-02-20 18:49:15 【问题描述】:

我正在尝试使用 Bootstrap Datepicker 创建一个 Vue 2 组件,但在选择日期后尝试更新输入时卡住了,这是我的代码:

Vue.component('datepicker', 
template: '\
  <input class="form-control datepicker"\
        ref="input"\
        v-bind:value="value"\
        v-on:input="updateValue($event.target.value)"\
        v-on:blur="updateValue($event.target.value)"\
        v-on:focus="updateValue($event.target.value)"\
        data-date-format="dd-mm-yyyy"\
        data-date-end-date="0d"\
        placeholder="dd-mm-yyyy"\
       type="text"  />\
',
props: 
    value: 
      type: String,
      default: moment().format('DD-MM-YYYY')
    
,
mounted: function () 

,
methods: 
    updateValue: function (value) 
        this.$emit('input', value);
    ,

);

如果通过键盘输入,但在日历中选择时,值不会更新。有什么想法可以通过日历更新日期更改的值吗?

** 更新**

我已经得到了以下代码:

mounted: function() 
    let self = this;
    this.$nextTick(function() 
        $('.datepicker').datepicker(
            startView: 1,
            todayHighlight: true,
            todayBtn: "linked",
            autoclose: true,
            format: "dd-mm-yyyy"
        )
        .on('changeDate', function(e) 
            var date = e.format('dd-mm-yyyy');
            self.updateValue(date);
        );
    );

但它现在会更新页面上所有 Datepicker 实例的值。如何设置它以便仅针对选定的 Datepicker 进行更新?

【问题讨论】:

组件安装后是否也需要初始化它,例如通过 $('.datepicker').datepicker(options)?在 vue 2.0 中,请记住在 this.$nextTick 方法调用中执行此操作,以确保 DOM 元素在调用之前存在。 你试过 v-on:change 事件吗? 【参考方案1】:

当你初始化 Datepicker 时,你可以在选项中指定当项目被选中时应该调用什么方法:

mounted: function() 
   let self = this;
   let args = 
      format: 'DD-MM-YYYY',
      placeholder: 'dd-mm-yyyy',
      onSelect: function(dateText) 
         self.updateValue(dateText);
      
   ;
   this.$nextTick(function() 
      $('.datepicker').datepicker(args)
   );

【讨论】:

感谢您为我指明正确的方向,我猜此代码用于不同的日期选择器,而不是 Bootstrap Datepicker。请参阅我更新的问题。【参考方案2】:

这是最终的工作组件:

Vue.component('datepicker', 
template: '\
  <input class="form-control datepicker"\
        ref="input"\
        v-bind:value="value"\
        v-on:input="updateValue($event.target.value)"\
        data-date-format="dd-mm-yyyy"\
        data-date-end-date="0d"\
        placeholder="dd-mm-yyyy"\
        type="text"  />\
',
props: 
    value: 
      type: String,
      default: moment().format('DD-MM-YYYY')
    
,
mounted: function() 
    let self = this;
    this.$nextTick(function() 
        $(this.$el).datepicker(
            startView: 1,
            todayHighlight: true,
            todayBtn: "linked",
            autoclose: true,
            format: "dd-mm-yyyy"
        )
        .on('changeDate', function(e) 
            var date = e.format('dd-mm-yyyy');
            self.updateValue(date);
        );
    );
,
methods: 
    updateValue: function (value) 
        this.$emit('input', value);
    ,

);

【讨论】:

你好,你在哪里加载引导日期选择器?只是require('bootstrap-datepicker')吗?我不断收到一个 js 错误,说 $(...).datepicker is not a function 我只是像使用 【参考方案3】:

这样您就不会被选定的日期覆盖,也不会丢失您写的文本

this.$nextTick(function() 
          $(this.$el).datepicker(args).on('changeDate', function(e:any) 
            var date = e.format(format);
            var sval:string = e.currentTarget.__vue__.$refs.input._value;
             //console.log(sval);               
           //so that value doesnt get erased everytime i put one character there, wait to have more
           if(sval.length>2) 
             self.updateValue(date); console.log('upate'+date+sval);
             
        ).on('hide', function(e:any) 
            var date = e.format(format);
            var sval:string = e.currentTarget.__vue__.$refs.input._value;            
             self.updateValue(date); console.log('upate2'+date+sval);              
        );
      );    

【讨论】:

以上是关于Vue 2 日期选择器组件的主要内容,如果未能解决你的问题,请参考以下文章

vue2 - 解决treeselect树形组件获取焦点后无法关闭element的选择器和日期选择器的问题

vue2 - 解决treeselect树形组件获取焦点后无法关闭element的选择器和日期选择器的问题

前端组件:超好用的日期选择器,支持全部日期格式已经Vue.js中的使用

vue+element DatePicker日期选择器封装(可自定义快捷选择时间)

vue element 时间选择器设置禁用日期

我怎样才能在日期选择器中只允许星期一,vue