亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

手挽手帶你學React之React-router4.x的使用

2019-11-19 12:08:44
字體:
來源:轉載
供稿:網友

手挽手帶你學React入門三檔,帶你學會使用Reacr-router4.x,開始創建屬于你的React項目

什么是React-router

React Router 是一個基于 React 之上的強大路由庫,它可以讓你向應用中快速地添加視圖和數據流,同時保持頁面與 URL 間的同步。通俗一點就是,它幫助我們的程序在不同的url展示不同的內容。

為什么要用React-router

我們開發的時候,不可能所有的東西都展示在一張頁面上,在業務場景的要求下,我們要根據不同的URL或者不同的哈希來展示不同的組件,這個我們可以稱它為路由。在我們不使用React-router的時候,我們如何去做路由呢?

我在這里給大家舉個例子,不使用React-router,來實現一個簡單路由。

  // App.jsimport React,{Component} from 'react'export default class App extends Component {  constructor(){    super()  // 我們在App.js內部來渲染不同的組件 我們這里采用哈希路由的方式,鑒于React的渲染機制,我們需要把值綁定進入state內部。    this.state={      route:window.location.hash.substr(1)    }  }  componentDidMount() {    // 這里我們通過監聽的方式來監聽哈希的變化,并且來更新state促進視圖更新    window.addEventListener('hashchange', () => {      console.log(window.location.hash.substr(1))     this.setState({      route: window.location.hash.substr(1)     })    })   }  render() {    //在這里我們定義一個RouterView 所有的變化后的組件都會丟到這個RouterView中    let RouterView = App    switch (this.state.route) {      case '/children1':      RouterView = Children        break;      case '/children2':      RouterView = ChildrenTwo        break;      default:      RouterView = Home        break;    }    return (      <div>          <h1>App</h1>        <ul>          <li><a href="#/children1" rel="external nofollow" >children1</a></li>           {/* 點擊更改哈希值 這里觸發我們的監聽 然后修改state來觸發組件的重新傳染 */}          <li><a href="#/children2" rel="external nofollow" >children2</a></li>        </ul>        <RouterView/>      </div>    )  }}// 為了展示效果定義子組件一class Children extends Component{  constructor(){    super()    this.state={          }  }  render(){    return(      <div>        <h1>我是子組件1</h1>              </div>    )  }}// 為了展示效果定義子組件二class ChildrenTwo extends Component{  constructor(){    super()    this.state={        }  }  render(){    return(      <div>        <h1>我是子組件2</h1>      </div>    )  }}// 為了展示效果定義Home組件class Home extends Component{  constructor(){    super()  }  render(){    return(      <h1>我是Home</h1>    )  }}

這樣我們通過監聽哈希變化的方式實現了我們的第一個簡單路由,是不是對于路由的原理有了那么一丟丟的認識呢?接下來我們想象一個場景,這么一個路由出現了/children1/user/about/1,看到這里是不是覺得,用switch case已經蒙B了?我們接下來就要使用到React-router了,這個東西可不需要我們自己去寫一大串的switch case了,并且性能啊,整潔度啊等等等方面都比我們自己寫的好多了!

React-router 初體驗

首先我們在React項目文件目錄下執行

npm install react-router-dom --savenpm install react-router --save

要想體驗一個新的東西,當然是要拿自己開刀 我們改進上面我們寫過的組件

// App.jsimport React,{Component} from 'react'// 首先我們需要導入一些組件...import { HashRouter as Router, Route, Link } from "react-router-dom";// 這里有BrowserRouter 和 HashRouter 兩種模式 我比較推薦HashRouter來學習 BrowserRouter需要后端配合 單獨前端設置 刷新會出現404// 然后我們把App組件整理干凈,大概成這個樣子export default class App extends Component {  constructor(){    super()    this.state={         }  }  render() {    return (      <Router>        <div>        <h1>App</h1>        <ul>          <li> <Link to="/">Home</Link></li>           <li><Link to="/children1/">children1</Link></li>          <li><Link to="/children2/">children2</Link></li>        </ul>        <Route exact path="/" component={Home} />        <Route path="/children1" component={Children} />        <Route path="/children2" component={ChildrenTwo} />        </div>      </Router>    )  }}// 為了展示效果定義子組件一class Children extends Component{  constructor(){    super()    this.state={          }  }  render(){    return(      <div>        <h1>我是子組件1</h1>      </div>    )  }}// 為了展示效果定義子組件二class ChildrenTwo extends Component{  constructor(){    super()    this.state={        }  }  render(){    return(      <div>        <h1>我是子組件2</h1>      </div>    )  }}// 為了展示效果定義Home組件class Home extends Component{  constructor(){    super()  }  render(){    return(      <h1>我是Home</h1>    )  }}

這里我們就完成了React-router4.X的初步體驗,怎么樣~我給大家的第一次的感覺還可以吧~

基本組件

Routers

在React-router4.0中,Routers有兩個表現方式 <BrowserRouter> <HashRouter> 這兩個標簽都將會給你創建一個專門的history對象,BrowserRouter的表現模式需要搭配一個可以響應請求的服務器。HashRouter是靜態文件服務器,我們本地開發的時候,建議使用HashRouter。這里需要注意一下,BrowserRouter和 HashRouter標簽下面,只允許存在一個標簽 具體寫法如下

<BrowserRouter>  <div>    {/*其余內容寫在這里面*/}  </div></BrowserRouter><HashRouter>  <div>    {/*其余內容寫在這里面*/}  </div></HashRouter>

Route

注意,最外層的是Router 這里是 Route 這是我們的路由匹配組件,它有兩個 Route和Switch

Route 組件擁有多個屬性,這在我們后期的路由傳參中將會用到。這里我們需要簡單了解幾個屬性 path component exact strict

path 是我們匹配的地址,當地址匹配的時候 我們才會去渲染 component內的組件內容

path 后面如果書寫模式帶了 /: 這樣的內容,那么這里將會成為占位符 我們可以利用占位符來取到對應路徑的參數 使用 this.props.match.params+占位符的名字 即可拿到

exact 屬性來規定我們是否嚴格匹配

strict 則是嚴格匹配模式 我們規定的路徑使用/one/來書寫 如果沒有完全匹配 /one/ 則不會展示

<Route exact path="/one" component={App} />// 這里我們加了exact 那么 路徑完全等于/one的時候才會渲染App /one/ one /one/two 后面這三種情況均不會渲染App// 相反 如果我們沒有加 exact 的時候 /one /one/two App都會被渲染<Route strict path="/one/" component={App} />// 我們加了 strict 以后 /one 將不會渲染App 而如果沒有 strict 這種情況下 /one 是可以渲染App的

同時React-router給我們提供了一個Switch標簽 在這個標簽內 我們只會渲染一個Route 并且使第一個符合條件的Route 這是什么意思呢?我們來看代碼

<Route path="/about" component={About} /><Route path="/:User" component={User} /><Route path="/" component={Home} /><Route component={NoMatch} />

在這樣的路由下 我們匹配/about 會發現 所有的路由都可以匹配到并且渲染了出來,這肯定不是我們想要的結果 于是我們給它嵌套一個 Switch

<Switch>  <Route path="/about" component={About} />  <Route path="/:User" component={User} />  <Route path="/" component={Home} />  <Route component={NoMatch} /></Switch>

這時候我們就只會匹配到第一個/about,僅僅渲染About,大家根據實際需求去決定是否嵌套Switch使用

Link和NavLink

Link 主要api是to,to可以接受string或者一個object,來控制url。我們代碼里看看書寫方法

  <Link to='/one/' />   // 這就是路由到one 搭配Router使用 當然我們可以使用一個對象  <Link to={{    pathname:'/one',    search:'?name=qm',    hash:'#two',    state:{      myName:'qimiao'    }  }} />  // 這樣我們點擊link不僅可以到one 還可以傳遞一些參數

NavLink 它可以為當前選中的路由設置類名、樣式以及回調函數等。使用如下

  <NavLink exact activeClassName='navLink' to='/one/' />   // 這就是路由到one 搭配Router使用 當然我們可以使用一個對象  <NavLink exact activeClassName='navLink' to={{    pathname:'/one',    search:'?name=qm',    hash:'#two',    state:{      myName:'qimiao'    }  }} />  // 這里的exact 同樣是嚴格比配模式 同Route  // 這樣我們可以為當前選中的路由設置樣式了

子路由的書寫

在react-router4之前的版本,子路由通過路由嵌套就可以實現了,但是這一個方法到了React-router4中就行不通了

先來一個之前的寫法,當然也是錯誤示例

export default class App extends Component {  constructor(){    super()    this.state={         }  }  render() {    return (      <Router>        <div>        <h1>App</h1>        <ul>          <li> <Link to="/home">Home</Link></li>           <li><Link to="/children1/">children1</Link></li>          <li><Link to="/children2/">children2</Link></li>        </ul>        <Route path="/home" component={Home} >          <Route path="children1" component={Children} />          <Route path="children2" component={ChildrenTwo} />          {/*在4.0以后的版本這樣都會報錯 那么我們應該怎么寫呢*/}        </Route>              </div>      </Router>    )  }}

在react-router4.x版本中 我們子路由必須要在子組件內部了

export default class App extends Component {  constructor(){    super()    this.state={         }  }  render() {    return (      <Router>        <div>        <h1>App</h1>        <ul>          <li> <Link to="/home">Home</Link></li>           {/* 同樣 這兩個link讓他們轉移到Home中 我們的home組件就變成了下面的樣子 */}        </ul>        <Route path="/home" component={Home} >         {/*<Route path="children1" component={Children} />*/}          {/*<Route path="children2" component={ChildrenTwo} />*/}           {/*先把這里注釋掉 然后我們來到Home組件內*/}        </Route>              </div>      </Router>    )  }}// home內部用{this.props.match.url+子路由路徑}來獲取當前的路徑并且加上我們要路由到的位置來進行路由匹配和路徑跳轉匹配 這樣書寫 Children和ChildrenTwo就是home的子路由了class Home extends Component{  constructor(){    super()  }    render(){    return(      <div>      <h1>我是Home</h1>      <li><Link to={`${this.props.match.url}/children1`}>children1</Link></li>      <li><Link to={`${this.props.match.url}/children2`}>children2</Link></li>      <Route path={`${this.props.match.url}/children1`} component={Children} />      <Route path={`${this.props.match.url}/children2`} component={ChildrenTwo} />         </div>    )  }}

路由跳轉

聲明式跳轉上面已經說過了 Link和NavLink 兩個標簽就可以滿足了 我們主要說一下js跳轉

在4.0剛剛發布的時候 this.props.history.push('路徑')這個方法已經行不通了,不過值得慶幸的是,我現在所使用的4.3.1版本又可以使用這個方法來進行js路由跳轉了。

我們用home組件來舉個例子

class Home extends Component{  constructor(){    super()  }  toPath=(home)=>{    console.log(123)    this.props.history.push({ //我們把要傳參的東西都放在push對象內了      pathname:home,  //我們要到達哪個路由      search:"?a=1",  //明文傳參的模式      query:{'type':'type'}, //query對象傳參      state:{     //state對象傳參        b:456      }    })  // this.props.history.push('/123')  }  render(){    return(      <div>      <h1 onClick={()=>{this.toPath(`${this.props.match.url}/children1/123`)}}>我是Home</h1>      <li><Link to={`${this.props.match.url}/children1`}>children1</Link></li>      <li><Link to={`${this.props.match.url}/children2`}>children2</Link></li>      <Route path={`${this.props.match.url}/children1/:id`} component={Children} />      <Route path={`${this.props.match.url}/children2`} component={ChildrenTwo} />         </div>    )  }}/*相應的 我們在Children 組件里面有對應的方法來獲取參數。*/class Children extends Component{  constructor(){    super()    this.state={          }  }  render(){    console.log(this.props.match.params.id) //這種是通過路徑上面的:id傳過來的參數    console.log(this.props.location.query) //這是通過push的參數對象中的query傳過來的 和vue的query有區別 它不在地址欄 刷新丟失    console.log(this.props.location.state) //這是通過push的參數對象中的state傳過來的 它不在地址欄 刷新丟失    console.log(this.props.location.search) //暴露在地址欄,需要自行處理獲取數據    return(      <div>        <h1>我是子組件1 </h1>      </div>    )  }}

總結

這一期我們主要還是講了react-router4.x的基礎使用和傳參方法,react-router4.x坑比較多,不過使用熟練了會讓你感覺很爽,大家不要吝嗇自己的時間多多學習。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
zzjj国产精品一区二区| 欧美巨乳在线观看| 欧美www视频在线观看| 欧美乱妇40p| 欧美另类第一页| 久久综合伊人77777蜜臀| 欧美中文字幕在线播放| 国产欧美日韩中文字幕| 国产精品www| 国产亚洲在线播放| 欧美性生交xxxxxdddd| 亚洲男人第一av网站| 成人久久久久爱| 欧美国产亚洲精品久久久8v| 欧美与黑人午夜性猛交久久久| 欧美激情精品久久久久久大尺度| 一区二区三区 在线观看视| 久热精品视频在线观看| 国产精品久久久久久久久久新婚| 国产精品免费视频xxxx| 亚洲精品久久久久中文字幕二区| 亚洲最大的免费| 一区二区亚洲精品国产| 亚洲va久久久噜噜噜久久天堂| 国产成人精品在线| 亚洲男人天堂网站| 亚洲大胆美女视频| 永久免费毛片在线播放不卡| 国产日韩av在线播放| 激情懂色av一区av二区av| 国产精品十八以下禁看| 国产精品激情av在线播放| 亚洲一区二区三区乱码aⅴ| 久热精品视频在线观看| 国产日产久久高清欧美一区| 久久久久久久久久久久久久久久久久av| 91精品国产高清自在线| 欧美日韩不卡合集视频| 亚洲欧美综合v| 日本19禁啪啪免费观看www| 最近2019年中文视频免费在线观看| 欧美最猛性xxxxx免费| 欧美xxxx14xxxxx性爽| 欧美最猛性xxxxx(亚洲精品)| 另类美女黄大片| 亚洲一区二区三区在线视频| 91久久在线观看| 国产日韩在线看片| 欧美性极品xxxx娇小| 亚洲国产精品va在线观看黑人| www.久久撸.com| 97久久国产精品| 中文字幕欧美日韩| 日韩精品中文字幕有码专区| 国产精品美女久久久久av超清| 欧美午夜性色大片在线观看| 日韩精品高清在线| 97在线观看免费高清| 日韩精品极品视频| zzjj国产精品一区二区| 91久久精品日日躁夜夜躁国产| 九九精品在线观看| 日本在线观看天堂男亚洲| 久久亚洲私人国产精品va| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩高清免费观看| 亚洲国产成人在线视频| 中文字幕在线观看日韩| 国产97在线|日韩| 欧美一区深夜视频| 91免费人成网站在线观看18| 韩国精品美女www爽爽爽视频| 热久久免费视频精品| 亚洲欧美综合另类中字| 国产精品美女久久久久久免费| 亚洲在线第一页| 一区二区福利视频| 自拍偷拍免费精品| 国产午夜精品视频免费不卡69堂| 亚洲丁香婷深爱综合| 中文字幕av一区二区三区谷原希美| 日韩av电影在线播放| 亚洲男人天堂2024| 91网站在线看| 亚洲成色777777女色窝| 日韩欧美精品网站| 国产精品久久久久久中文字| 91精品久久久久久久久不口人| 国产日韩欧美成人| 国产精品自产拍高潮在线观看| 久久久久国产精品一区| 97视频在线观看免费高清完整版在线观看| 亚洲一区二区三区四区在线播放| 国语自产偷拍精品视频偷| 久久夜色精品国产| 69久久夜色精品国产69乱青草| 亚洲第一福利视频| 狠狠久久亚洲欧美专区| 久久成年人视频| 亚洲第五色综合网| 欧美精品九九久久| 色香阁99久久精品久久久| 国产成人精品一区| 国产精品综合不卡av| 久久精品国产69国产精品亚洲| 一区二区三区无码高清视频| 欧美性猛交丰臀xxxxx网站| 久久香蕉精品香蕉| 成人综合网网址| 中文字幕在线国产精品| 亚洲第一区在线观看| 久久99青青精品免费观看| 亚洲xxxx妇黄裸体| 日韩av一区在线观看| 成人免费观看网址| 一本大道香蕉久在线播放29| 成人免费视频网| 国产丝袜精品视频| 亚洲欧洲一区二区三区久久| 不卡伊人av在线播放| 久久91亚洲精品中文字幕奶水| 国产色综合天天综合网| 国产成人综合精品在线| 激情亚洲一区二区三区四区| 亚洲成人av在线播放| 国产精品色午夜在线观看| 欧美激情a∨在线视频播放| 亚洲精品久久久久久久久久久久久| 久久久久久久久91| 亚洲视频在线观看视频| 国产精品99久久久久久人| 一个人看的www久久| 亚洲欧美综合精品久久成人| 中文亚洲视频在线| 亚洲亚裔videos黑人hd| 亚洲美女av黄| 国产精品视频永久免费播放| 久久精品成人欧美大片古装| 亚洲人精选亚洲人成在线| 欧美电影第一页| 中文字幕av一区| 亚洲国产精品成人一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 日韩中文字幕在线视频播放| 欧美精品videofree1080p| 国产精品视频网址| 日韩小视频网址| 精品久久久国产精品999| 色播久久人人爽人人爽人人片视av| 国产精品亚发布| 日本韩国欧美精品大片卡二| 亚洲人成电影网站色xx| 久久青草福利网站| 奇米成人av国产一区二区三区| 亚洲欧美制服另类日韩| 午夜精品久久久久久久99热浪潮| 欧美肥老太性生活视频| 亚洲欧美日韩中文在线| 精品国产一区二区在线| 亚洲电影成人av99爱色| 欧美一区在线直播| 成人亚洲综合色就1024| 日韩精品免费在线观看| 亚洲福利视频久久|