亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

View UI Table 與 Page 組件分頁(yè)實(shí)戰(zhàn):前端分頁(yè)與服務(wù)端分頁(yè)完整指南

View UI Table 與 Page 組件分頁(yè)實(shí)戰(zhàn):前端分頁(yè)與服務(wù)端分頁(yè)完整指南 1. 分頁(yè)到底在解決什么問(wèn)題先想清楚場(chǎng)景再動(dòng)手先講個(gè)現(xiàn)象。我見(jiàn)過(guò)不少剛接觸 View UI以前叫 iView的開(kāi)發(fā)者拿到 Table 和 Page 組件后第一件事就是照著文檔抄一遍代碼抄完發(fā)現(xiàn)表格能顯示數(shù)據(jù)、頁(yè)碼也能點(diǎn)以為萬(wàn)事大吉。結(jié)果一上生產(chǎn)環(huán)境就出問(wèn)題數(shù)據(jù)量到了幾千條頁(yè)面直接卡頓、翻頁(yè)時(shí)請(qǐng)求重復(fù)發(fā)送、搜索之后頁(yè)碼還停留在舊位置、刪掉當(dāng)前頁(yè)最后一條數(shù)據(jù)后表格變成空白頁(yè)……每一個(gè)都是線上事故級(jí)別的體驗(yàn)問(wèn)題。其實(shí)分頁(yè)這件事本質(zhì)上不是把數(shù)據(jù)切開(kāi)一頁(yè)頁(yè)展示那么簡(jiǎn)單它背后有兩層邏輯一是減少單次渲染的數(shù)據(jù)量二是把展示狀態(tài)和業(yè)務(wù)狀態(tài)解耦。你不把這兩層想清楚寫(xiě)出來(lái)的分頁(yè)代碼永遠(yuǎn)是在打補(bǔ)丁。用 View UI 的 Table 和 Page 組合做分頁(yè)是 Vue 生態(tài)里很經(jīng)典的一套方案。Table 負(fù)責(zé)展示數(shù)據(jù)Page 負(fù)責(zé)提供交互入口兩者通過(guò) data 和事件串聯(lián)起來(lái)。這套組合在我的項(xiàng)目里用了很多年今天把完整思路、踩過(guò)的坑、以及封裝成通用組件的方案一次性寫(xiě)完希望能幫你省掉一些不必要的折騰。先說(shuō)基礎(chǔ)概念方便后面統(tǒng)一語(yǔ)言current / currentPage當(dāng)前頁(yè)碼從 1 開(kāi)始。pageSize / page-size每頁(yè)顯示條數(shù)。total數(shù)據(jù)總條數(shù)。dataTable 當(dāng)前頁(yè)實(shí)際要渲染的數(shù)據(jù)數(shù)組。on-changePage 組件頁(yè)碼變化時(shí)觸發(fā)的回調(diào)函數(shù)。2. 前端分頁(yè)還是服務(wù)端分頁(yè)這個(gè)選擇題決定代碼結(jié)構(gòu)很多人在第一步就選錯(cuò)了方向。我接到過(guò)的分頁(yè)相關(guān)咨詢里至少有一半人分不清前端分頁(yè)和服務(wù)端分頁(yè)該在什么場(chǎng)景下用。這里直接給結(jié)論數(shù)據(jù)量小幾百到一千條以內(nèi)且一次性從接口拿全量數(shù)據(jù)用前端分頁(yè)。數(shù)據(jù)量大幾千條以上或者接口本身就支持分頁(yè)參數(shù)用服務(wù)端分頁(yè)。什么情況下前端分頁(yè)會(huì)出問(wèn)題舉個(gè)例子一次接口返回 5000 條數(shù)據(jù)你把它們?nèi)M(jìn) Table雖然 Table 會(huì)一次性渲染出所有行但 Page 組件的頁(yè)碼計(jì)算、瀏覽器 DOM 節(jié)點(diǎn)數(shù)量、重排重繪帶來(lái)的性能消耗都會(huì)讓你在低端設(shè)備上體驗(yàn)到明顯的卡頓。更嚴(yán)重的是如果表格列的字段很多5000 行乘以 10 列那就是 5 萬(wàn)個(gè)單元格瀏覽器直接崩給你看。服務(wù)端分頁(yè)則是把當(dāng)前頁(yè)顯示哪些數(shù)據(jù)這個(gè)責(zé)任交給后端前端只告訴后端我要第幾頁(yè)、每頁(yè)多少條后端返回當(dāng)前頁(yè)的數(shù)據(jù)和總數(shù)。這種方式的優(yōu)點(diǎn)是前端性能壓力小缺點(diǎn)是每次翻頁(yè)都要等網(wǎng)絡(luò)請(qǐng)求交互上必須處理好 loading 狀態(tài)和錯(cuò)誤重試。我個(gè)人的判斷標(biāo)準(zhǔn)很簡(jiǎn)單如果接口返回的數(shù)據(jù)總量超過(guò) 1000 條或者接口本身已經(jīng)給了 page 和 size 參數(shù)就毫不猶豫走服務(wù)端分頁(yè)。分頁(yè)的本質(zhì)是數(shù)據(jù)訪問(wèn)的邊界控制這個(gè)邊界越靠前系統(tǒng)的可擴(kuò)展性越好。下面這張表是我選型時(shí)的常用參考標(biāo)準(zhǔn)供你直接抄作業(yè)對(duì)比維度前端分頁(yè)服務(wù)端分頁(yè)數(shù)據(jù)量建議1000 條以內(nèi)任意數(shù)量尤其適合大數(shù)據(jù)量接口請(qǐng)求次數(shù)1 次頁(yè)面加載時(shí)每次翻頁(yè) 1 次交互響應(yīng)速度快無(wú)網(wǎng)絡(luò)等待慢依賴網(wǎng)絡(luò)延遲加載狀態(tài)處理基本不需要必須處理后端改動(dòng)無(wú)需要支持分頁(yè)參數(shù)維護(hù)成本低中推薦場(chǎng)景數(shù)據(jù)字典、配置列表、報(bào)表預(yù)覽用戶列表、訂單列表、操作日志3. Table 和 Page 的基礎(chǔ)組合從一份能跑通的代碼說(shuō)起確定了分頁(yè)方式后我們直接寫(xiě)代碼。這里先用一份前端分頁(yè)的完整示例來(lái)拆解核心邏輯因?yàn)樗拇a鏈路最短最適合理解 Table 和 Page 的協(xié)作關(guān)系。假設(shè)我們從接口拿回一份 200 條數(shù)據(jù)的用戶列表每頁(yè)顯示 10 條需要在表格底部用 Page 組件控制翻頁(yè)。先看完整代碼template div classuser-list Table :columnscolumns :datapageData stripe/Table Page :totalmockData.length :currentcurrentPage :page-sizepageSize show-total on-changehandlePageChange stylemargin-top: 16px; text-align: right / /div /template script export default { name: UserList, data() { return { columns: [ { title: ID, key: id, width: 80 }, { title: 姓名, key: name, minWidth: 120 }, { title: 郵箱, key: email, minWidth: 200 }, { title: 創(chuàng)建時(shí)間, key: created_at, minWidth: 180 } ], // 模擬全量數(shù)據(jù)實(shí)際場(chǎng)景中來(lái)自接口 mockData: [], currentPage: 1, pageSize: 10 } }, computed: { pageData() { const start (this.currentPage - 1) * this.pageSize const end start this.pageSize return this.mockData.slice(start, end) } }, created() { this.loadMockData() }, methods: { async loadMockData() { // 模擬接口請(qǐng)求 const res await fetch(/api/user/list) this.mockData await res.json() }, handlePageChange(page) { this.currentPage page } } } /script這套代碼的核心邏輯只有三步全量數(shù)據(jù)存在 mockData 里作為分頁(yè)的數(shù)據(jù)源。computed 里的 pageData 負(fù)責(zé)切頁(yè)根據(jù)當(dāng)前頁(yè)碼和每頁(yè)條數(shù)動(dòng)態(tài)算出當(dāng)前頁(yè)該顯示哪些數(shù)據(jù)。Page 組件的 on-change 事件負(fù)責(zé)更新 currentPagepageData 隨之重新計(jì)算表格自動(dòng)刷新。這里有個(gè)關(guān)鍵設(shè)計(jì)Table 綁定的是pageData而不是mockData。這個(gè)slice的動(dòng)作就是前端分頁(yè)的核心它保證了 Table 每次只拿到 10 條數(shù)據(jù)而不是把 200 條全部渲染出來(lái)。這樣做的直接好處是 DOM 節(jié)點(diǎn)數(shù)量大幅減少頁(yè)面重排開(kāi)銷(xiāo)明顯下降。但如果你只看到了這一步那還沒(méi)入門(mén)。我前兩年接手過(guò)一個(gè)項(xiàng)目同事把這段邏輯寫(xiě)成了handlePageChange(page) { this.mockData this.mockData.slice(page * 10) // 錯(cuò)誤寫(xiě)法 }他以為翻頁(yè)就是把數(shù)據(jù)切掉一段結(jié)果翻到第 3 頁(yè)后每翻一次數(shù)據(jù)就少掉一部分再往回翻全亂了。正確做法永遠(yuǎn)是保留全量數(shù)據(jù)源用計(jì)算屬性去切當(dāng)前頁(yè)而不是去修改數(shù)據(jù)源本身。數(shù)據(jù)源是全集當(dāng)前頁(yè)是視圖這個(gè)邊界不能破。4. 服務(wù)端分頁(yè)的完整鏈路參數(shù)、loading、競(jìng)態(tài)控制一次說(shuō)清服務(wù)端分頁(yè)是實(shí)際業(yè)務(wù)中占比最高的形態(tài)因?yàn)樗苷嬲鉀Q大數(shù)據(jù)量場(chǎng)景下的性能瓶頸。我用一個(gè)訂單列表的案例來(lái)講透完整鏈路。4.1 請(qǐng)求參數(shù)的組裝服務(wù)端分頁(yè)的第一件事是把分頁(yè)參數(shù)傳給接口。View UI 的 Page 組件在頁(yè)碼變化時(shí)觸發(fā)on-change這個(gè)回調(diào)參數(shù)就是新的頁(yè)碼我們需要把它同步給后端。這里要注意字段名對(duì)齊的問(wèn)題。不同后端團(tuán)隊(duì)定義的分頁(yè)參數(shù)不一樣有的用pageNum、pageSize有的用page、limit還有的用current、size。建議前端在封裝請(qǐng)求層時(shí)統(tǒng)一做一層參數(shù)轉(zhuǎn)換不要在每個(gè)頁(yè)面里散落各種字段名。我在項(xiàng)目中通常這樣處理methods: { buildPageParams() { return { page: this.currentPage, // 頁(yè)碼從 1 開(kāi)始 pageSize: this.pageSize, // 每頁(yè)條數(shù) // 其他查詢條件... keyword: this.keyword, status: this.status } }, async fetchOrderList() { this.loading true try { const params this.buildPageParams() const res await getOrderList(params) this.tableData res.data.records || [] this.total res.data.total } catch (error) { // 統(tǒng)一錯(cuò)誤處理 this.$Message.error(訂單列表加載失敗) } finally { this.loading false } } }這里有個(gè)非常容易踩的坑接口返回的字段名不一致。有的后端返回{ list: [], totalCount: 100 }有的返回{ rows: [], total: 100 }還有的包裝成{ data: { records: [], total: 0 } }。建議把接口返回結(jié)構(gòu)統(tǒng)一收斂到一個(gè)normalizeResponse方法里把字段名都轉(zhuǎn)換成語(yǔ)義明確的內(nèi)部結(jié)構(gòu)。4.2 頁(yè)碼變化時(shí)的完整邏輯服務(wù)端分頁(yè)的handlePageChange不能像前端分頁(yè)那樣只更新一個(gè)頁(yè)碼變量它要觸發(fā)重新請(qǐng)求數(shù)據(jù)async handlePageChange(page) { if (page this.currentPage) return this.currentPage page await this.fetchOrderList() }這段代碼看似簡(jiǎn)單實(shí)際生產(chǎn)環(huán)境里還會(huì)遇到更多情況我展開(kāi)講三個(gè)我反復(fù)踩過(guò)的坑。4.3 競(jìng)態(tài)問(wèn)題快速翻頁(yè)時(shí)響應(yīng)順序會(huì)錯(cuò)亂這是我在真實(shí)項(xiàng)目中遇到的最隱蔽的 bug。用戶快速點(diǎn)擊下一頁(yè)、下一頁(yè)、下一頁(yè)前端會(huì)發(fā)出三個(gè)并發(fā)的異步請(qǐng)求。由于網(wǎng)絡(luò)延遲不同先發(fā)的請(qǐng)求未必先返回。如果最后一次點(diǎn)擊的響應(yīng)先回來(lái)了把表格數(shù)據(jù)更新為第 3 頁(yè)的內(nèi)容但緊接著第一次點(diǎn)擊的響應(yīng)才姍姍來(lái)遲又把表格覆蓋成第 1 頁(yè)的內(nèi)容——而此時(shí)的頁(yè)碼按鈕卻停留在第 3 頁(yè)。數(shù)據(jù)和頁(yè)碼錯(cuò)位用戶看到的就是頁(yè)碼是 3表格內(nèi)容卻是第一頁(yè)的靈異現(xiàn)象。解決方式有幾種我推薦用一個(gè)簡(jiǎn)單的請(qǐng)求序號(hào)標(biāo)記methods: { async fetchOrderList() { const requestId this.requestSequence // 每次請(qǐng)求自增 this.loading true try { const res await getOrderList(this.buildPageParams()) // 如果已經(jīng)不是最新的請(qǐng)求直接丟棄這次結(jié)果 if (requestId ! this.requestSequence) return this.tableData res.data.records this.total res.data.total } finally { if (requestId this.requestSequence) { this.loading false } } } }原理就是每次請(qǐng)求前用一個(gè)自增序號(hào)標(biāo)記這是第幾個(gè)請(qǐng)求當(dāng)響應(yīng)回來(lái)時(shí)如果當(dāng)前的序號(hào)已經(jīng)不是自己發(fā)出的那次了說(shuō)明有更新的請(qǐng)求已經(jīng)發(fā)出這次舊響應(yīng)直接丟棄不再更新數(shù)據(jù)。這個(gè)方法比axios的CancelToken更輕量也不需要額外引入庫(kù)已經(jīng)足夠應(yīng)對(duì)大部分業(yè)務(wù)場(chǎng)景。4.4 loading 狀態(tài)的正確打開(kāi)方式服務(wù)端分頁(yè)必須處理 loading因?yàn)榉?yè)時(shí)有一段網(wǎng)絡(luò)空白期。不處理的話用戶翻頁(yè)后會(huì)看到表格內(nèi)容停留在舊數(shù)據(jù)上容易誤以為是不是自己點(diǎn)錯(cuò)了。View UI 的 Table 組件自帶一個(gè)loading屬性傳入布爾值即可Table :columnscolumns :datatableData :loadingloading/Table翻頁(yè)的時(shí)候建議使用 Page 組件的on-change回調(diào)里第一時(shí)間把 loading 置為 true并在請(qǐng)求 finally 中置為 false。這樣可以保證翻頁(yè)交互期間表格上方出現(xiàn) loading 遮罩避免用戶誤操作。4.5 總數(shù)獲取與展示Page 組件的total屬性是數(shù)據(jù)總條數(shù)不是總頁(yè)數(shù)。它需要從接口返回的 total 字段中獲取。很多人初學(xué)時(shí)會(huì)犯一個(gè)錯(cuò)誤把total設(shè)置為當(dāng)頁(yè)返回的數(shù)據(jù)條數(shù)導(dǎo)致 Page 組件永遠(yuǎn)只有一頁(yè)。這個(gè)坑我見(jiàn)得太多了必須單獨(dú)拎出來(lái)說(shuō)。接口返回的 total 是服務(wù)端根據(jù)查詢條件統(tǒng)計(jì)出來(lái)的完整數(shù)據(jù)量Page 組件拿到 total 后自己會(huì)計(jì)算總頁(yè)數(shù)并在頁(yè)碼欄右側(cè)渲染出共 X 條的文字配合show-total屬性。5. 合并查詢條件的分頁(yè)搜索、頁(yè)碼重置、參數(shù)同步一個(gè)都不能少真實(shí)項(xiàng)目里表格分頁(yè)幾乎總是和搜索條件綁在一起的。這一章的坑比基礎(chǔ)分頁(yè)多得多值得單獨(dú)開(kāi)一節(jié)來(lái)說(shuō)。5.1 搜索時(shí)頁(yè)碼必須重置到第一頁(yè)這是一個(gè)看起來(lái)是小事、做錯(cuò)了就是事故的點(diǎn)。假設(shè)用戶正在瀏覽第 8 頁(yè)的數(shù)據(jù)此時(shí)他在搜索框里輸入了新的關(guān)鍵詞點(diǎn)擊查詢按鈕。如果查詢邏輯只是簡(jiǎn)單地把tableData重新賦值為新接口的返回結(jié)果而currentPage還停留在 8會(huì)出現(xiàn)兩種情況接口返回的是第 8 頁(yè)的數(shù)據(jù)但符合條件的數(shù)據(jù)總共可能只有 2 頁(yè)前端拿到的就是第 8 頁(yè)不存在的數(shù)據(jù)——往往是空數(shù)組。即使后端對(duì)超出總頁(yè)數(shù)的頁(yè)碼做了容錯(cuò)返回最后一頁(yè)用戶體驗(yàn)依然是混亂的我明明搜的是新關(guān)鍵詞為什么頁(yè)碼還停在第 8正確做法是搜索條件變化時(shí)把 currentPage 重置為 1同時(shí)把查詢參數(shù)傳給后端。handleSearch() { this.currentPage 1 this.fetchOrderList() }如果把搜索框和頁(yè)碼聯(lián)動(dòng)封裝到一個(gè)統(tǒng)一的handleQuery方法里還可以進(jìn)一步簡(jiǎn)化handleQuery(resetPage true) { if (resetPage) { this.currentPage 1 } this.fetchOrderList() }5.2 查詢參數(shù)的深拷貝陷阱前端傳搜索條件給后端時(shí)如果直接把響應(yīng)綁定的對(duì)象傳給請(qǐng)求函數(shù)這些參數(shù)對(duì)象其實(shí)是 Vue 的響應(yīng)式代理內(nèi)部帶著各種 getter/setter。在序列化傳輸時(shí)某些情況下會(huì)出現(xiàn)參數(shù)丟失或附加多余字段的問(wèn)題。具體表現(xiàn)是搜索條件明明在界面上看得見(jiàn)但后端收到的請(qǐng)求參數(shù)里卻沒(méi)有。這個(gè)坑在 axios 結(jié)合 Vue 2 的響應(yīng)式系統(tǒng)時(shí)偶有發(fā)生排查起來(lái)非常隱蔽。我的建議是組裝請(qǐng)求參數(shù)時(shí)使用一個(gè)新對(duì)象buildPageParams() { return { page: this.currentPage, pageSize: this.pageSize, keyword: this.keyword ? this.keyword.trim() : , status: this.status, dateRange: this.dateRange ? [...this.dateRange] : [] } }不要直接把this.searchForm整個(gè)傳給請(qǐng)求函數(shù)而是手動(dòng)選取需要的字段組裝新對(duì)象。這樣既避免了響應(yīng)式代理的序列化坑也讓請(qǐng)求參數(shù)變得可控和可調(diào)試。5.3 搜索后頁(yè)碼是保留了但查詢參數(shù)對(duì)不上還有一種常見(jiàn) bug搜索關(guān)鍵詞為 A結(jié)果用戶翻頁(yè)時(shí)把關(guān)鍵詞改成了 B然后點(diǎn)下一頁(yè)請(qǐng)求參數(shù)卻是關(guān)鍵詞 B 第 2 頁(yè)。如果后端不校驗(yàn)頁(yè)碼和查詢條件組合的合法性就會(huì)返回一個(gè)混合結(jié)果。這個(gè)問(wèn)題的根源在于頁(yè)碼和關(guān)鍵詞是兩個(gè)來(lái)源不同、更新時(shí)機(jī)不同的狀態(tài)。解決思路是在翻頁(yè)回調(diào)時(shí)確保用的是當(dāng)前最新的查詢條件async handlePageChange(page) { this.currentPage page await this.fetchOrderList() }只要fetchOrderList每次讀取的是最新的this.keyword、this.status等數(shù)據(jù)而不是在搜索那一刻就拍扁的快照這個(gè)問(wèn)題就不會(huì)出現(xiàn)。所以組裝請(qǐng)求參數(shù)時(shí)務(wù)必在請(qǐng)求方法內(nèi)動(dòng)態(tài)讀取組件狀態(tài)而不是在某個(gè)初始化階段把參數(shù)固化下來(lái)。6. 邊界場(chǎng)景與真實(shí)事故復(fù)盤(pán)刪除、編輯后頁(yè)碼漂移怎么處理分頁(yè)代碼寫(xiě)完之后考驗(yàn)功力的是邊界場(chǎng)景。這部分內(nèi)容網(wǎng)上很難找到系統(tǒng)性總結(jié)大多是從一次次的線上問(wèn)題里摸爬滾打出來(lái)的在這里一并分享。6.1 刪除當(dāng)前頁(yè)最后一條數(shù)據(jù)后的頁(yè)碼回退假設(shè)當(dāng)前是第 3 頁(yè)每頁(yè) 10 條這頁(yè)有 3 條數(shù)據(jù)。用戶刪掉了其中 2 條此時(shí)第 3 頁(yè)可能只剩下 1 條數(shù)據(jù)甚至刪掉最后一條后整頁(yè)變空。如果你只是簡(jiǎn)單刷新當(dāng)前頁(yè)表格很可能顯示暫無(wú)數(shù)據(jù)而實(shí)際上前面還有第 1、2 頁(yè)的數(shù)據(jù)。用戶會(huì)以為數(shù)據(jù)被刪光了實(shí)際上是被空頁(yè)給擋住了。我的經(jīng)驗(yàn)是刪除后重新請(qǐng)求數(shù)據(jù)并且根據(jù)返回的總數(shù)判斷當(dāng)前頁(yè)碼是否越界。更穩(wěn)妥的做法是先刪數(shù)據(jù)成功后重新請(qǐng)求總數(shù)如果當(dāng)前頁(yè)的起始索引大于等于總數(shù)就把頁(yè)碼回退一頁(yè)。async handleDelete(row) { const success await deleteOrder(row.id) if (!success) return // 重新拉取數(shù)據(jù)判斷頁(yè)碼是否需要回退 await this.fetchOrderList() const maxPage Math.max(1, Math.ceil(this.total / this.pageSize)) if (this.currentPage maxPage) { this.currentPage maxPage await this.fetchOrderList() } }注意判斷條件是currentPage maxPage而不是簡(jiǎn)單的total 0。因?yàn)榭赡艹霈F(xiàn)當(dāng)前頁(yè) 5 條刪了 1 條還剩 4 條的情況不需要回退但如果是當(dāng)前頁(yè)最后一條被刪就必須往回退一頁(yè)否則用戶就看不到前面的數(shù)據(jù)了。6.2 編輯數(shù)據(jù)后必須當(dāng)前頁(yè)碼重新拉取編輯場(chǎng)景和刪除不一樣用戶在第 2 頁(yè)編輯了一條數(shù)據(jù)保存后如果直接跳到第一頁(yè)重查用戶的閱讀位置就丟了體驗(yàn)很糟糕。正確做法是停留在當(dāng)前頁(yè)碼重新拉取數(shù)據(jù)。async handleEditSave(formData) { await updateOrder(formData) await this.fetchOrderList() // 保持 currentPage 不變 }這樣既刷新了表格內(nèi)容也保留了用戶的瀏覽位置。這里要特別提醒編輯成功后不要順手把 currentPage 重置為 1除非業(yè)務(wù)方明確要求編輯后回到第一頁(yè)。很多產(chǎn)品經(jīng)理不會(huì)明說(shuō)這個(gè)細(xì)節(jié)但作為開(kāi)發(fā)你要有判斷力。6.3 多 Tab 切換后分頁(yè)狀態(tài)的保持與重置如果頁(yè)面里用了 Tabs 組件每個(gè) Tab 都是一個(gè)列表每個(gè)列表都有獨(dú)立的分頁(yè)狀態(tài)。這里有個(gè)微妙的設(shè)計(jì)取舍有的產(chǎn)品希望切換 Tab 后保留每個(gè) Tab 的頁(yè)碼方便用戶回來(lái)繼續(xù)看。有的產(chǎn)品希望切換 Tab 后重置為第一頁(yè)認(rèn)為用戶重新進(jìn)入某個(gè) Tab 就是一次新的瀏覽。我建議在data中為每個(gè) Tab 維護(hù)獨(dú)立的分頁(yè)狀態(tài)而不是共用一個(gè)currentPagedata() { return { pagerMap: { tabA: { currentPage: 1, pageSize: 10, total: 0 }, tabB: { currentPage: 1, pageSize: 10, total: 0 } }, activeTab: tabA } }, computed: { activePager() { return this.pagerMap[this.activeTab] } }這樣每個(gè) Tab 的頁(yè)碼互不干擾切換回來(lái)時(shí)用戶能回到原來(lái)的位置。滿足 保留瀏覽位置 這一體驗(yàn)要求。6.4 Page 組件尺寸和顯示優(yōu)化的幾個(gè)細(xì)節(jié)View UI 的 Page 組件在業(yè)務(wù)中的使用頻率很高有幾個(gè)屬性配置建議直接借鑒show-total在左側(cè)顯示共 X 條比單獨(dú)放一行文字更直觀。show-elevator顯示跳頁(yè)輸入框數(shù)據(jù)量大、頁(yè)碼多時(shí)很有用。show-sizer顯示每頁(yè)條數(shù)選擇器讓用戶自主調(diào)整 pageSize。placement在有 show-sizer 且組件空間受限時(shí)可以通過(guò) placement 控制 poptip 彈出方向。加上這些屬性后的基礎(chǔ)寫(xiě)法Page :totaltotal :currentcurrentPage :page-sizepageSize show-total show-elevator show-sizer :page-size-opts[10, 20, 50, 100] on-changehandlePageChange on-page-size-changehandlePageSizeChange /6.5 pageSize 切換時(shí)也要回到第一頁(yè)當(dāng)用戶通過(guò) show-sizer 將每頁(yè)條數(shù)從 10 改成 50 時(shí)當(dāng)前頁(yè)碼不能保持原樣。舉個(gè)例子用戶在 10 條/頁(yè)時(shí)停留在第 8 頁(yè)此時(shí)改成 50 條/頁(yè)第 8 頁(yè)其實(shí)只對(duì)應(yīng)原來(lái)的第 5 頁(yè)左右數(shù)據(jù)內(nèi)容會(huì)完全錯(cuò)位。必須把頁(yè)碼重置為 1 再重新查詢才能保證展示邏輯自洽handlePageSizeChange(newSize) { this.pageSize newSize this.currentPage 1 this.fetchOrderList() }7. 封裝一個(gè)通用分頁(yè)表格組件把重復(fù)勞動(dòng)一次解決當(dāng)一個(gè)項(xiàng)目里有十幾個(gè)列表頁(yè)都需要分頁(yè)時(shí)每次都復(fù)制粘貼currentPage、pageSize、total、loading、fetchXxx這五件套會(huì)非常痛苦。我在實(shí)際項(xiàng)目中會(huì)封裝一個(gè)通用組件PagedTable把 Table 和 Page 的組合邏輯收納進(jìn)去業(yè)務(wù)頁(yè)面只關(guān)心怎么取數(shù)。7.1 組件設(shè)計(jì)思路組件的核心設(shè)計(jì)是讓父組件決定數(shù)據(jù)從哪來(lái)讓子組件統(tǒng)一管理分頁(yè)狀態(tài)和交互。我選擇用「?jìng)魅胍粋€(gè)返回 Promise 的取數(shù)函數(shù) 查詢參數(shù)對(duì)象」這樣的組合方式template div classpaged-table Table :columnscolumns :datatableData :loadingloading v-bind$attrs / div classpaged-table__footer Page :totaltotal :currentcurrentPage :page-sizepageSize show-total show-elevator show-sizer :page-size-optspageSizeOpts on-changehandlePageChange on-page-size-changehandlePageSizeChange / /div /div /template組件的 props 可以這樣設(shè)計(jì)屬性名類型說(shuō)明columnsArray表格列配置fetchDataFunction接收分頁(yè)參數(shù)返回 PromisequeryParamsObject查詢條件對(duì)象pageSizeNumber每頁(yè)條數(shù)默認(rèn) 10pageSizeOptsArray可選的每頁(yè)條數(shù)列表immediateLoadBoolean是否創(chuàng)建時(shí)立即加載組件的核心邏輯要感知查詢參數(shù)的變化當(dāng)父組件傳入的queryParams變化時(shí)自動(dòng)重置頁(yè)碼并重新請(qǐng)求數(shù)據(jù)。這一步可以通過(guò)在組件內(nèi)監(jiān)聽(tīng)watch: { queryParams: { deep: true, handler() { this.currentPage 1 this.loadTableData() } } }這里有個(gè)細(xì)節(jié)deep: true的成本不低如果項(xiàng)目中有大量這樣的組件同時(shí)監(jiān)聽(tīng)對(duì)象會(huì)有性能壓力。我的做法是在業(yè)務(wù)頁(yè)面主動(dòng)調(diào)用組件的reload()方法來(lái)替代深監(jiān)聽(tīng)見(jiàn)下方的 7.3 小節(jié)。7.2 組件的完整邏輯實(shí)現(xiàn)下面是我在項(xiàng)目中使用過(guò)的完整PagedTable業(yè)務(wù)組件實(shí)現(xiàn)。它是一個(gè)「行為收斂」的封裝適用于基于 Promise 接口的中后臺(tái) CRUD 列表場(chǎng)景。export default { name: PagedTable, props: { columns: { type: Array, required: true }, fetchData: { type: Function, required: true }, queryParams: { type: Object, default: () ({}) }, defaultPageSize: { type: Number, default: 10 }, pageSizeOpts: { type: Array, default: () [10, 20, 50, 100] }, immediateLoad: { type: Boolean, default: true } }, data() { return { tableData: [], total: 0, currentPage: 1, pageSize: this.defaultPageSize, loading: false, requestSequence: 0 } }, created() { if (this.immediateLoad) { this.loadTableData() } }, methods: { async loadTableData() { const requestId this.requestSequence this.loading true try { const res await this.fetchData({ page: this.currentPage, pageSize: this.pageSize, ...this.queryParams }) if (requestId ! this.requestSequence) return this.tableData res.records this.total res.total // 額外處理若當(dāng)前頁(yè)已經(jīng)被刪空自動(dòng)回退頁(yè)碼 if (this.tableData.length 0 this.currentPage 1) { this.currentPage - 1 return this.loadTableData() } } catch (e) { this.$Message.error(數(shù)據(jù)加載失敗) } finally { if (requestId this.requestSequence) { this.loading false } } }, handlePageChange(page) { this.currentPage page this.loadTableData() }, handlePageSizeChange(size) { this.pageSize size this.currentPage 1 this.loadTableData() }, reload() { this.loadTableData() }, reset() { this.currentPage 1 this.loadTableData() } } }在「當(dāng)前頁(yè)已被刪空」的處理上我在前面 6.1 小節(jié)提到的是「刪除后判斷頁(yè)碼是否越界再回退」而封裝組件時(shí)我傾向于用更穩(wěn)的兜底策略如果接口返回的當(dāng)前頁(yè)數(shù)據(jù)為空且當(dāng)前頁(yè)碼大于 1就自動(dòng)往前退一頁(yè)并重新加載。這樣即使是批量刪除、排序后行數(shù)變化、多端同時(shí)操作導(dǎo)致的數(shù)據(jù)量突變也能自動(dòng)修正頁(yè)碼不會(huì)出現(xiàn)空白頁(yè)。7.3 父組件怎么用這個(gè)組件父組件里只需要把取數(shù)函數(shù)和查詢條件對(duì)象傳進(jìn)去template div div classfilter-bar Input v-modelkeyword placeholder搜索訂單號(hào) clearable on-enterhandleSearch / Button typeprimary clickhandleSearch查詢/Button /div PagedTable refpagedTable :columnscolumns :fetch-datafetchOrderList :query-params{ keyword, status } / /div /template script import PagedTable from /components/PagedTable export default { components: { PagedTable }, methods: { // 注意這個(gè)函數(shù)要保證 this 正確返回 { records, total } fetchOrderList({ page, pageSize, ...rest }) { return getOrderList({ page, pageSize, ...rest }) }, handleSearch() { this.$refs.pagedTable.reset() } } } /script這樣封裝的好處是業(yè)務(wù)頁(yè)面不再需要關(guān)心 currentPage、total、loading 這些狀態(tài)只需要關(guān)注接口怎么調(diào)、列怎么配。當(dāng)項(xiàng)目里列表變多時(shí)這種封裝的復(fù)利效應(yīng)會(huì)非常明顯。不過(guò)要注意封裝組件不要過(guò)度設(shè)計(jì)。如果你的項(xiàng)目只有兩個(gè)列表頁(yè)硬套這個(gè)組件反而增加了理解和維護(hù)成本。我在實(shí)際項(xiàng)目中通常先在兩個(gè)頁(yè)面里跑通這種寫(xiě)法覺(jué)得順了再抽成組件屬于先重復(fù)再抽象的節(jié)奏。8. 實(shí)測(cè)中容易忽略的性能與體驗(yàn)細(xì)節(jié)代碼能跑通只是第一步線上體驗(yàn)才是分頁(yè)的真正考場(chǎng)。這一章集中講我實(shí)測(cè)中重點(diǎn)注意的幾處性能與交互細(xì)節(jié)。8.1 大數(shù)據(jù)量下避免一次性渲染過(guò)多表格行即使走了服務(wù)端分頁(yè)如果 pageSize 設(shè)置成 100 甚至更大Table 要在一幀內(nèi)渲染 100 行乘以若干列的 DOM在低端設(shè)備上依然會(huì)產(chǎn)生明顯的白屏。比如你的報(bào)表頁(yè)允許用戶選擇每頁(yè) 200 條在移動(dòng)端或者性能一般的電腦上視覺(jué)上會(huì)感覺(jué)點(diǎn)了翻頁(yè)之后卡了半秒多。我建議開(kāi)發(fā)階段做一次性能壓測(cè)打開(kāi)瀏覽器的 Performance 面板把 pageSize 調(diào)到 100連續(xù)快速切換 5 頁(yè)觀察每一幀的耗時(shí)。如果 Long Task 超過(guò) 100ms就需要考慮控制 pageSize 上限比如最高 100或者引導(dǎo)用戶使用更高粒度的過(guò)濾條件來(lái)縮小結(jié)果集。8.2 快速翻頁(yè)時(shí)的節(jié)流策略前面 4.3 節(jié)用 requestSequence 解決了響應(yīng)順序錯(cuò)亂的問(wèn)題但如果你連頻繁點(diǎn)擊翻頁(yè)都不希望發(fā)生前端可以再加一層節(jié)流。最簡(jiǎn)單的方式是在handlePageChange里加一個(gè)時(shí)間鎖handlePageChange(page) { if (this.isFetching) return this.currentPage page this.loadTableData() }在loadTableData開(kāi)始和結(jié)束的地方分別把isFetching置為 true 和 false這樣在請(qǐng)求未返回時(shí)用戶點(diǎn)擊任何頁(yè)碼都會(huì)被忽略。這在操作頻繁的管理后臺(tái)里非常實(shí)用能顯著降低后端請(qǐng)求壓力。8.3 頁(yè)碼變化但總分頁(yè)數(shù)為 1 時(shí)的 UI 處理如果接口返回的 total 本來(lái)就是小于等于 pageSize 的值Page 組件會(huì)渲染出 1 頁(yè)。這沒(méi)問(wèn)題但如果同時(shí)開(kāi)啟了 show-sizer用戶把 pageSize 改大后total 可能依然不變。要注意 Page 組件的 total 始終是符合條件的總條數(shù)而不是當(dāng)前頁(yè)的總數(shù)??倵l數(shù)不會(huì)因?yàn)楦?pageSize 而變化的。另外total 是提前知道還是請(qǐng)求返回才知道在服務(wù)端分頁(yè)中首次請(qǐng)求前 total 為空Page 組件渲染出來(lái)是空的這會(huì)造成一點(diǎn)布局抖動(dòng)。如果對(duì)布局穩(wěn)定性有要求可以給 Page 組件加一個(gè)初始 total 為 0并在 table 外層容器給一個(gè)最小高度。8.4 空數(shù)據(jù) vs 總數(shù)為 0 的文案區(qū)分表格數(shù)據(jù)為空時(shí)View UI 的 Table 默認(rèn)顯示暫無(wú)數(shù)據(jù)。但如果 total 為 0 且當(dāng)前頁(yè)為 1屬于正常空態(tài)如果 total 大于 0 但當(dāng)前頁(yè)數(shù)據(jù)為空說(shuō)明頁(yè)碼越界或存在臟數(shù)據(jù)。這兩種情況要分開(kāi)處理正??諔B(tài)保持暫無(wú)數(shù)據(jù)不需要任何操作。頁(yè)碼越界空態(tài)觸發(fā)頁(yè)碼回退邏輯如第 7 章組件中的兜底策略并建議在控制臺(tái)打印一條日志方便排查是哪個(gè)環(huán)節(jié)造成的越界。我之前排查過(guò)一個(gè)線上問(wèn)題某個(gè)訂單列表在切換 Tab 后偶爾出現(xiàn)空白頁(yè)就是Tab 切換后保留了當(dāng)前第 8 頁(yè)的頁(yè)碼但新 Tab 的數(shù)據(jù)總量只有 3 頁(yè)導(dǎo)致的。加上頁(yè)碼回退邏輯后問(wèn)題直接消失。9. 最后再分享兩個(gè)小技巧第一個(gè)技巧關(guān)于請(qǐng)求參數(shù)的調(diào)試。服務(wù)端分頁(yè)的交互鏈路長(zhǎng)定位問(wèn)題時(shí)要學(xué)會(huì)用 curl 復(fù)現(xiàn) 的方法。在 Chrome 的 Network 面板里拿到分頁(yè)請(qǐng)求的完整 URL然后復(fù)制成 curl 命令在終端執(zhí)行看響應(yīng)結(jié)構(gòu)。這比在代碼里打斷點(diǎn)更直接能快速分清是前端參數(shù)問(wèn)題還是后端返回問(wèn)題。第二個(gè)技巧關(guān)于 Table 組件的行高一致性。分頁(yè)后表格每頁(yè)的渲染高度可能不同翻頁(yè)時(shí)頁(yè)面會(huì)出現(xiàn)跳動(dòng)??梢栽?Table 外層設(shè)置一個(gè)固定最小高度比如把數(shù)據(jù)區(qū)域的 min-height 定為(pageSize 1) * 行高這樣翻頁(yè)時(shí)頁(yè)面不會(huì)突然變矮或變高。這個(gè)細(xì)節(jié)在小屏幕終端上特別明顯值得為它做一次適配。分頁(yè)這個(gè)功能說(shuō)難不難說(shuō)簡(jiǎn)單也絕不簡(jiǎn)單。核心還是想清楚數(shù)據(jù)流的來(lái)源與出口把前端展示狀態(tài)和服務(wù)端數(shù)據(jù)請(qǐng)求的邊界理干凈。配合 View UI 的 Table 和 Page 組件只要把頁(yè)碼狀態(tài)、查詢參數(shù)、請(qǐng)求競(jìng)態(tài)、邊界兜底這四件事處理扎實(shí)線上的分頁(yè)體驗(yàn)基本就能穩(wěn)住。希望這篇分享能幫你少踩幾個(gè)坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
96久久久| 九草在线大香蕉| 亚州色图欧美色图| 亚洲91网。| 激情综合二| 夜夜高潮夜夜爽夜夜爱爱一区 | 日本操大逼| 东北女人性交| 欧美中文字幕男人天堂久久精品| 久操网址| 国产精品ww久久| 91色伦综合| 一起草精品人妻| 高清国产精品福利网站| 亚洲图片偷拍欧美| 天堂资源站| 男人的天堂网免费| 2024人人操人人摸| 自拍偷拍草一草| 日韩不卡一二三四| 狠色婷婷久久一区二区三区_| 日韩啪啪网| 1769国内精品视频| 亚洲丝袜诱惑| 欧美性爱第1 页| 免费97视频| 欧美日韩222| 最近的最新的中文字幕视频| 免费的黄片有限公司| 婷婷探花久久精品一区| 自拍第一页| 丝袜美腿校园春色| 伊人97色天使| 国产AV激情无码久久无码| 青青草好吊色| 久久老熟女| 欧美日韩青操| 欧美色图成人网一区二区 | 亚洲精品视频在线播放| 大香蕉丝袜一级片| 伊人成人中文字幕久久网| 国产精品干干干| 屁股久久久久久久久久| 欧洲亚洲综合| 97精品国产精品免费观看| 日韩丝袜人妻AV| 欧美熟女操屄| 日本国产欧美高清在线| 在线人人人人人人精品超 | 久草热制服丝袜在线观看| 亚熟在线| 久久成人东京热人妻| 综合色拍| 人妻人久久精品中文字幕| av天天在线| 超碰97最新人妻| 人妻在线中出视频| 黑丝少妇麻豆| 不卡码视频| 91原创在线观看| 青青草日韩无码| 亚洲综合色网| 嗯嗯啊啊啊好舒服| 国产传媒美日韩av| 久久噜噜噜精品国产亚洲综合| 久日91在线| 传媒免费一区二区三区| 天天操天天日青青草超碰av| 九九热在线精品视频| 91成人国产综合久久精品蜜月| 五月天伊人| 99re99视频在线免费观看| 蜜臀久久久国产| 超碰97在线中文| 中文字幕精品三级久久久| 国产污视频麻豆传媒一区二区| 又摸又舔在线观看网站| 久久宗合亚洲| 日韩精品-原创伙伴| 久久久人妻| AV麻豆免费一区| 插穴性爱视频在线观看| 国产AV久久久蜜爱影集| 91美女视屏| A啊啊在线观看| 91热色| 日日摸日日碰夜夜爽视频| 欧美色图片色哟哟| 美国日韩黄片| 久久9视频| 熟女丰满人妻一区| 日本精品久久久久久久| 亚洲欧美首页| 欧美综合骚| 欧美天堂第二区| 久久啊啊| 飘花国产午夜精品不卡| 91丨九色丨大屁股| 久久99精品国产| av影院十区| 一二三区操逼国产91| caoni国产亚洲av| a级理论午夜日本| 女同在线视频一区| 夜夜嗨老熟女AV一区二区三区| 亚洲欧美色图片| 视频一区二区三区精品| 91碰碰| 99久在线精品99re8a| juliaann欧美丝袜办公室| 无码精品久久| 岛国AV一区二区电影| 婷婷探花久久精品一区| 内射小黄片| 日韩欧美综合激情| 人妻夜夜爽天天爽麻豆三区网站 | 亚洲色交| 人人操AV| 国产9l 大屁股| 午夜福利激情在线视频| 乱理日韩中文| 1240青青草一区二区三区视频天爱| 欧美日韩操逼动图| 欧美日韩国产男人| 麻花豆传媒剧国产MV出差| 中日无幕一二三四区| 国产丁香精品露脸视频| 操逼网免费无码视频| 欧美亚洲se91| 日逼视频日本| 69精品人人人人| 欧美性91| 久久99国产综合精品女同| 日本超碰97日韩精品人妻| 亚洲天堂精品日韩电影| 狠狠欧美| 日本欧美中文字幕| 你操综合| 欧美亚洲情色| 色情亚洲日本成人| 精品久久久久久中文字幕三区| 欧美亚洲第1页| 国产精品乱码久久| 99∨VTV| 亚洲动态色图| 日本美女性生活久久久久久久| 蜜臀久久99精品久久久久久成人小说| 亚洲国产激情国产av| 日韩色图 一区二区| 国产三级多多影院2022国产AA一级毛片无码| 天天干天天日天天射黄色大片 | 日欧操屄| 超碰欧美COM| 超碰人人色| 日日夜夜摸| 男人天堂站| 探花视频免费观看国产专区| 四虎884a| 秋霞视频一区二区| 亚洲综合影院| 青青草五月天| 亚洲成人久久美女| 伊人操| 久久久工口| 亚洲影院无码在线| 久操av在线| 静品嫩模一区二区| 摸奶性爱视频网站在线免费播放| 蜜桃久久久久久久久久久久 | 视频在线中文字幕| 五月婷婷综合网| 久久久青青草| 亚洲综合69| 欧美性爱系列| 亚洲āv网址在线观看| 国产AV天美| 插日本熟女视频| 日本在线伊人啪啪| 99九九久久| 人人摸人人叼| dy888午夜老子影视达达兔| julia中文字幕在线观看| 青草av在线| 国产免费黄色一级大片| 亚洲综合色图欧美| 传媒免费一区二区三区| 色99视频| 午夜超爽| 久操91视频| 久久精品人妻一区二区| 亚洲中文字幕妇伦久久| 夜嗨影院| A一区片| 97美日韩视频| 狠狠躁天天躁日日躁97| 国产日本熟女顶级一区二区三区视频| 黄在线| 97狠狠| 三级网站超变态精品| 影音先锋国产精品| 97在线精品观看视频| 老司机香蕉| 久久精品男人的天堂| 吻戏激情性巴克| 天天影视色香欲综合网小说| 高清孕妇孕交 交孕妇| 久久久久骚| 欧美性巨大╳╳╳╳╳高跟鞋| 久久东京热久久| 怡红院亚洲怡春院av| 青青操少妇| 可以免费观看的AV| 干婷婷综合网| 亚洲古典另类欧美在线| 亚洲无码电影久久久| 97国产中文| 97超碰人操| 久草婷婷| 欧洲与亚洲欧美精品中文字幕| 这里只有精品视频| 日本精品高清一二区一本到| 在线观看亚洲专区| 国产高清精品一区二区三区毛片 | 日韩精品99久久久久久中文字幕| 国产精品国产自产拍高清AV| www四虎| 久久久久免费少妇| 成人精品在线| 五月丁香成人网| 天天综合精品| 欧美性生活综合| 郑州宾馆老熟女露脸啪啪| 乱伦一区二区三区‘| 亚洲精品久久久久毛片A片拉屎 | 黄总AV色图| 国产一区二区三区中文字幕| 色妺妺在线视频| 久jiu久神马影院| 欧美激情亚洲色图| 91色图片| 91黑丝操| 人妻第一页| 99re6在线视频播放免费精品| 一卡二卡三卡| 黄页av| 天天射天天操天天干天天吃2018| 欧美色图片| 肏逼视频日本| 在线观看精品国产免费| 丝袜大香蕉| 偷拍欧美激情| 蜜臀久久99精品| 亚洲男人天堂2013| 久热最新在线杭州| 亚洲欧洲综合av在线| 亚洲中文一区二区三区| 啪啪啪大香蕉| 素颜老阿姨乱情色| 超碰97人妻自拍| 中国一级αV| 成人无遮挡毛片免费看| 色播综合| 欧美熟妇操操视频| 久9爱精品| www国产无码| 亚洲国产ⅴ高清在线观看| 日人妻视频91| 艾草av| 黄久在线| 大肥女高潮bbwbbwhd视频| 久久久久免费看少妇A片特黄| 特级丰满少妇一级AAAA爱毛片| 日本色色网| 欧美 亚洲 偷拍自拍| 日韩亚洲美女一区久久| yy少妇精品久久| 熟妇人妻丰满久久久久久久无码 | 青青草原人妻| 嗯嗯啊好爽| 另类 日韩 熟女| 婷婷五月天成人| 中文字幕78| 久久啊啊啊| 在线观看AV片| 超碰97网址| 超碰99re| 久久精品国产亚洲AV片多多 | 久久9精品网站| 青青操网| 日韩欧美麻豆大片| 国产sv美女内射| 亚洲精品国产熟女| 96免费视频在线| 久久久久国色αv免费观看| 91碰超| 天天干2区3区| 综合久久2017| 国产又色又爽又舒服的三级视频 | 国产精品成人AV片免费看网站| 国产激情av女片自拍| 亚州精品丝袜-不卡成人免费| 日本一卡二区在线| 性爱av网站| 97 九色| 伊人久久综合影院精品久久久| 久久乐| 综合自拍| 九九香蕉网| 日本道日本道中文字幕日本道最新日本道在线观看 | 成人26uuu| 成人综合色网| 国产午夜在线观看| 亚洲AV免费在线观看| 欧美不在线| 99精品久久| 哑洲在线| 美日韩成人| 日本97久久| 日韩精品在线观看网站| 91白嫩| 婷婷综合| 国产91福利小视频在线观看| 人人色人人射人人妻| 日本韩高清无砖码22o| 精品久久久久,69国产成人精| 青青青青青手机视频| 操人91| 国产精品夜夜| 91天天日| 少妇啪啪自拍| 国产和美国毛片| 国产乱伦一二三区| 97资源亚洲| 98色网| 精品无码一区二区三区| 久久精品人妻一区二区| 综合激情婷婷| 视频国产成人精品日本亚洲18| 成人老鸭窝人人在线视频| 国产三级资源在线观看| 本道在线| 欧美极品女人的天堂| 粉嫩av平台| 秋霞鲁丝午夜无码一区二区三| 欧美 亚洲 偷拍自拍| 中文字幕黄色一起草| 混色激情av| 2017人人操,人人摸| 欧美洲精品一级| 亚洲欧美大| 国产第12页| 91色射| 日韩亚洲美州欧洲综三区一品在线| AAAA欧美日韩| 热热色国产一二区AV| 五月天综合网| 在线人成亚洲视频免费观看| 熟女熟妇伦久久影院毛片一区二区 | 色色香蕉| 另类小说欧美激情校园春色| 精品九九九九九九九九九| www…国产操逼| jizz啪啪| 久久久啊啊啊| 九草在线大香蕉| 99自拍视频| 精品国产一区二区三区在线播出| 欧美情色亚洲| 九一精品牛牛一区二区| 国产又黄又猛又粗又爽的网站| 黄色片一区二区三区四区五区| 久久精品国产97欧美精品亚洲 | 国产在线视频午夜精华在| 91成人久久| 91视频国品一二三区| 操逼视频亚洲| 又大又长又粗又爽又黄| 亚洲精品九九九| 怡红院亚洲怡春院av| 殴美综合色88| 97亚洲一区| 久久精品性| 欧美的性爱网站免费| 欧美91变态| 鸥美极品| 天天激色| 91日产欧美| 好吊色一区| 内射白嫩美女| 欧美1727免费观看视频| 蜜桃臀av在线观看| 久久久久婷婷| 人妻-91porn| 乱伦图一区| 亚欧性爱无码| 370p日韩欧美亚洲精品| 欧美大香蕉久| 大屁股人妻女教师撅着屁股| 精品无码久久久久久久杏吧| 少妇久久久久久| 神马麻豆福利院 | 色婷亚洲五月在线观看| 色婷婷网| 婷婷99| 激情深爱五月天| 蜜乳AV色欲AVAV无码| 午夜亚洲国产理论秋霞| 亚洲AV无码AV吞精久久久久| 性久久久| 亚洲精品三区在线观看| 欧美国产欧美在线观看| 少妇xx精品| 成全在线观看免费观看| 久久精品国产亚洲AV无码电影| 天天干干天天干干| 最新中文字幕精品在线| 狠狠色综合网| 99热这里只有精| 粉嫩国产精品久久久| 四虎国产成人精品免费一女五男| 欧美一区二区三区黄色影视| 易易A毛视频| 久久丝袜| 黄色大片免费在线| 顶级丝袜熟女一区二区三区| 一块操欧美性爱| av天堂天堂av日韩| 久草视频分类在线| 欧美综合97www| 九九热超碰97亚洲最新香蕉| 综合久久99亚洲人妻中文在线| 久久久久久免费电影| 黑人性欧美| 国产精品乱码久久久久久久久| 欧美人妻少妇| 天天草夜夜草高潮片| 亚洲 欧美 手机在线观看| 天天日少妇逼AV| 爱干爱射网啊啊啊| 欲香欲色综合天天伊人| 中文字幕黄片在线| 成人性爱电影一区二区| 亚洲欲色9532548967一区| 99蜜桃臀亚洲成人在线观看| 四虎免费在线播放| 中文人妻av高清一区| 免费一级毛片在线视频观看| 91欧美偷拍| 中文字幕精品亚洲熟女| 欧美啪啪啪91| 亚洲伊人成综合成人网| 日亚韩精品视频二区三| 欧美综合色站| 99精品九九九九九九| 五十路六十路七十路熟婆| 亚洲第一在线视频| 人妻爽爽啪视频| 久久春色| 中文字幕在线日亚洲9| 中文字幕久久精视频久久大全| 97欧美久久久久久久| 人人摸人人入| 小泽玛利亚一二三| 国产蜜臀精品一区二区尤物| www亚洲免费| 99热综合| 亚洲九九视频| 国产av又色又爽又黄| 亚洲人在线| 熟妇视频一区二区三区在线| 欧美中出1| 美骚妇av高清在线| 18禁止看精品中文字幕| 婷婷五月天激情网| 亚洲大胆人体av| 无码久久亚洲高清,| 国产一级片| 啊啊啊啊好疼视频| 亚洲最新中文字幕免费 | 九七色图| 九九伊人网| 超碰97最新人妻| 国产真乱mangent| 偷拍欧美激情| 91精品在线播放| 综合免费无码中文| 91爱欧美| 亚洲熟女中文字幕在线| 欧美综合色综合| 在线人人人人人人精品超| 色婷婷淫色网| 亚洲成?V人片在线观看福利| 99热18这里只有精品| 亚州一区二区成人片免费| 久草色悠悠在线视频| 操逼网站网站| 久久这里| 毛片电影一区二区三区| 91精品国| 吻戏激情性巴克| 欧美天天| 大香蕉在线视频重口味毛片在线| 国产操逼逼网| 亚洲精品蜜桃久久久| 九九热在线视频| 欧美综合另类| 97超碰色屌| 很黄很色的视频在线观看| 亚洲日韩欧美一区二区| 亚洲精品aa久久伊人| 中文字幕AV中出| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 蜜桃午夜视频一区二区 | 无码精品久久| 狠狠操狠狠燥| 少妇超碰在线| 吖在线不卡一区二区国产剧情| 欧美激情久久久久| 色综合五月天| 黑人综合网| 台湾大香蕉99热| 欧美国产伊人久久久久| 亚洲97在线| 欧洲精品一区二区三区| 日本理论在线| 婷婷av在线中文字幕| 久操在97| 天美麻豆精品视频99| 亚洲国产一区二区日韩专区| 综合大香蕉美。| 97舔舔| 国产精品无码av嫩草| 亚洲天堂电影网99999| 人妻天天爽夜夜爽爽| 99国产精品视频尤物| 欧美图片校园春色| 天天综合网1| 色色色热| 亚洲制服欧美另类内射| 亚欧高清| 熟女少妇一区二区三区| 动漫av中文| 日韩欧美视频青青| 青青伊人这里只有精品| 视频一区二区三区精品| 国产成人五月天丁香花| 老熟女中文字幕高清| 五月婷婷爱六月丁香色| 萌白酱自拍视频| 日日骚AV| 久久婷婷成人综合色怡春院| 亚洲日韩东京热一区| 久久国产99精品72福利 | 欧洲色综合| 国产av热热色| 操我啊啊啊啊啊| 色情综合网| 色综合久久88色综合久久天天| 男人的天堂免费| 加勒比伊人影院| 六月丁香网| 国产精品无码AV网站| 国内偷自视频区视频综合 | 免費黃色視頻觀看一| 黄片视频,下载| 综合亚洲欧美精品日韩?v| 91爱剪切久久| 欧亚日韩综合精品国产| 久久久久久9999| 男人下部插入女人下部 | 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 琪琪精品免费一区二区三区| 摸奶性爱视频网站在线免费播放| 亚洲男人天堂av| 蜜臀网 一区| 97在线播放| 超碰 欧美| 97在线观看免费| 色香91| www. 男人天堂成人在线| 99只有精品| 97在线青| 91热色| 亚州欧美在线| 射综合网| 久久久国产av美女私房| 看全色黄大色大片免费视频| 欧美偷| 欧美天天干| 啊啊嗯嗯好爽| 国产精品嫩草影院午夜两性 | 97这里都是精品| 97色97好| 在线 亚洲 网爆 自拍| 天天爽天天| 无码91| 亚洲情色图片区| 亚洲熟女一区| 91综合天天看| 国产精品com| 国产亚洲深夜激情| 激情干在线| 99操逼| 久久9久9久99久9久9| 久久久久ab| 亚洲日韩黑丝| 男人亚洲天堂| 日韩欧美性爱电影在线观看| 手机在线中文字幕国产| 精品人人插人人操| 中文字幕加勒比海高清无码免费视频 | 97超碰久久| 永久免费av无码网站国产app| 一区操逼日比视频| 青青草操逼逼视频| 国产 大胆 对白| 青青草在线视频播放器| 国产综合永久精品日韩鬼片| 五月激情在线| 干B| 好一吊区二区| 亚洲无码超碰免费| 国产精品视频白浆免费| 欧美一区二区福利在线| 国产探花日韩援交| 美女91| 超碰导航97| 在线人成亚洲视频免费观看| 一区在线观看中文字幕| 欧美人妻色| 国际精品久久久| 嫩草美女久久| 色婷婷色99国产综合精品| 91亚州欧美| 中文字幕视频二区| 搡老熟女免费视频| 亚洲午夜免费狠狠干| 国产人妻精品一区二区三区秋霞 | 97天天操| 人妻熟女午夜精品在线| 欧美肥臀在线| 熟女突然公开看18禁影片| 国产精品久久久久久久免牛肉蒲团| 夜夜草我| 亚洲精品欧美专业| 国产91亚洲精品一区二区三区| 日韩人妻少妇中文字幕| 一区二区影视| 色啪网| 久久亚洲一区女同性恋中文字幕| 亚洲欧综合另类无码一区| 91超碰碰在线| 欧美熟女操屄| 超碰 欧美| 99ri视频| 神马久久久久| 少妇69中文| 老司机深夜18禁污污网站| 10000部十八禁看电影| 操www| 九九九九精品一区| 久操精品网| 亚洲欧美不卡线| 不卡超碰护士AV在线免费播放| 热99这里有精品综合久久 | 国产白丝av| 蜜桃精品一区二区三区ww| 超碰精品日韩欧美国产| 欧美天堂第二区| 五月丁香社区婷婷日韩欧美精品影院 | 九热超碰| 99热这里| 国产午夜在线观看视频| 日日噜噜夜夜久久亚洲一区二区| 干婷婷综合网| 超碰97人妻在线| 久久超碰97中文字幕| 久操视频资源站公开| 欧美肥臀在线| 欧美一区91大爱| Av手机版天堂网| 亚洲天堂久| 大鸡巴久久久| 成人 日本A片无码8888| 国产白丝网站| 久久久久9999妇女| 狠狠激情综合狠狠操中文字幕| 美女久久久久久久久久久| 熟女欧美日韩综合婷婷| 国产高清成人传媒影视| 99色网| av久日| 91狠婷| A 天堂在线观看视频| 天天伊人| 狠狠爱夜夜干| 用力操死我| 自拍鲍鱼一区在线高清观看免费| 中文AV制服乱伦| 欧美综合网站999| 熟妇人妻一区二区| 东京热免费视频| 尤物视频一区| 日日夜夜精品视频| 久久噜噜噜精品国产亚洲综合| 欧美大香蕉卡久久| 国产成人自拍视频在线| 妇女性内射冈站HDWWWCOM| 日韩久射综合| 东北操逼| 日本欧美色| 欧美乱色| 久久久一区二区三区四曲免费听| 太久视频| 成人97人人超碰人人| 色香av| 99久久e免费热视| 呦呦一区| 夜色91| 91天美免费| 欧美精品,四区。五区| 久久精品老司| 老色69| 91 亚洲 欧洲| 志村玲子视频一区二区| 另类一区| 日韩乱伦视频| 国产偷拍自拍在线视频| 人妻献身系列第54部| 国产一级高清免费观看| 九九九九精| 国产精品一区二区三区四区五区| 人人操人人精品影片| 久久精品中文字幕女同| 加勒比AV天堂| 情侣操 逼视频99| 97 国产一区| 久久久久久九九九九-美女久久久久久久-成人AV| 亚洲丝袜色| 校园春色制服丝袜中文字亚洲| 午夜色婷婷| 五月丁香婷婷综合| 丝袜熟女一区二区三区| 日本激情免费大片| 岛国视频免费在线观看| 国产精品宅男免费| 色综合尤物| 无码自拍SM| 久久精品性| 91操碰| 又黄又爽在线观看视频| 97久久精品亚洲| av在线人气| 东北老女人的激情视频| 国产乱码精品久久久久久 | 一级黄色性爱A级片| 99色热国产视频精品| 唐山老熟妇露脸啪啪叫| 欧亚免费视频| 亚洲激情网一二三四区| 操少妇很爽av| 麻豆 亚洲 97| 天天综合麻豆视频| 亚洲欧洲日韩中文字幕一区| 加勒比伊人| 国产亚洲欧美每日在线| 久久久久久久亚洲Av无码| 亚洲精品日日夜夜52| 91丨九色丨东北熟女| 国产怡红院| 天天操美美| 亚洲女优有码无码高清| 69精品| 精品亚洲国产成人精品| av国产无码| 刺激性视频黄页| 操老熟女AV| 欧美AB在线| 久久综合资源一区二区| 在线只有精品| juliaann丝袜大战黑鬼| 亚洲有薄码区久久在线一区| 亚洲精品一区二区日本| 欧美性爱日韩性爱| 天天日少妇逼AV| 99热 按摩 日韩| 操熟女91| 欧美日韩国产三级黄色| 欧美天天插| 亚洲色图综合网| 国产精品乱码久久| 唐山老熟妇露脸啪啪叫| 超碰午夜在线| 精品视频一区二区| 精品国产91av一区二区三区 | 人妻天天爽夜夜爽2| 好色综合| 91丨九色丨大屁股| 秋霞一区二区三区四区五区六区七区| 91操熟女视频| 日韩av不卡在线看| 夜夜操二区| 久久精品日韩专区免费观看| 韩日色费| 日韩人妻精品久久久久| 欧美综合777| 日本欧美一区二区三区视频麻豆| 狠狠色婷婷7777久| 是还免费视频1727我| 国产精品午夜AV完会免费 | 大茄子熟女AV导航| 日韩国产不卡在线视频| 日本一区二区三区精品| 婷婷丁香人妻| 亚洲欧美国产成人综合不卡| 99精品热| 黄色免费网| 爱射综合| 美女网站91| 成人AV在线电影| 亚洲熟妇AV日韩熟妇在线| 免费国产电影一区二区| 欧美嗯啊……在线观看视频免费| 四虎影视国产精品| 操操逼操操逼操操逼逼| 人妻人人澡人人爽人人| 人妻精品免费一二三区| 欧美午夜精品久久久久久超碰| 伊人欧美大香蕉视频| 欧美激情中文字幕另类小说| 久草男人天堂| 午夜乱轮操逼视频免费看| 禁止观看美女黄| 日韩欧美加勒比| 亚洲有码 视频一区| 亚洲国产天堂| 欧美黑人XXXⅩ高潮交| 97精品一区二区三区免费| 免费黄色片子| 亚洲图片小说欧洲| 亚洲无码99| 99999国产| 99在线精品视频| 久久久人妻| 嗯嗯,啊啊,国产精品| 婷婷超| 97香蕉人人乳| 亚洲第一精品在线视频| 精品一国2| 黄色性爱网网| 五月天精品| 色色国产| 福利视频合集| 91天美传媒精品| 操逼国产免费| 日本色色视频网站| 四虎国产成人精品免费一女五男| 日韩av不卡在线看| 久久综合久色欧美综合狠狠 | 超碰69| 美女自卫慰黄网站免费| 欧美91变态| 少妇三P| 国产精品无码在线| 日骚逼视频| 青青草色情网站视频| 91爆操视频| 一区二区三区麻豆| 亭亭丁香激情| 欧美日韩性爱无码| 精品国产AV一区天美传媒| 超碰 另类 欧美 | 婷婷五月天av| 夜夜操美女| 亚洲影视高清第一页| 屌逼麻豆| 亚洲国产奇米影视久久| 久久日韩肥臀| 91欧美长吊| 两性综合网| 天天影视色香欲综合网小说| 天天草AV| 人妻精品综合中文字幕在线 | 天操天操夜操夜月操月年年操 | 97在线视频观看免费| 97视频观看| 97国产高清视频在线观看| 午夜超碰| 男人成人黄色视频在线观看免费下载| 中文字幕精品一区二区精品| 人人操人人插人人摸人人干| 国产97视频| 亚洲怡春院| 性色高清在线| 色色婷婷丁香| 亚洲无吗在线视频| 91精片| 97久久超碰亚洲| 日日干男人的天堂| 超碰97爽| 婷婷色网| 懂色AV蜜臀无码精品APP| 黑人免费福利视频| 美女黄色91| 99只有精品| 亚洲AV乱码专区国产噜噜亚洲| 去干网最新版| 99精品视频在线观看免费| 神马久久久久久| 久操电影网| 中国黄色特级精品一区二区三区片| 天天综合AV| 天天日天天操心| 午夜欧美女人操逼| 伊人久久综合影院精品久久久| 中文久久久| 欧美性高潮在线| 亚洲精品久久一区二区三区蜜桃臀| 日日夜夜骚| 日韩素人无码一区二区三区三州| 人人色人人操在线| 国产麻豆福利av在线播放| 日欧操屄| 亚洲欧美色图小说| 东北少妇高潮zzzz| 综合97| 五月天亚洲色图| 人人妻人人爽| 青草一区二区| 国产精品久久久久婷婷二区次| 色天天野狼综合社区| 超碰在线1234区| 欧洲亚洲人人爽爽视频| 久久日本熟女精品一区| 粉嫩小泬久久久一区二区| 乱老熟女一区二区三区| 久热精品色情| www.99热在线只有精品| 日韩二三区| 91夜夜蜜桃臀1区2区3区| 真实高潮91| 色眯眯射| 伊人久久大香线综合无码| 国厂麻豆77q4| 蜜屁Av| www. 男人天堂成人在线| 国产精品在线一区二区| 92大香蕉| 综合色好色| 91情色| 收看日本人日bb| 日韩国产欧美伦理在线| 色噜噜精品一区二区三| 黄片免费看黄片免费看| 亚洲欧洲国产综合av| 日韩免费性爱视频在线观看| www.色五月| 国产suv精品一区二区四| 久久9精品视频| 天天综合网1| 亚州欧美综合| 91精品人妻一品二品三品| 国产精品扒开腿做爽爽爽视频| 91色图| 人人看欧美性爱| 精品成人av一区二区三区在线| 99色视频| 黑人中出21连凳花野真衣| av东京热男人的天堂| 嗯~啊~轻一点 视频| 婷婷久月| 密乳AV免费观看| 国产真实野战在线视频| 久久超碰爱| 精品一区二区三区四区女| 国产欧美日产一区二区三区 - 国产欧美日 | 成人三级片一区二区三区视频| 日韩欧美日韩| 黄片com.| 91在线美女| 东方亚洲在线操逼天堂| 天堂男人网| 干日本人少妇午夜寂寞影院| 丁香婷婷久久| 美日韩在线不卡人妻| 亚洲自拍小说| 人人干黄色| 国产原创剧情在线丝袜 | 国产一区二区在线播放量| 亚洲日韩精品在线播放| 久久只有精品一区二区三区| 久久久久久人| 国产日韩欧美中文在线播放| 99热在线播放| 欧美日韩亚洲电影| 欧美综合天天| 国产av美女被艹的乱叫| 精品久久久久黄少妇| 一摸二插三插| 国产亚洲精品久久久久小| 另类小说五月天| 亚洲无限观看| 农村女一级毛卡片| 中文字幕av乱伦| 超碰综合色| 中日韩免费看男女操逼大全| 99热这里只有精品地址| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 色婷婷色99国产综合精品| 97精品视频免费| 亚洲日韩美女丝袜美腿人妻视频| 亚洲人妻中文高清| 中文字幕日韩精品一区二区三区| 国产馆| 亚洲成人久久美女| 国产久久久久影院老熟女| 日韩激情无码影院| 男人的天堂亚洲| 亚州欧美在线| wwwcaobibi| 色拍偷亚洲| 26uuu国产亚洲综合| 人妻久热在线| 天天久久| 亚洲日产专区| 久久精品超碰| 婷婷五月天成人| 久久久久久无码人妻中文字幕| 一本精品日本在线视频精品| 大香蕉十区| 亚欧高清| 九九英色视频| www.99色| 精品小视频在线| 中国操逼无码| 亚欧中文字幕在线视频| 日韩三级在线观看网站| 强上我不卡卡| 天天影视色香欲综合网小说| 97免费在线视频在线观看| 国语少妇精| 九九热九九热| 天天草天天日| 国产大片精久久久久久| 日日干天天干夜夜爽| 色老汉色| 国产日韩色综合| 欧美成人综合| 色综合av男人天堂| 日日AAvv| 亚洲黑丝在线| 伊人国产成人av网站| 精品久久99| 97人人夜夜精品视频| www.男人天堂| 不卡啪啪视频| 粉嫩AV一区二区夜夜| 91亚州日韩高清| 欧美性爱综合,免费| 嗯嗯啊好大| 国产精品自在自拍视频| 亚州五月| oumeisetu综合| 无遮挡一级毛片视频免费的| 大香蕉综合在线| 亚洲色诱惑| 亚洲精品97| 中文字幕十五区| 亚洲日韩成人性爱视频| 天天射夜夜骑| 色女99一级片在线观看| 性爱乱伦视频免费| 欧美在线综合| 啊啊啊啊一区| 日B操| 婷婷五月天色网| 欧美在线官网| 亚洲精品天堂久久A∨51成人漫| 久久久久久裸体| 夜夜一区二区| 日韩精品国产一区二区| 美女爽到高潮91| 亚洲精品一二三四区| 玖玖玖玖精品国产剧情| 一起草视频在线| 欧美青青视频| 五月婷丁香| 八戒午夜福利理论片| 熟女91网| 日韩一级二级在线| 精品成人av一区二区三区在线| 日本视频在线中文字幕| 4虎在线视频| 偷拍网站久久男女男| 国产亚洲精品玖玖玖在线观看| 国产97在线视频| 97欧美色综合| 国产一区二区三区不卡手机在线| 免费人成?大片在线播放| 麻豆三极片| 婷婷人妻激情| 久啪| 116美女午夜| 91干熟女| 亚洲成人无码影院| 国产又黄又爽| 久久久久99精品成人片蜜臀| 欧美aⅴ99久久黑人专区| 五月婷婷综合网| 日韩成人性爱电影在线播放| 日本爽爽爽爽爽爽免费视频| 男人的天堂99| 蜜桃臀一区二区aV| 日韩精品99久久久久久中文字幕| 色丁香五月婷婷| 1024人妻熟女一区二区三区| 亚洲欧洲无码bt精品合集| 98久久超碰| 91精品操美女| 啊啊啊啊啊啊啊在线| 久久av网| 久久久久久久久久久人妻| 4399成人黄A片| 熟女人妇一区二区三区| 日韩操逼HD| 成人26uuu| 美国日韩黄片| 欧美亚洲情色| 久草新在线| 日本精品一区二区不卡| 日本在线15p| 一区e区三| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 日韩不卡网操逼中文字幕日韩| 日本久操视频| 欧美视频在线第3页| 日韩欧美视频青青| 婷婷综合五月天| 婷婷五月天小说| 性爱综合网| 91精品久久久久久综合五月天| 8050午夜少妇无码| 五月天婷精品激情| 天天日天天干天天整| 久久久无码av精| 探花一区在线| 粉嫩av在线一区二区| 伊欧美综合视频| 日韩国产中文字幕| 三级片网站在线播放| 国产精品亚洲美女久久久久| 中国探花熟女| 热九九精品| 屌逼麻豆| 天堂资源欧美| 高潮嗯啊性感美女久久久| 日韩欧美性爱电影在线观看| 欧美视频一| 国产一级内射无挡观看| 一起草日韩|