如何用Vue技術完美記住滾動條和實現下拉載入呢?本文詳細教你

来源:https://www.cnblogs.com/chengxuyuanaa/archive/2020/07/22/13359159.html
-Advertisement-
Play Games

滾動條 常見於移動端 App 在滾動點擊進入的時候 問題描述 當我們在開發 web app 的時候,經常會遇到一個問題,就是當從一個可滾動的列表頁進入到下一個詳情頁面,然後返回列表頁面的時候,很難去還原滾動條的狀態,無法記住進來時候的位置。 以前我嘗試過很多方法: 有 vue-router 自帶的 ...


 

滾動條

常見於移動端 App 在滾動點擊進入的時候

問題描述

當我們在開發 web app 的時候,經常會遇到一個問題,就是當從一個可滾動的列表頁進入到下一個詳情頁面,然後返回列表頁面的時候,很難去還原滾動條的狀態,無法記住進來時候的位置。

以前我嘗試過很多方法:

  1. 有 vue-router 自帶的 scrollBehavior,需要記住 scrollTop,然後還原,但是管理這個 scrollTop 顯得很麻煩,有的時候還不容易取值
  2. 還有使用純 CSS 的方式,在列表頁面放置一個 router-view,詳情頁面利用 position 和 z-index 覆蓋列表頁面,返回後直接顯示的就是原來的列表頁面,這個必須把各層頁面路由預先配置好,不然就會顯示混亂了,並且同一個頁面出現在不同的子路由下,需要配置多次,比如商品詳情需要配置在很多個地方,造成冗餘
    3、要註意:光理論是不夠的。在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

以上解決方案都不理想

解決方案

後來我參考 keep-alive 開發了 vue-page-stack 來保存 Vue 頁面的棧,即 Vue 中的虛擬 dom,但是滾動條的問題仍然沒解決。因為虛擬 dom 沒有記錄各個組件的滾動狀態,所以無法恢復。

在我使用 cube-ui 的時候發現,使用這個組件庫裡面的滾動容器,是可以還原出滾動條的,進一步發現是黃軼老師的 better-scroll 的原因。

通過查看 bs 的源碼發現,原來是 bs 的內部實現不是原生滾動,而是記錄一些滾動的信息,其中最重要的就是 x 和 y,也就是滾動的值,自己實現了一套滾動行為通過 transform 去實現,在還原虛擬 dom 的時候,滾動的信息也被還原了。

最終就是 vue—page-stack + bs 可以完美實現頁面棧的還原

下拉載入

這個問題多見於消息記錄等查詢,在小程式中也會這遇到這樣的問題

問題描述

絕大多數滾動場景都是上拉載入,上拉載入的時候,載入的內容在滾動區域的下方出現,載入之後,我們將數據添加到列表,由 Vue 等負責渲染新載入的內容,我們繼續上拉就可以繼續滾動查看。

但在我們的場景下,在某一會話中翻閱消息記錄的時候,是下拉載入更多消息,載入後,繼續下拉慢慢滾動查看。這就導致了一個很嚴重的問題:下拉載入後出現的內容在滾動區域的上方,不做任何處理的話載入後會直接跳到新載入內容的最上方,因為滾動距離沒變,這就出問題了,和我們想實現的不一致。

解決方案

也想了很多的方法,包括計算新增加消息的總長度,然後滾回來,但是消息的類型和高度不一致,計算會有誤差。

最終想到的處理辦法就是:

  1. 通過介面獲取到載入信息後首先標記(使用 shouldScroll 標記)後端返回的第一條信息,也就是載入後我們的視角要看到的新內容
  2. messageList 更新後,Vue 會更新數據和視圖,這時候頁面 dom 被更新了
  3. MessageItem 組件 mounted 後,這時候已經完成了視圖的渲染,通過檢查標記(shouldScroll),通知父容器滾動到剛纔標記的位置,也就是載入的第一條信息處,這樣也就把渲染和滾動做到一起了

以上兩個問題在下圖均有體現,效果還可以,如下:

以上內容在我的即時通訊應用客戶端中均有體現,歡迎查看源碼,另外要註意:光理論是不夠的。在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.屬性選擇器 通過HTML的屬性及屬性值來選擇元素,如<p att= "val" >文本內容</p>,class 即是<p>元素的屬性,val 則是 att 的屬性值 屬性選擇器的書寫格式:元素[屬性名稱 = "屬性值"] {color: red; },等號只是其中一種關係符號 屬性選擇器類型: ...
  • “常說,要認識一個人①,大概瞭解一下背景,然後見面時打招呼講什麼語言規矩範禮②,她回應了,聲音很好聽,你會繼續選擇③用選擇什麼語氣對待?而且又怎麼漂亮,相信自己不會拒絕④的,來預先處理⑤好情緒,好讓彼此能有一個新的開始⑥,給生活一個甜美的謎底吧⑦”--晚安,EmilyChen! (一)CSS簡介 C ...
  • 介紹了 javascript 偽協議, 並說明瞭它的特點及其用途 ...
  • 假設有這麼一條數據 const data = [ { "15日": 0, "27日": 0, "13日": 0, "25日": 0, "11日": 0, "23日": 0, "31日": 0, "21日": 2, "9日": 0, "7日": 0, "5日&q ...
  • 隨著我國經濟的飛速發展,室內地圖定位必將是GIS發展的一大趨勢,應運而生。縱觀當前GIS領域的發展狀況,室外地圖相關的產品比較成熟,像百度、google、arcgis等都是在GIS領域很具有代表性的,但是個性化室內地圖卻微乎其微,深圳市易景空間地圖專業致力於室內地圖平臺的研究,如何製作個性化效果好看... ...
  • 經過一天的的工作或者學習是否感到枯燥乏味?現在的你是否想找些樂子?下麵我將教大家製作簡單易做的3D煙花動態網頁,告別無聊與乏味。。。。。 第一步:首先新建一個文本文檔。 第二步:將以下代碼複製到該文本文檔中,保存。 <!doctype html><html><head><meta charset=" ...
  • 在移動端開發時,經常會遇到在視網膜屏幕中元素邊框變粗的問題。本文將帶你探討邊框變粗問題的產生原因及介紹目前市面上最好的解決方法。 ...
  • body { font-family: 'Lora', serif; font-size: 16px; color: #6f6767;}a { color: #6f6767;}a:hover { color: #17223f; text-decoration: none;}a:focus { out ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...