92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

移動端列表查詢最佳實踐

2020-4-27    seo達人

無論是 pc 端還是移動端,無可避免都會涉及到列表查詢有關的操作,但對于這兩種不同的設備,其列表查詢的最佳處理方式也是完全不同。

對于 pc 端列表查詢來說,前端通常是給與服務端當前需要獲取的數據量(如 pageCount,limit 等參數)以及所需要獲取數據的位置(如 pageSize,offset 等參數)作為查詢條件。然后服務端然后返回數據總數,以及當前數據,前端再結合這些數據顯示頁面總數等信息。這里我稱為相對位置取數。

對于移動端而言,沒有pc 端那么大的空間展示以及操作,所以基本上都會采用下拉取數這種方案。

那么我們在處理移動端列表查詢時候使用這種相對位置取數會有什么問題呢?

相對位置取數存在的問題

性能劣勢

通過相對位置取數會具有性能問題,因為一旦使用 offset 信息來獲取數據,隨著頁數的增加,響應速度也會變的越來越慢。因為在數據庫層面,我們每次所獲取的數據都是“從頭開始第幾條”,每次我們都需要從第一條開始計算,計算后舍棄前面的數據,只取最后多條數據返回前端。

當然了,對于相對位置取數來說,數據庫優化是必然的,這里我就不多做贅述了。對于前端開發來說,優秀的的查詢條件設計可以在一定方面解決此問題。

數據顯示重復

事實上,對于一個實際運行的項目而言,數據更新才是常態,如果數據更新的頻率很高或者你在當前頁停留的時間過久的話,會導致當前獲取的數據出現一定的偏差。

例如:當你在獲取最開始的 20 條數據后,正準備獲取緊接著的后 20 條數據時,在這段時間內 ,發生了數據增加,此時移動端列表就可能會出現重復數據。雖然這個問題在 pc 端也存在,但是 pc 端只會展示當前頁的信息,這樣就避免了該問題所帶來的負面影響。

結合列表 key 維持渲染正確

我們在上面的問題中說明了,移動端下拉加載中使用相對位置查詢取數是有問題的。

那么,如果當前不能迅速結合前后端進行修改 api 的情況下,當服務端傳遞過來的數據與用戶想要得的數據不一致,我們必須在前端進行處理,至少處理數據重復問題所帶來的負面影響。

因為當前分頁請求時無狀態的。在分頁取到數據之后前端可以對取得的數據進行過濾,過濾掉當前頁面已經存在的 key(例如 id 等能夠確定的唯一鍵)。

通過這種處理方式,我們至少可以保證當前用戶看到的數據不會出現重復。同時當列表數據可以編輯修改的時候,也不會出現因為 key 值相同而導致數據錯亂。

通過絕對位置獲取數據

如果不使用相對位置獲取數據,前端可以利用當前列表中的最后一條數據作為請求源參數。前端事先記錄最后一條數據的信息。例如當前的排序條件為創建時間,那么記錄最后一條數據的創建時間為主查詢條件(如果列表對應的數據不屬于個人,可能創建時間不能唯一決定當前數據位置,同時還需要添加 ID 等信息作為次要查詢條件)。

當我們使用絕對位置獲取數據時候,雖然我們無法提供類似于從第 1 頁直接跳轉 100 頁的查詢請求,但對于下拉加載這種類型的請求,我們不必擔心性能以及數據重復顯示的問題。

對于相對位置取數來說,前端可以根據返回數據的總數來判斷。但當使用絕對位置取數時,即使獲取數據總數,也無法判斷當前查詢是否存在后續數據。

從服務器端實現的角度來說,當用戶想要得到 20 條數據時候,服務端如果僅僅只向數據庫請求 20 條數據,是無法得知是否有后續數據的。服務端可以嘗試獲取當前請求的數據條數 + 1, 如向數據庫請求 21 條數據,如果成功獲得 21 條數據,則說明至少存在著 1 條后續數據,這時候,我們就可以返回 20 條數據以及具有后續數據的信息。但如果我們請求 21 條數據卻僅僅只能獲取 20 條數據(及以下),則說明沒有后續數據。

如可以通過 “hasMore” 字段來表示是否能夠繼續下拉加載的信息。

{ data: [], hasMore: true }

結合 HATEOAS 設計優化

事實上,前面我們已經解決了移動端處理列表查詢的問題。但是我們做的還不夠好,前端還需要結合排序條件來處理并提供請求參數,這個操作對于前端來說也是一種負擔。那么我們就聊一下 HATEOAS 。

HATEOAS (Hypermedia As The Engine Of Application State, 超媒體即應用狀態引起) 這個概念最早出現在 Roy Fielding 的論文中。REST 設計級別如下所示:

  • REST LEVEL 0: 使用 HTTP 作為傳輸方式
  • REST LEVEL 1: 引入資源的概念(每一個資源都有對應的標識符和表達)
  • REST LEVEL 2: 引入 HTTP 動詞(GET 獲取資源/POST 創建資源/PUT 更新或者創建字樣/DELETE 刪除資源 等)
  • REST LEVEL 3: 引入 HATEOAS (在資源的表達中包含了鏈接信息??蛻舳丝梢愿鶕溄觼戆l現可以執行的動作)

HATEOAS 會在 API 返回的數據中添加下一步要執行的行為,要獲取的數據等 URI 的鏈接信息??蛻舳酥灰@取這些信息以及行為鏈接,就可以根據這些信息進行接下來的操作。

對于當前的請求來說,服務端可以直接返回下一頁的信息,如

{ data: [], hasMore: true, nextPageParams: {}    
}

服務端如此傳遞數據,前端就不需要對其進行多余的請求處理,如果當前沒有修改之前的查詢以及排序條件,則只需要直接返回 “nextPageParams” 作為下一頁的查詢條件即可。

這樣做的好處不但符合 REST LEVEL 3,同時也減輕了前端的心智模型。前端無需配置下一頁請求參數。只需要在最開始查詢的時候提供查詢條件即可。

當然,如果前端已經實現了所有排序添加以及查詢條件由服務端提供,前端僅僅提供組件,那么該方案更能體現優勢。 前端是不需要知道當前業務究竟需要什么查詢條件,自然也不需要根據查詢條件來組織下一頁的條件。同時,該方案的輸入和輸出都由后端提供,當涉及到業務替換( 查詢條件,排序條件修改)時候,前端無需任何修改便可以直接替換和使用。

其他注意事項

一旦涉及到移動端請求,不可避免的會有網絡問題,當用戶在火車或者偏遠地區時候,一旦下拉就會涉及取數,但是當前數據沒有返回之前,用戶多次下拉可能會有多次取數請求,雖然前端可以結合 key 使得渲染不出錯,但是還是會在緩慢的網絡下請求多次,無疑雪上加霜。這時候我們需要增加條件變量 loading。

偽代碼如下所示:

// 查詢 function search(cond) {
  loading = true api.then(res => {
      loading = false }).catch(err => {
      loading = false })
} // 獲取下一頁數據 function queryNextPage() { if (!nextPageParams) return if (!loading) return search(nextPageParams)
}

日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
91麻豆精品激情在线观看最新| 男人的天堂在线视频免费观看| 日韩成人av一区| 亚洲精品午夜久久久| 国产伦一区二区三区色一情| 欧美体内谢she精2性欧美| 亚洲精品中文字幕在线| a级日韩大片| 日韩**一区毛片| 中文字幕在线看视频国产欧美在线看完整| 欧美在线观看网址综合| 亚洲电影在线一区二区三区| 亚洲综合激情小说| 国产午夜精品视频| 91久久精品美女高潮| www.在线视频| 国产一区二区三区在线免费观看| 中文字幕日韩精品在线| 色综合蜜月久久综合网| 亚洲欧美韩国综合色| www.久久久久久久久| 国产精品乡下勾搭老头1| 在线观看视频一区二区三区| 国产不卡人人| 欧美理论片在线播放| 中文字幕日韩欧美精品高清在线| 日韩理伦片在线| 任我爽精品视频在线播放| 91精品国产一区二区三区香蕉| 激情欧美一区| 91国产中文字幕| 婷婷丁香综合| 亚洲三级在线观看| 亚洲国产婷婷| 成人高清免费在线| 肉丝袜脚交视频一区二区| 日韩小视频在线| 澳门av一区二区三区| 大地资源中文在线观看免费版| 午夜视频在线免费观看| 色姑娘综合av| 国产欧美婷婷中文| 五月激情丁香一区二区三区| 91精品国产高清一区二区三区| 国产女主播一区| 成人的网站免费观看| 欧美综合二区| 国产亚洲一区二区三区| 国产一区二区三区在线观看免费视频| 久久韩国免费视频| 欧美一级精品片在线看| 99精品视频在线观看免费播放| 欧美性猛交xxxxx水多| 日韩欧美成人区| 久久99热精品| 一区二区三区视频观看| 欧美有码在线观看| www.久久久| 久久精品嫩草影院| 在线āv视频| 亚洲bbw性色大片| 欧美精品videosex牲欧美| 国产欧美精品一区二区三区| 色先锋久久影院av| 国产精品久久久久久亚洲毛片| 成人免费在线播放| 欧美日韩免费观看一区三区| 性高爱久久久久久久久| 久久精品最新地址| 伊人精品成人久久综合软件| 亚洲一区二区三区免费在线观看| 亚洲高清123| 精品久久久久久久久久| 国产亚洲免费的视频看| 久久久国产一区二区三区四区小说| 97在线视频观看| 欧美激情综合色综合啪啪| av成人毛片| 欧美挠脚心视频网站| 成人高清伦理免费影院在线观看| 26uuu亚洲| 人成在线免费网站| 亚洲一区二区在线视频| 国语自产精品视频在线看一大j8| 欧美在线一区二区三区| 欧美三级网页| 123区在线| 亚洲天堂a在线| 区一区二区三区中文字幕| 久久人人爽人人爽人人片av高请| 国产精品久久久久三级| 国产不卡一区视频| 黑人巨大精品欧美一区二区| 国产一区二区三区四区| 日本视频在线观看| 午夜激情视频在线| 亚洲欧美另类久久久精品2019| 亚洲一区二区三区久久| 视频一区视频二区国产精品| 日韩电影一区| 欧美高清www午色夜在线视频| 久久99精品久久久久婷婷| 中文字幕在线观看一区二区| 亚洲精品aaaaa| 六十路精品视频| 欧美成年人视频网站| 99riav视频一区二区| 青青草精品毛片| 丝袜足脚交91精品| 日韩一区二区三区精品视频| 女同另类激情重口| 在线亚洲精品福利网址导航| 男人影院在线观看| 大美女一区二区三区| 久久久久久婷| 97av在线视频| 国产精品久久久久99| 久久综合资源网| 视频一区二区综合| 国产精品久久久久久久久妇女| av电影在线观看完整版一区二区| 午夜成人在线视频| 精品蜜桃在线看| 欧美激情中文字幕一区二区| 国产美女一区| 亚洲色图视频免费播放| 亚洲在线网站| 91偷拍精品一区二区三区| 色综合久久综合网97色综合| 欧美日韩视频在线第一区| 日本欧美肥老太交大片| 日韩欧美一级精品久久| 先锋在线资源一区二区三区| 久久久97精品| 国产成人自拍高清视频在线免费播放| 亚洲草草视频| 国产精品免费99久久久| 97福利一区二区| 久久品道一品道久久精品| 国产精品久久久久久久久久尿| 国内精品免费**视频| 超碰在线观看免费| 国偷自产av一区二区三区小尤奈| 国产精品欧美三级在线观看| 高清一区二区中文字幕| 91九色综合| 亚洲综合免费观看高清完整版在线| 午夜精品一区二区三区国产| 欧美一级片免费看| 一区二区三区国产在线观看| 欧美xxxx在线| 欧美精品在线播放| 欧美在线免费| av电影在线观看不卡| 日韩三级.com| 亚洲国产日韩一级| 日韩av一二三| 久久资源综合| 色域天天综合网| 好久没做在线观看| 岛国av在线播放| 亚洲成人久久网| 国产免费a∨片在线观看不卡| 国产精品美女久久久久|