React SPA 應用 hash 路由如何使用錨點

来源:https://www.cnblogs.com/kwzm/archive/2019/08/19/11379999.html
-Advertisement-
Play Games

當我們在做 SPA 應用的時候,為了相容老的瀏覽器(如IE9)我們不得不放棄 HTML5 browser history api 而只能採用 hash 路由的這種形式來實現前端路由,但是因為 hash 被路由占據了,導致本來不是問題的錨點功能卻成了一個不大不小的問題。 經過我自己的搜索目前有兩種方式 ...


當我們在做 SPA 應用的時候,為了相容老的瀏覽器(如IE9)我們不得不放棄 HTML5 browser history api 而只能採用 hash 路由的這種形式來實現前端路由,但是因為 hash 被路由占據了,導致本來不是問題的錨點功能卻成了一個不大不小的問題。

經過我自己的搜索目前有兩種方式能夠解決這個問題,為了能在 react 生態下麵簡單優雅的使用,我專門封裝了一個錨點組件 react-anchor-without-hash,它使用了類似原生 a 標簽的寫法,並且可以支持滾動的距離和指定滾動的元素,儘可能的滿足業務的需求。

不過在介紹這個組件之前,還是得先說一下兩種基本的解決方案。

兩種解決方案

scrollIntoView

scrollIntoView 方法可以讓當前的元素滾動到瀏覽器視窗的可視區域內。
它的使用方法如下:

var element = document.getElementById("box");

element.scrollIntoView();

這個 api 相容 IE8 及以上的瀏覽器,所以可以放心使用。

註:IE10 之前的 IE 瀏覽器部分支持,具體請查看Can I Use

scrollTop

另一個方法是使用 scrollTop 這個 api,這個方法的相容性也是比較好的,這個方法相比於 scrollIntoView 來說需要你自己定義要滾動的元素和要滾動的高度,雖然看起來麻煩一些,但是好處是自由度比較高,試想一下下麵的場景:

  • 你有一個 A 元素在 Content 裡面,Content 設置了滾動,你想讓 A 元素滾動到可視區域內。

  • 如果用 scrollIntoView 會變成下麵這樣,A 元素顯示到整個瀏覽器視口的最上面,這樣就會和 Header 重合,被遮擋住一部分。

  • 所以這時候需要使用 scrollTop 去設置 content 滾動距離,比如說是 60px,最後的效果就變成了我們想要的結果。

使用方式如下:

const cont = document.querySelector('#container');
const a = document.querySelector('#a');

cont.scrollTop = a.offsetTop + 60;

react-anchor-without-hash

以上兩種方式如果想方便的在項目裡面使用多少都需要封裝一下,而且使用起來和原生的 a 標簽形式也相差甚遠。

但是如果是在 react 技術棧下,我們可以利用組件來封裝一個類似 a 標簽的錨點,這樣在使用形式上,我們就能更接近於原生的方式,降低使用成本。

於是我寫了這個 react 組件,相容以上兩種方案,讓你能夠非常簡單的實現錨點,如果使用了該組件的話,上面的實現方式就會變成下麵這樣:

import Anchor from 'react-anchor-without-hash'

// ......

const anchorProps = {
  type: 'scrollTop',
  container: '#container',
  interval: 60
}

<div id="container" style={{position: 'relative', overflow: 'scroll'}}>
  <Anchor name="a" {...anchorProps}>
    <div>
      <h2>This is a</h2>
      <div>There are some text...</div>
    </div>
  </Anchor>
</div>

這時候你只需要在頁面的地址欄輸入: http://somehost/path/#hash?_to=a 頁面就會讓 A 滾動到你想要的位置啦!

github:https://github.com/kwzm/react-anchor-without-hash

demo:https://kwzm.github.io/react-anchor-without-hash/

codesandbox: https://codesandbox.io/embed/react-anchor-without-hash-2xq2h

歡迎討論和Star!!!


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

-Advertisement-
Play Games
更多相關文章
  • 在做一些訂單金額、合同金額轉換的時候,經常會遇到數字轉成中文的情況,所以整理了一個數字轉中文的函數; ...
  • 個人使用SQL Server日常用到的一些函數(會不斷的更新完善) 1.獲取當前時間--getdate() 2.DATEPART() 函數 3.字元串截取--substring 三個參數,第一個參數需要截取的,第二個參數,截取字元串的起始位置(起始位置是1),第三個參數需要截取字元串的長度。 4.日 ...
  • 背景 資料庫中有一張叫 的表,每天都有幾百萬新的小姐姐插到表中,光陰荏苒,夜以繼日,日久生情,時間長了,表中就有了幾十億的 數據,看到幾十億的小姐姐,每到晚上,我可愁死了,這麼多小姐姐,我翻張牌呢? 辦法當然是精兵簡政,刪除那些 的,給年輕的小姐姐們留位置... 於是我在資料庫中添加了一個定時執行的 ...
  • 喜接新項目往往預示的會出一堆問題。解決問題的同時往往也就是學到更多東西的時候,這也許就是學習到新東西最直接最快速的方法吧! 小編經過努力,新項目終於過測試了,可是被蘋果大大給拒了,好苦啊,最近的審核真的是沒有誰了。這回被拒是因為項目中存在私有api,下圖為被拒信息。 這就坑了啊,這麼大一個項目,我如 ...
  • 本文微信公眾號「AndroidTraveler」首發。 背景 大多數應屆畢業生在大學期間使用的比較多的是 windows 電腦,因此初入職場如果拿到一臺蘋果電腦,可能一時間不能夠很快的上手。基於此,這邊出了系列視頻,通過實際的演示讓沒使用過蘋果電腦的小伙伴可以快速上手。 定位 適合以下小伙伴: 1. ...
  • CSS處理網頁時,它認為每個元素都包含在一個不可見的盒子里。• 為什麼要想象成盒子呢?因為如果把所有的元素都想象成盒子,那麼我們對網頁的佈局就相當於是擺放盒子。• 我們只需要將相應的盒子擺放到網頁中相應的位置即可完成網頁的佈局。 盒子模型 一個盒子我們會分成幾個部分:– 內容區(content)– ...
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form> <fieldset style="width:500px;"> <legend align="ce ...
  • &nbsp; 不斷行的空格 &ensp; 半方大的空格 &emsp; 全方大的空格 &lt; 小於 < &gt; 大於 > &amp; &符號 &quot; 雙引號" &copy; 版權符號© &reg; 已註冊商標® &trade; 商標(美國)TM &times; 乘號 × &divide; 除 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...