Element-ui DatePicker顯示週數

1.場景描述

咱們公司是作電商的,運營的工做指標都是按周來定的,因此他們對周特別敏感,但願咱們能在日期選擇器上顯示週數。剛接到這個需求時,心中很不樂意,由於Element-ui的日期選擇器根本不支持顯示週數。我只能看看源碼來看看可否有解決的辦法vue

具體代碼你們能夠在github中看到 https://github.com/ElemeFE/element/pull/16415/commits/2b810cf73d1127645054265469bbb353d036cb21webpack

2.查看源碼

咱們很輕鬆就能找到DatePicker相關的代碼,在packages > date-picker 整個目錄都是date-picker的代碼,在date-picker > src > basic > date-table.vue中就是顯示日期的代碼,在這裏居然發現了一個屬性 showWeekNumber,在date-table.vue的第83行。git

showWeekNumber: {
   type: Boolean,
   default: false
 },

爲了驗證這個參數對咱們是否有幫助,咱們把showWeekNumber默認設置爲true試試,而後把第11行的 github

<th v-if="showWeekNumber">{{ t('el.datepicker.week') }}</th>web

改成 npm

<th v-if="showWeekNumber">週數</th>element-ui

 設置用來設置國際化的,國際化文件中沒有這個對應的翻譯,咱們暫時先這麼寫,否則會報錯。當咱們完成這個以後神奇的事情發生了
json

週數展現出來了,並且好像展現的事正確的,7.1-7.6就是2019年的第27周。既然可以展現週數,那麼爲何element不開放出來這個參數了,是不是有什麼問題呢。咱們本身來簡單的測試下ssh

3. 發現並解決問題

 

問題

(1)切換月時,週數並不會發生變化gitlab

(2)選中的是29周,輸入框中確展現的是28周

(3)hover選中時,週數不該該展現高亮的樣式

(4)日期區間選中的樣式也不正確

解決問題

(1)解決週數不變化的問題,咱們找到date-table.vue中第149行到152行

if (this.showWeekNumber) {
  if (!row[0]) {
    row[0] = { type: 'week', text: getWeekNumber(nextDate(startDate, i * 7 + 1)) };
  }
}

當showWeekNumber爲true時,row[0]就是用來展現週數的,當row[0],存在時,就不在去獲取新的值,顯然不正確,咱們把if判斷去掉就行,這樣就會更新週數

(2)解決選中後周數展現不正確的問題,咱們找到date-table.vue中第14行到18行

<tr
  class="el-date-table__row"
  v-for="(row, key) in rows"
  :class="{ current: isWeekActive(row[1]) }"
  :key="key">

isWeekActive就是用來得到當前展現的週數的,當展現週數以後咱們要作適當的修改

<tr
  class="el-date-table__row"
  v-for="(row, key) in rows"
  :class="{ current: isWeekActive(row[showWeekNumber ? 2 : 1]) }"
  :key="key">

至於第三個問題和第三個問題都是樣式的問題,咱們修改下date-table對應的樣式便可

最後看下展現效果

4. 最後

我已經向element-ui提了pr,可是尚未merge,具體的代碼你們能夠在github中看到 https://github.com/ElemeFE/element/pull/16415/commits/2b810cf73d1127645054265469bbb353d036cb21,解決了國際化的問題和增長了參數展現週數

5. 問題

代碼是已經改好了,可是咱們引入餓了麼的代碼是直接經過npm下載的,線上環境也是npm下載的,咱們是沒法來更改npm的代碼的。那麼咱們怎麼來解決這個問題呢?

關於如何應用到項目中:首先把element fork到本身的github中,或者是clone到公司的gitlab中都行。 而後把package.json的element的來源改成本身的連接,最後在webpack配置中,把resolve->symlinks至爲false,默認是true,詳情請看連接

  "dependencies": {
    "element-ui": "git+ssh://git@gitlab.ichuanyi.me:web/element.git#dev",
  },
  configureWebpack: {
    resolve: {
      symlinks: false, // 對本地引入的軟連接不解析  
    },
  },
相關文章
相關標籤/搜索