1. 程式人生 > >關於vue中使用laydate時間外掛的問題

關於vue中使用laydate時間外掛的問題

vue中使用laydate時間外掛

之前在做vue專案時使用iviewUI庫中的DatePicker元件,發現DatePicker使用起來比較麻煩,尤其是對時間精確度上的限制不盡人意,操作起來也比較繁瑣,總之在處理一系列時間元件相互聯動上存在一大堆問題,比如

圖片缺失
DatePicker時間元件

時間精確到分,元件1的value等於元件2的最小值,元件2的vlaue等於元件3的最小值,。。。依次類推,如果是時間精確到日,這個元件沒有任何問題,如果是精確到時分秒,這個元件的對時分秒的控制就不是那個靈敏了,在點選時分秒之後才能識別出對時分秒的限制,而這種使用者體驗不夠友好。

所以,想到了以前用過的laydate時間外掛

在vue中使用laydate

在vue元件中npm install laydate,然後在vue元件中直接引入:

import laydate from 'laydate'

然後在mounted中呼叫:

laydate.now();

發現chrome瀏覽器控制檯中報錯,laydate is not defined,然後把laydate.js放在靜態資源裡面引入:

import laydate from '../../static/js/laydate.js'

發現chrome瀏覽器控制檯中依然是報錯,laydate is not defined,然後在html入口檔案中引入:

<script src="./src/static/js/laydate.js"></script>

發現chrome瀏覽器控制檯中不報,laydate is not defined,但是又報另外一個錯誤:require is not defined,檢視原碼發現是因為laydate.js中在引用css樣式表時未定義:require('./need/laydate.css');require('./skins/default/laydate.css');

 

最後使用laydate打包構建後的檔案:dist/laydate/laydate.min.js,把laydate.min.js和css貼上到src/static/路徑下,注意js和css結構不要改變

<script src="./src/static/laydate/laydate.min.js"></script>

然後在chrome瀏覽器中成功打印出了laydate.now()的值:2018-10-21

然後使用import方式引入laydate.min.js:

import laydate from '../../static/laydate/laydate.min.js'

chrome控制檯裡有報錯:laydate.now is not a function

原因時laydate.min.js是直接把laydate物件註冊到了window上,本身並沒有export default laydate出口,所以不能使用這種方式引用,應該使用:

import '../../static/laydate.min.js'

這樣引用後,chrome中成功列印laydate.now(); 2018-10-21

或者在入口檔案index.html中使用cdn加速方式引入laydate.min.js也是可以的:

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/laydate.min.js"></script>

當然,如果專案中只是個別地方是使用到時間外掛,建議採用import方式引入

laydate.min.js時間外掛在vue元件中的使用方式

<template>
    <div id="laydateIndex">
        <div class="input-item">
            <label for="">請選擇時間:</label>
            <input type='text' 
                    name='houseChangeTime' 
                    placeholder='請選擇日期' 
                    class='form-control' 
                    onclick="laydate({ istime: true, format: 'YYYY/MM/DD hh:mm:ss' })" />
        </div>
        <div class="input-item">
            <label for="">開始時間:</label>
            <input type="text" name="" id="begintime" placeholder='請選擇日期'>
        </div>
        <div class="input-item">
            <label for="">結束時間:</label>
            <input type="text" name="" id="endtime" placeholder='請選擇日期'>
        </div>
    </div>
</template>
<script>
    import '../../assets/js/laydate.min.js'
    export default {
        name: 'laydateIndex',
        data () {
            return {
                begintime: '',
                endtime: '',
                start_time: '',
            }
        },
        methods: {
            setBeginTime () {
                var _this = this;
                var mintime = laydate.now(0, 'YYYY-MM-DD hh:mm:ss');
                _this.$data.begintime = mintime;
                _this.$data.endtime = mintime;
                var begintiem_options = {
                    elem: '#begintime',
                    format: 'YYYY-MM-DD hh:mm:ss', // 分隔符可以任意定義
                    event: 'click', //觸發事件
                    istime: true, //是否開啟時間選擇
                    isclear: true, //是否顯示清空
                    issure: true, //是否顯示確認
                    festival: true, //是否顯示節日
                    min: mintime, //最小日期
                    max: '2099-12-31 23:59:59', //最大日期
                    start: mintime, //開始日期
                    fixed: true, //是否固定在可視區域
                    zIndex: 99999999, //css z-index
                    choose: function(dates) { // 選擇日期完畢的回撥
                        endtime_options.start = dates;
                        endtime_options.min = dates;
                        _this.$data.begintime = dates;
                        _this.$data.endtime = dates;
                    }
                };

                var endtime_options = {
                    elem: '#endtime',
                    format: 'YYYY-MM-DD hh:mm:ss', // 分隔符可以任意定義
                    event: 'click', //觸發事件
                    istime: true, //是否開啟時間選擇
                    isclear: true, //是否顯示清空
                    issure: true, //是否顯示確認
                    festival: true, //是否顯示節日
                    min: _this.$data.begintime, //最小日期
                    max: '2099-12-31 23:59:59', //最大日期
                    start: _this.$data.begintime, //開始日期
                    fixed: true, //是否固定在可視區域
                    zIndex: 99999999, //css z-index
                    choose: function(dates) { // 選擇日期完畢的回撥
                        // this.begintiem_options = dates;
                    }
                };

                laydate(begintiem_options);
                laydate(endtime_options);
                
            },
            initPage () {
                var _this = this;
                _this.setBeginTime();
            },
        },
        mounted () {
            this.initPage();
        },
    }
</script>