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://www.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
中日韩免视频上线全都免费| 欧美日韩福利电影| 成人免费毛片app| 性xxxx欧美老肥妇牲乱| 92福利视频午夜1000合集在线观看| 亚洲一区二区久久| 日韩av一区二区三区美女毛片| 日产中文字幕在线精品一区| 99thz桃花论族在线播放| 丁香花在线观看完整版电影| 超碰97成人| 激情综合网天天干| 先锋影音网一区二区| 99久久久精品免费观看国产蜜| 日本韩国欧美在线| 9lporm自拍视频区在线| 麻豆tv入口在线看| 久久99国内精品| 亚洲精品久久久久久国产精华液| 奇米亚洲午夜久久精品| 在线视频亚洲| 激情伊人五月天久久综合| 超清av在线| 亚洲第一色中文字幕| av电影在线网| 国产精品美女久久久久av爽李琼| 女同性一区二区三区人了人一| 色噜噜夜夜夜综合网| 久久精品亚洲94久久精品| 1区2区3区在线| 欧美日韩一区二区在线视频| 韩日欧美一区二区三区| √最新版天堂资源网在线| 中文字幕va一区二区三区| 日韩精品免费视频人成| 欧美极品欧美精品欧美视频| 精品久久久久久一区| 91色在线看| 日本一级理论片在线大全| 日韩专区中文字幕一区二区| 91精品中文在线| 国产精品女同一区二区三区| 成人av网站大全| 国产人成网在线播放va免费| 1区2区3区在线| 日韩精品久久一区| 久久综合激情| 欧美另类女人| 国产久一道中文一区| 国产成人在线视频网址| 久操成人在线视频| 国产一区二区不卡在线| 九九亚洲视频| 日韩欧美视频| 国产精品videossex| 8v天堂国产在线一区二区| 亚洲欧洲一二三| 欧美俄罗斯乱妇| 日韩中文视频| 欧美电影免费观看网站| 二区三区不卡| 1区2区在线| 色多多视频在线观看| 奇米888一区二区三区| 欧美极品第一页| 24小时免费看片在线观看| 免费在线播放电影| 亚洲bt欧美bt精品777| 国产欧美日韩精品在线观看| 三级精品在线观看| 亚洲国产欧美久久| 一区二区91| 亚洲高清影视| 99久久精品一区二区| 国产欧美不卡| 精品国产凹凸成av人网站| 美国一区二区三区在线播放| 成人video亚洲精品| 国产精品激情av电影在线观看| 精品国产99| 欧美日韩国产一区在线| 99re在线观看| 中文一区二区视频| 精品国产鲁一鲁****| 欧美精三区欧美精三区| 成人小视频在线| 日本欧美一级片| 婷婷一区二区三区| 丁香一区二区| 99精品免费| 欧美极品影院| 日本一区免费在线观看| 牛人盗摄一区二区三区视频| 国产亚洲精品美女| 久久亚洲一区二区三区明星换脸| 久久国产剧场电影| 欧美gay视频| 英国三级经典在线观看| 翔田千里亚洲一二三区| 一区二区三区加勒比av| 在线国产精品播放| 欧美伦理在线视频| 国产精品最新| 欧美aaaaa喷水| 欧美精品欧美精品系列c| 国产欧美精品在线观看| 天天综合在线观看| 不卡av免费观看| 成人免费黄色| 亚洲人成网站在线播| 日本美女一区二区三区视频| 第一中文字幕在线| 欧美日韩亚洲在线观看| 好看的中文字幕在线播放| 99香蕉久久| 国产精品爽爽爽爽爽爽在线观看| 亚洲一区在线观看免费观看电影高清| www.日韩欧美| 日韩成人av电影在线| 色棕色天天综合网| gogo在线观看| 成人精品aaaa网站| 日韩欧美在线综合网| 久久精品视频在线看| 伦理在线一区| 成人福利片网站| 亚洲精品高清视频| 欧美激情一级二级| 欧美一二三四区在线| 欧美丰满日韩| 日本不卡一二三区| 91亚洲精品久久久久久久久久久久| 水蜜桃亚洲精品| 国产一区二区三区四区老人| 日本最新高清不卡中文字幕| 成年人国产精品| 97欧洲一区二区精品免费| 秋霞影院一区二区| 国产精品狼人久久影院观看方式| 欧美日韩一区精品| 中国精品18videos性欧美| 亚洲在线视频福利| 麻豆传媒在线完整视频| 国产精品一区二区三区网站| 热色播在线视频| 久久免费99精品久久久久久| 99久久综合狠狠综合久久| 久久理论片午夜琪琪电影网| 国产精品一级黄| 国产日韩欧美综合精品| 这里只有视频精品| 国产综合激情| 成人av网址在线观看| 久久精品国产一区二区三区免费看| 亚洲电影成人| 伊人久久高清| 波多野结衣视频一区二区| 波多一区二区| 中文一区在线播放| 天天爽夜夜爽夜夜爽精品视频| 午夜日本精品| 亚洲欧美日韩国产中文在线| 欧美精品一区在线播放| 色综合天天综合网天天看片|