1. 程式人生 > >自己動手從頭做一個react路由

自己動手從頭做一個react路由

本案例用的是create-react-app腳手架生產的demo,在建立好後需要安裝history模組和prop-types模組。

npm install history --save
npm install prop-types

history主要是需要來製作前進後退相關的步驟,而prop-types則是基本的型別檢查。

安裝以上兩個模組後就開始製作react的路由。

首先,路由最主要的就是url,不管是react還是vue都是一樣,在我們點選某個連結的時候,瀏覽器並沒有重新載入頁面,而是改變了url,同時,無閃爍的展示我們需要的內容。

首先,宣告一個路由物件,來處理url相關的操作。

const Route = ({ path, component }, { location }) => {
  const pathname = location.pathname;
  if (pathname.match(path)) {
    return (
      React.createElement(component)
    );
  } else {
    return null;
  }
};

在上圖中,聲明瞭兩個物件,分別有三個引數,是路徑,元件,以及一個location,關鍵步驟就是獲取url,然後進行匹配,如果點選連結的url與獲得的url相匹配的話,就建立元件元素。

有了url的變化,還需要有一個link來跳轉,現在,建立一個Link物件,來完成到某個url的跳轉。

const Link=({to,children},{history})=>(
  <a onClick={(e)=>{
    e.preventDefault();
    history.push(to);
  }}
  href={to}
  >
    {children}
  </a>
)

在我們點選路由的時候發生了跳轉,可是,按照上面的來做,我們在改變了某個資料之後,點選路由,沒有實現實時更新,因此,需要有一個元件來完成監聽url是否發生變化,如果變化了,就進行re-render。

class Router extends React.Component{
  static childContextTypes = {
    history: PropTypes.object,
    location: PropTypes.object,
  };
  constructor(props){
    super(props);
    this.history=createHistory();
    this.history.listen(()=>this.forceUpdate());
  }
  getChildContext(){
    return{
      history:this.history,
      location:window.location
    }
  }
  render(){
    return this.props.children;
  }
}

首先在建構函式裡聲明瞭history和listen去監聽從而達到re-render的目的,在這裡,history和location都需要進行型別檢查來判斷他們是否正確,在使用靜態型別檢查時,getChildContext是必不可少的,需要來返回需要的值,否則react腳手架就會提示需要宣告getChildContext()函式。

在核心介紹完畢後,回到開始建立的兩個物件,分別是Route和Link。現在,我們就對他們來新增一個型別檢查。

Route.contextTypes={
  location:PropTypes.object
}
Link.contextTypes={
  history:PropTypes.object
}

接下來,我們可以宣告兩個物件,即我們需要顯示的內容。

const Atlantic = () => (
  <div>
    <h3>A</h3>
    <p>
      A樣例
    </p>
  </div>
);

const Pacific = () => (
  <div>
    <h3>P</h3>
    <p>
      P樣例
    </p>
  </div>
);

現在,我們將兩個物件放到我們建立的Router物件中(注意,不是第一個建立的Route物件)。

const App=()=>(
  <Router>
    <div
        className='ui text container'
      >
        <ul>
          <li>
            <Link to='/atlantic'>
              <code>/atlantic</code>
            </Link>
          </li>
          <li>
            <Link to='/pacific'>
              <code>/pacific</code>
            </Link>
          </li>
        </ul>

        <hr />

        <Route path='/atlantic' component={Atlantic} />
        <Route path='/pacific' component={Pacific} />

      </div>
  </Router>
)

在上圖中,我們用到了之前建立的所有物件,Router,Link,Route。將所有需要顯示的內容放到Router檢視當中,Link達到我們需要跳轉的目的,而Route就是我們需要顯示的相應的元件了。

結果如下:

相關推薦

自己動手從頭一個react路由

本案例用的是create-react-app腳手架生產的demo,在建立好後需要安裝history模組和prop-types模組。 npm install history --save npm install prop-types history主要是需要來製作前進後退

自己動手個數據庫訪問層(一)

       說資料庫是資訊系統裡最重要的部分,應當沒幾個人反對。最簡單的訪問資料庫的方式就是用程式直連資料庫,通過Sql進行操作,相信這也是每個程式設計師最初學的方法。但隨著程式規模的增大,再一條條語句去寫的話開發效率就有些低了,因此才有了很多框架去幫助我們操作資料庫

跟著alex學習了格式化輸出,最大的感受就是程式設計這個事,一定要自己動手,才能學會。看會和自己完全是兩碼事

學習了三天,現在學到格式化輸出。看視訊教程,alex和那個美女學員打情罵俏,真是羨慕啊。 教程看懂很容易,完全會了。 可是上手程式設計馬上歇菜。 就這麼幾行的程式碼,我遇到了n多錯誤 首先是中文輸入的錯誤,輸入括號,居然就報錯,仔細一看是中文的括號。 然後是單引號和雙引號的錯誤,這也屬於中文輸入法的

自己動手制作一個本地的yum倉庫

完成後 spawn 自己 mirrors 局域網 動手 本地 gen 2.0 制作本地yum源有兩種方式,第一種是使用光盤鏡像,然後在本地進行安裝。第二種是我們自己創建一個本地yum倉庫,然後使用file的形式來向本地提供yum repo(也可以使用http的方式向外部提供

零基礎案例,別再錯過了,動手Python一個電話本小程式!

最近比較忙,只能抽空的寫寫文章,其實我也是一個上班族,python完全是個人想學然後希望以後對工作有所幫助,2019年了,祝大家新年快樂。 我們就必須要懂得寫指令碼來提高下效率了。希望將來會達到那種程度咯,現在的話,先帶大家從基本開始學起吧。 模擬電話本小程式,從實際去學習:

僅僅是對自己滴知識一個總結

----API概念: API(Application Programming Interface)應用程式介面。 在java中的API就是JDK中提供的各種功能。如CreateWindow就是一個API函式,在應用程式中如果要呼叫這個函式那麼作業系統就會按該函式提供的引數資

自己動手模擬開發一個簡單的Web伺服器

開篇:每當我們將開發好的ASP.NET網站部署到IIS伺服器中,在瀏覽器正常瀏覽頁面時,可曾想過Web伺服器是怎麼工作的,其原理是什麼?“紙上得來終覺淺,絕知此事要躬行”,於是我們自己模擬一個簡單的Web伺服器來體會一下。 一、請求-處理-響應模型 1.1 基本過程介紹 每一個HTTP請求都會經

我的一個react路由之旅(步驟及詳圖)

今天開始react一個重要部分的xiao~習,路由~(過程截圖,最後附程式碼) 以下程式碼只能騙糊塗蛋子,沒錯,就是我自己,不要打算讓我敲出多高階的東西~ 理論性知識幾乎沒有,請不要打算讓我給你說原理啥的,原理性的東西,網上很多,我現在搬磚學習很開心,勿忘初心~ (1)首先,你確定你安裝了react環境,這第

我的一個React路由巢狀(多級路由),路由傳參之旅

在上一篇react路由之旅中,我們簡單地配置了react,進行了react路由及相關知識的學習,引入以及實現一個區域性跳轉的功能,接下來就是深入學習路由的巢狀以及傳參,這是工作中主要用要的。 我的react已經配置了redux(見我的redux之旅),所以這是在引入的外掛裡做的演示。 從App元件跳轉到New

[js高手之路]html5 canvas動畫教程 - 自己動手一個類似windows的畫圖軟件

箭頭 erb 寬度 pow(x type row center shape htm 這個繪圖工具,我還沒有做完,不過已經實現了總架構,以及常見的簡易圖形繪制功能: 1,可以繪制直線,圓,矩形,正多邊形【已完成】 2,填充顏色和描邊顏色的選擇【已完成】 3,描邊和填充功

html5 canvas動畫教程 - 自己動手一個類似windows的畫圖軟件

.cn pic 箭頭 uid .com 教程 amp 設置 一個 制直線,圓,矩形,正多邊形【已完成】 2,填充顏色和描邊顏色的選擇【已完成】 3,描邊和填充功能的選擇【已完成】 後續版本: 橡皮擦,坐標系,線形設置,箭頭,其他流程圖形,裁剪與調整圖形。。。。。 終極目標:

手摸手教你自己動手實現一個前端路由

前言 用過現代前端框架的同學,對前端路由一定不陌生, vue, react, angular 都有自己的 router, 那麼你對 router 的工作原理了解嗎? 如果還不瞭解, 那麼請跟我一起來手寫一個簡單的前端路由, 順便了解一下. 實現路由的2種方式 hash模式

自己動手實現一個前端路由

單頁面應用利用了JavaScript動態變換網頁內容,避免了頁面過載,提供了流暢的使用者體驗;路由則提供了瀏覽器地址變化,網頁內容也跟隨變化,兩者結合起來則為我們提供了體驗良好的單頁面web應用 前端路由實現方式 前端路由需要實現三個功能:①瀏覽器地址變化,切換頁面;②點選瀏覽器【後退】、【前進

(24/24) webpack小案例--自己動手用webpack構建一個React的開發環境

通過前面的學習,對webpack有了更深的認識,故此節我們就利用前面相關知識自己動手用webpack構建一個React的開發環境,就算是一個小案例吧。 注:此處使用的開發工具是Webstorm。 1.安裝webpack 1.1 新建資料夾 在安裝webpack之前,我們先建立一個資料夾,並利用開發工具

自己動手一個自動登錄腳本gg

簡單 只需要 自己 不同 enum -s class rep 使用 1.下載一個sshpass工具 2.安裝sshpass,安裝到tools文件夾 3.把tools文件夾的路徑加入到/etc/bashrc vim /etc/bashrc

自己動手編寫一個網絡圖片爬蟲

網絡 浪費 原理 get 應用 crawl 方法 網絡圖 理解 如今基本上我們的大部分時間都是浪費在瀏覽網頁上的,網頁有許多的媒體資源,其中最常見的是圖片。當我們瀏覽到比較好的網站的時候,看到比較好看的圖片總是會忍不住要下載。通常來說我們都是右鍵單擊圖標選擇圖片另存為,選擇

自己動手聊天機器人 一-涉及知識【轉】

war 價值 開源系統 dbv tps target 都是 height www 轉自:http://www.shareditor.com/blogshow/?blogId=63 人工智能一直以來是人類的夢想,造一臺可以為你做一切事情並且有情感的機器人,像哆啦A夢一樣,現

北半球 自己動手聊天機器人

機器人 get edit .com 動手 targe https http 機器 轉自:https://www.beibq.cn/book/n2uy1/810 SharEDITor :http://www.shareditor.com/北半球 自己動手做聊天機器人

自己動手實現一個簡單的JSON解析器

pair bool 優點 輕量 結束 pan isdigit 復雜 false 1. 背景 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。相對於另一種數據交換格式 XML,JSON 有著諸多優點。比如易讀性更好,占用空間更少等

企業為什麽要一個屬於自己的營銷網站?

itl 方式 營銷推廣 理由 沒有 適用於 才會 欲望 項目 做網站優化是不區分行業的,也就是說SEO適用於所有行業。有人認為隔行如隔山,這句話沒錯,但吖七認為,SEO不只是一種技術而應該是一種思維,換句話講做SEO是做營銷,而營銷思維主導著一家企業的生死。服務行業seo策