史上最全vue + Element日期選擇器 案例超詳細(xì)哦

給大家分享下我最近項(xiàng)目遇到的問題,總結(jié)了下我遇到的問題谅将,希望對大家有些幫助姑子。先說說我要做的日期選擇器的需求

1.范圍選擇,開始時間肠阱,結(jié)束時間
2.結(jié)束時間到開始時間不得大于90天

所以我首先想到的是日期范圍選擇器

<el-form-item label="有效期" prop="termOfValidity" class="labelTitle" label-width="150px">
  <el-col :span="9">
    <el-date-picker
        v-model="addCouponForm.termOfValidity"
        value-format="yyyy-MM-dd"
        type="daterange"
        range-separator="至"
        start-placeholder="開始日期"
        end-placeholder="結(jié)束日期"
        :picker-options="expireTimeOption"
        @change="selectRangeTime">
        <!-- 使用expireTimeOption方法 -->
     </el-date-picker><span class="explain_text">* 最長90天</span>
  </el-col>
</el-form-item>

如果是必填項(xiàng)
別忘了在rules里面增加驗(yàn)證(記得在el-form-item上加上prop綁定才會生效)

                termOfValidity: [
                    { required: true, message: '請選擇時間', trigger: 'change' }
                ],

大致樣式就是這樣


實(shí)現(xiàn)這些功能最好的方法就是禁用票唆,把不符合條件的日期禁止用戶去點(diǎn)擊,引導(dǎo)用戶屹徘,也防止用戶亂點(diǎn)出問題
所以第一步:把當(dāng)天之前的日期禁用掉(因?yàn)槲乙龅墓δ苁窃O(shè)置活動時間范圍走趋,所以不能選擇當(dāng)日之前的日期)
需要通過這個來設(shè)置:picker-options="expireTimeOption"



這個要寫在return里面


由于選完開始時間后,我才可以獲取到90天以后的日期噪伊,所以這里需要用onPick拿到我選擇的開始時間



所以我設(shè)置了兩個變量來存儲選中日期的值簿煌,記得在return里面初始化一下


expireTimeOption: {
    onPick: ({maxDate,minDate}) => {
        this.minDate=minDate;
        this.maxDate=maxDate;
    },
    // 禁用當(dāng)前日期之前的時間
    disabledDate: time => { //disabledDate 文檔上:設(shè)置禁用狀態(tài),參數(shù)為當(dāng)前日期鉴吹,要求返回 Boolean
         if(this.minDate){//當(dāng)選擇了開始時間姨伟,則禁用當(dāng)日之前的日期,和開始時間+90以后的日期
               return time.getTime() < Date.now()-24*60*60*1000 || time >new Date(this.minDate.getTime()+90*24*60*60*1000)
         }
         return time.getTime() < Date.now()-24*60*60*1000;
   },             
},

還需要做一個容錯如果日期被清空了的話豆励,需要重設(shè)下禁用條件 @change="selectRangeTime"

selectRangeTime(e){
    // 如果時間被清空了夺荒,重置限定條件
    if(e === null){
        this.minDate = '';
        this.maxDate = '';
        this.expireTimeOption={
             disabledDate: time => { //disabledDate 文檔上:設(shè)置禁用狀態(tài),參數(shù)為當(dāng)前日期良蒸,要求返回 Boolean
                if(this.minDate){
                   return time.getTime() < Date.now()-24*60*60*1000 || time > new Date(this.minDate.getTime()+90*24*60*60*1000)
                }
                return time.getTime() < Date.now()-24*60*60*1000;
              },
          }
    }
},

雖然代碼不是很多技扼,但是寫的過程遇到的困難還真是不少,也嘗試了很多方法诚啃,走了很多彎路淮摔。可惜始赎,做好了后和橙,我們經(jīng)理就是不滿意,說什么用戶怎么知道第一個選的日期是開始時間造垛,還有就是要是單改某個日期怎么辦魔招,用戶怕不都是傻子吧,非要我分成兩個日期選擇器來寫五辽,what办斑,改?頭給擰掉


可惜躲得了初一,躲不過十五呀乡翅,天天講我做的不合理鳞疲,開始又沒給設(shè)計(jì)稿

<el-row>
     <el-col :span="8">
          <el-form-item prop="startTime">
                <el-date-picker class="place_text" v-model="addCouponForm.startTime" :picker-options="pickerOptionsStart" type="date" value-format="yyyy-MM-dd" placeholder="開始日期" @change="changeStart" @focus="focusStart"></el-date-picker>
          </el-form-item>
     </el-col>
     <el-col :span="1" class="middle_time">--</el-col>
     <el-col :span="8">
          <el-form-item prop="endTime">
                <el-date-picker class="place_text" v-model="addCouponForm.endTime" :picker-options="pickerOptionsEnd" type="date" value-format="yyyy-MM-dd" placeholder="結(jié)束日期" @change="changeEnd" @focus="focusEnd"></el-date-picker>
          </el-form-item>
    </el-col>
    <el-col :span="4">
          <span class="explain_text">* 最長90天</span>
    </el-col>
</el-row>

大致樣式就是這樣



用的還是:picker-options="xxx",return里面別忘了加

pickerOptionsStart : this.beginDate(),//開始日期配置
pickerOptionsEnd : this.endDate(),//結(jié)束日期配置

這次方法統(tǒng)一寫在methods里面

        // 開始日期配置
        beginDate() {
            return {
                disabledDate(time) {
                    if (this.addCouponForm.endTime) {
                        return time.getTime() > new Date(this.addCouponForm.endTime).getTime();
                    }else{//還沒有選擇結(jié)束時間的時候蠕蚜,讓他只能選擇今天之后的時間包括今天
                        return time.getTime() < Date.now() - 8.64e7;
                    } 
                }
            }
        },
        // 結(jié)束日期配置
        endDate() {
            return {
                disabledDate(time) {
                    if(this.addCouponForm.startTime){
                        return time.getTime() < new Date(this.addCouponForm.startTime).getTime() - 1*24*60*60*1000;//可以選擇同一天
                    }

                }
            }
        },

需要加一些方法容錯

      // 改變開始日期時
        changeStart(){
            // 當(dāng)改變開始日期時尚洽,如果結(jié)束時間小于開始時間則清空結(jié)束日期
            if(this.addCouponForm.startTime > this.addCouponForm.endTime){
                this.addCouponForm.endTime='';
            }
        },
        //打開結(jié)束日期時
        focusEnd(){
            // 如果直接選擇結(jié)束日期(此時還沒選擇開始日期)  則在這之前應(yīng)該先禁用當(dāng)天之前的日期
            this.pickerOptionsEnd={
                disabledDate: time => {
                    if(!this.addCouponForm.startTime){
                        return time.getTime() < Date.now() - 8.64e7;
                    }else{
                        return time.getTime() < new Date(this.addCouponForm.startTime).getTime() - 1*24*60*60*1000;
                    }
                     
                }
            }
        },
        //打開開始日期時
        focusStart: function (){
            // 再次點(diǎn)擊開始時間時禁用當(dāng)日之前的日期
            this.pickerOptionsStart={
                disabledDate: time => {
                     return time.getTime() < Date.now() - 8.64e7;
                }
            }
        },

至于判斷開始時間和結(jié)束時間之間是否超過90天,我也想過用上面第一種方法把超過90天的日期給禁用靶累,開始試了很多次也不生效腺毫,所以我直接在提交表單的時候做了個判斷,我這個人比較較真挣柬,后來想想覺得方法沒錯但是不知道怎么就是實(shí)現(xiàn)不了所以又試了下
我是想在點(diǎn)擊開始時間的時候潮酒,拿到開始時間日期,然后禁用結(jié)束時間里90天以后的日期邪蛔,但是發(fā)現(xiàn)怎么都不生效急黎,后來發(fā)現(xiàn)根本沒執(zhí)行這個方法(我打印的ccc是我選擇開始日期后計(jì)算出來它90天之后的日期)



我點(diǎn)擊的時候頁面上并沒有打印0000和5555也就是說并沒有執(zhí)行到這一步



試了幾次大概明白了規(guī)律就是,在開始時間的操作里面無論是change還是focus都只能操作this.pickerOptionsStart(開始日期配置),同理結(jié)束時間也一樣侧到,所以我想到了在打開結(jié)束時間的時候禁用90天以后的日期就成功了叁熔,哈哈
// 打開結(jié)束時間
focusEnd(){
    console.log('focusEnd');
    // 如果直接選擇結(jié)束日期(此時還沒選擇開始日期)  則在這之前應(yīng)該先禁用當(dāng)天之前的日期
    this.pickerOptionsEnd={
          disabledDate: time => {
              if(!this.addCouponForm.startTime){
                 return time.getTime() < Date.now() - 8.64e7;
              }else{//打開時候禁用90天以后的日期
                 return time.getTime() < new Date(this.addCouponForm.startTime).getTime() - 1*24*60*60*1000 || time >(new Date(this.addCouponForm.startTime).getTime()+90*24*60*60*1000);
              }       
          }
     }
},

寫的不好的地方歡迎大家留言批評,我看到后也會盡快改正床牧,謝謝!
其實(shí)改起來并不難遭贸,但是我可能就是比較排斥這種功能實(shí)現(xiàn)了才讓說要那樣寫戈咳,所以改起來也多花了點(diǎn)時間。之前參考了很多大神給的例子壕吹,因?yàn)榭吹囊脖容^多著蛙,現(xiàn)在就不一一找了,感謝耳贬!
也給正在找工作的前端朋友一些建議踏堡,盡量還是別找不帶UI設(shè)計(jì)的公司,因?yàn)樘闊┝酥渚ⅲ芏嗳蝿?wù)分配給你的時候說什么看著做顷蟆,樣式不作要求,或者讓你仿照著寫腐魂,結(jié)果一模一樣非說不滿意帐偎,或者就是跟你講你先做,做好了給我看看我再說怎么改蛔屹,總之就是改來改去削樊,加油!沖啊漫贞!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甸箱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迅脐,更是在濱河造成了極大的恐慌芍殖,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仪际,死亡現(xiàn)場離奇詭異围小,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)树碱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門肯适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人成榜,你說我怎么就攤上這事框舔。” “怎么了赎婚?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵刘绣,是天一觀的道長。 經(jīng)常有香客問我挣输,道長纬凤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任撩嚼,我火速辦了婚禮停士,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘完丽。我一直安慰自己恋技,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布逻族。 她就那樣靜靜地躺著蜻底,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聘鳞。 梳的紋絲不亂的頭發(fā)上薄辅,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音抠璃,去河邊找鬼长搀。 笑死,一個胖子當(dāng)著我的面吹牛鸡典,可吹牛的內(nèi)容都是我干的源请。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谁尸!你這毒婦竟也來了舅踪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤良蛮,失蹤者是張志新(化名)和其女友劉穎抽碌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體决瞳,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡货徙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了皮胡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痴颊。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屡贺,靈堂內(nèi)的尸體忽然破棺而出蠢棱,到底是詐尸還是另有隱情,我是刑警寧澤甩栈,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布泻仙,位于F島的核電站,受9級特大地震影響量没,放射性物質(zhì)發(fā)生泄漏玉转。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一殴蹄、第九天 我趴在偏房一處隱蔽的房頂上張望冤吨。 院中可真熱鬧,春花似錦饶套、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至圾叼,卻和暖如春蛤克,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夷蚊。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工构挤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惕鼓。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓筋现,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矾飞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 在一些電商類的微信小程序中一膨,地址選擇這個功能一般是必備的,一般的收貨信息都需要有一個能選擇省市縣的控件洒沦,當(dāng)然也有些...
    第九程序官方閱讀 4,076評論 0 6
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5豹绪? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,474評論 1 45
  • 今天的課對我來說有些難運(yùn)用了申眼,從BIC開始就需要強(qiáng)大的談判能力瞒津。這方面我想結(jié)合《非暴力溝通》來共同學(xué)習(xí)。 在今天聽...
    安安_3d34閱讀 313評論 0 0
  • 關(guān)于簡書,其實(shí)對我來說根本卻沒搞懂這里是干嘛的姻氨。對于我來說钓辆,偶爾寫寫,記錄當(dāng)時的心情肴焊,發(fā)泄一時情緒所用吧前联。 ...
    小檸Duo貓貓閱讀 110評論 0 1
  • 楊德昌的首部金馬獎獲獎影片《恐怖分子》在央視六套首播了,聽說是5號首播的娶眷,臺里播出的時候翻譯成《請假裝你會舍不得...
    阿花_655c閱讀 255評論 0 1