嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

移動端列表查詢最佳實踐

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 (在資源的表達中包含了鏈接信息。客戶端可以根據鏈接來發現可以執行的動作)

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.sdgs6788.com

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 久久高清免费观看| 欧美在线视频日韩| 国产精品免费网站| 欧美剧在线观看| 欧美日韩国产区| 国产精品a久久久久久| 欧美日韩久久精品| 欧美午夜寂寞影院| 国产欧美精品va在线观看| 国产一区自拍视频| 伊人久久男人天堂| 夜夜嗨一区二区三区| 性做久久久久久免费观看欧美| 欧美在线高清| 欧美超级免费视 在线| 99精品国产在热久久| 欧美一级在线视频| 欧美成人激情视频| 国产精品亚洲视频| 亚洲黄色免费电影| 午夜精品福利一区二区三区av| 久久久噜噜噜久久| 日韩视频三区| 老司机久久99久久精品播放免费| 亚洲激情电影在线| 夜夜爽av福利精品导航| 久久精品99国产精品| 欧美黄色一区| 亚洲欧美日韩国产综合在线| 免费日韩一区二区| 国产真实乱子伦精品视频| 亚洲精品日韩激情在线电影| 久久精品国产77777蜜臀| 亚洲日本电影在线| 亚洲在线观看视频网站| 欧美精品日韩| 在线观看一区视频| 久久国产精品久久w女人spa| 亚洲免费电影在线观看| 免费中文字幕日韩欧美| 国产综合色产在线精品| 午夜一区在线| 日韩网站在线观看| 欧美成人在线免费视频| 激情六月婷婷久久| 欧美一区二区三区四区高清| av不卡在线| 欧美日韩综合不卡| 亚洲免费电影在线观看| 欧美国产日韩精品| 久久青青草综合| 极品av少妇一区二区| 久久久久国内| 午夜视黄欧洲亚洲| 国产噜噜噜噜噜久久久久久久久| 夜夜爽99久久国产综合精品女不卡| 亚洲第一主播视频| 欧美va天堂| 99在线精品视频| 日韩视频在线观看| 欧美三级在线播放| 亚洲欧美成人一区二区三区| 99riav国产精品| 国产精品麻豆va在线播放| 亚洲自拍另类| 亚洲欧美一区二区三区久久 | 久久久久久久成人| 国产午夜亚洲精品理论片色戒| 欧美一区二区日韩| 欧美在线黄色| 亚洲国产欧美在线| 亚洲国产高清一区| 欧美人体xx| 亚洲欧美日韩综合国产aⅴ| 亚洲欧美国产毛片在线| 国产欧美一区二区三区在线看蜜臀| 久久riav二区三区| 久久精品一区二区三区不卡| 亚洲电影在线| 亚洲精品免费一区二区三区| 欧美日韩在线直播| 久久av资源网站| 美女主播一区| 亚洲一区二区三区在线看| 久久丁香综合五月国产三级网站| 可以看av的网站久久看| 亚洲国产成人午夜在线一区| 久久一综合视频| 欧美激情亚洲视频| 亚洲你懂的在线视频| 久久xxxx精品视频| 亚洲精选在线| 午夜精品福利在线观看| 亚洲二区视频在线| 一区二区三区欧美在线观看| 国内自拍一区| 日韩一二三区视频| 狠狠色狠狠色综合日日五| 亚洲激情电影在线| 国产伦精品一区二区三区免费迷| 久久综合九色综合欧美就去吻| 欧美激情亚洲一区| 久久人人爽爽爽人久久久| 欧美日韩成人在线观看| 久久亚洲不卡| 国产精品久久久久久久久免费樱桃 | 亚洲靠逼com| 国产一区二区视频在线观看| 亚洲激情午夜| 在线精品国产欧美| 午夜精品久久久久久久99樱桃 | 国产午夜精品美女视频明星a级| 欧美激情国产日韩精品一区18| 国产精品高清在线观看| 亚洲高清一区二| 激情婷婷久久| 午夜精品久久久久久久99黑人| 一区二区三区国产在线观看| 免费日韩av片| 欧美成人福利视频| 黄色一区二区三区| 久久国产一区| 久久久精品网| 国产一级久久| 欧美亚洲一区二区三区| 午夜在线视频观看日韩17c| 欧美色图麻豆| 一区二区三区视频在线观看| av不卡在线观看| 欧美日韩国产电影| 亚洲看片免费| 亚洲女人小视频在线观看| 欧美日一区二区三区在线观看国产免| 欧美激情一区在线| 91久久夜色精品国产网站| 免费成人在线视频网站| 欧美国产视频在线| 在线精品国精品国产尤物884a| 亚洲欧洲在线观看| 亚洲人成77777在线观看网| 久久综合99re88久久爱| 免费人成精品欧美精品| 精品成人一区二区三区四区| 久久精品国产亚洲高清剧情介绍| 久久精品一本久久99精品| 国产精品美女久久| 亚洲免费影视| 久久一区中文字幕| 亚洲第一精品夜夜躁人人躁| 久久综合99re88久久爱| 亚洲国产欧美在线| 一区二区高清| 国产精品视频久久一区| 欧美一区二区三区免费观看| 久久狠狠亚洲综合| 亚洲电影免费在线| 欧美劲爆第一页| 亚洲一区二区三区乱码aⅴ| 久久精品在线视频| 亚洲欧洲一区二区三区| 欧美日韩综合精品| 欧美影院在线| 欧美激情精品久久久久久久变态 | 欧美日韩亚洲一区二区三区| 亚洲网址在线| 久久综合色天天久久综合图片| 亚洲人永久免费| 国产精品视频1区| 久久综合伊人77777麻豆| 日韩一级免费观看| 久久久久免费| 在线综合+亚洲+欧美中文字幕| 国产欧美91| 欧美日韩精品福利| 久久成人羞羞网站| 亚洲精品你懂的| 亚洲免费在线看| 91久久精品国产91久久性色tv | 国产一区二区三区在线观看视频| 欧美成人激情视频| 午夜激情亚洲| 99日韩精品| 欧美顶级艳妇交换群宴| 欧美亚洲视频在线观看| 99re热精品| 1024成人| 国产在线拍偷自揄拍精品| 欧美日韩三级| 可以免费看不卡的av网站| 午夜欧美精品| 亚洲婷婷在线| 亚洲精品欧美日韩专区| 欧美1区2区视频| 久久久久久综合| 欧美在线视频导航| 午夜精品久久久久久久99樱桃| 一个色综合导航| 亚洲美女黄色片| 亚洲国产精品毛片| 一区二区视频欧美|