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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...