之所以看Pagination源碼,由於一個問題:
需求:從列表頁進入詳情頁后再返回,需求方希望保持在當前的頁碼而不是重新定位到第一頁
問題:按照element ui文檔設置current-page后請求的數據正常,但pagination的頁碼顯示卻不正確,不管current-page值等於多少,永遠顯示第一頁
解決方案:
1、
改

光知道解決方案,不知道原因不行,於是翻了一下源碼
原因:
pagination組件監聽了currentPage,pageSize,internalCurrentPage,internalPageCount
引用pagination組件通常這么寫:
注意:組件並沒有監聽total字段,下面會談到他
這里有個getValidCurrentPage函數,從名字就能看出他是干嘛的,獲取合法的當前頁碼,來看看這個函數都干了啥
這里有個internalPageCount,這個字段就是調用組件時傳入的total值(就是上文提到的那個total),由於要請求接口加載數據,一開始我們並不知道會有多少條數據,通常會把這個值設為0,這個值為0該函數就會返回1,組件內部的當前頁永遠是第一頁。pager.vue會按照當前頁是第一頁進行渲染。此時不管你代碼如何修改currentPage都是無效的(本人曾經認為是不是渲染時機導致的頁碼不正確)。
以上就是文章開頭那個問題的答案。我們可以稍微修改一下參數來印證一下這個答案。
當前頁是第二頁,請求的也是第二頁
如果你把total改成初始值為0,請求接口再去更改值的變量,頁碼顯示就會異常了。
擴展:
到這里就結束了嗎,沒有,知道原因還不行,我們還得知道為什么要這么改,繼續。
為什么要這么寫::current-page.sync="currentPage",這里就不費話了,vue官網有說明。
請求接口后為什么要再次設置currentPage?
還記得上文提到的那個total嗎,pagination組件並沒有監聽total字段,只監聽了currentPage,再次設置后會觸發
this.$emit('update:currentPage', newVal);
實現頁碼渲染的更新