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

首頁 > 開發 > JS > 正文

React Router v4 入坑指南(小結)

2024-05-06 16:43:38
字體:
來源:轉載
供稿:網友

距離React Router v4 正式發布也已經過去三個月了,這周把一個React的架子做了升級,之前的路由用的還是v2.7.0版的,所以決定把路由也升級下,正好“嘗嘗鮮”...

江湖傳言,目前官方同時維護 2.x 和 4.x 兩個版本。(ヾ(??﹏?)??咦,此刻相信機智如我的你也會發現,ReactRouter v3 去哪兒了?整丟了??巴拉出鍋了???敢不敢給我個完美的解釋?。浚┦聦嵣?3.x 版本相比于 2.x 并沒有引入任何新的特性,只是將 2.x 版本中部分廢棄 API 的 warning 移除掉而已。按照規劃,沒有歷史包袱的新項目想要使用穩定版的 ReactRouter 時,應該使用 ReactRouter 3.x。目前 3.x 版本也還處于 beta 階段,不過會先于 4.x 版本正式發布。如果你已經在使用 2.x 的版本,那么升級 3.x 將不會有任何額外的代碼變動。

禮貌性簡介下

React,Router,v4

React Router V4 相較于前面三個版本有根本性變化,首先是遵循 Just Component 的 API 設計理念,其次API方面也精簡了不少,對新手來說降低了學習難度,但如果是對之前項目的重構,嗯,簡直無**可說。本次升級的主要特點如下:

  • 聲明式(Declarative)
  • 可組合 (Composability)

React Router V4 遵循了 React 的理念: 萬物皆組件 。因此 升級之后的 Route、Link、Switch等都是一個普通的組件。

React Router V4 基于 Lerna 管理多個 Repository。在此代碼庫包括:

  1. react-router React Router 核心
  2. react-router-dom 用于 DOM 綁定的 React Router
  3. react-router-native 用于 React Native 的 React Router
  4. react-router-redux React Router 和 Redux 的集成
  5. react-router-config 靜態路由配置幫助助手

插件初引入

通常我們在 React 的使用中,一般要引入兩個包, react 和  react-dom ,那么 react-routerreact-router-dom 是不是兩個都要引用呢? 注意,前方高能,入門第一坑就在這里 。他們兩個只要引用一個就行了,不同之處就是后者比前者多出了 <Link> <BrowserRouter> 這樣的 DOM 類組件。因此我們只需引用 react-router-dom 這個包就OK了。當然,如果搭配 redux ,你還需要使用 react-router-redux 。

主要組件簡介

在4.0之前版本的 API 中, <Router> 組件的 children 只能是 React Router 提供的各種組件,如 <Route>、<IndexRoute>、<Redirect> 等。而在 React Router 4 中,你可以將各種組件及標簽放進 <Router> 組件中,他的角色也更像是 Redux 中的 <Provider> 。**不同的是 <Provider> 是用來保持與 store 的更新,而 <Router> 是用來保持與 location 的同步。**示例如下:

// 示例1<Router> <div>  <ul>  <li><Link to="/">首頁</Link></li>  <li><Link to="/about">關于</Link></li>  <li><Link to="/topics">主題列表</Link></li>  </ul>  <hr/>  <Route exact path="/" component={Home}/>  <Route path="/about" component={About}/>  <Route path="/topics" component={Topics}/> </div> </Router>

Router是所有路由組件共用的底層接口,一般我們的應用并不會使用這個接口,而是使用高級的路由:

  1. <BrowserRouter> :使用 HTML5 提供的 history API 來保持 UI 和 URL 的同步;
  2. <HashRouter> :使用 URL 的 hash (例如:window.location.hash) 來保持 UI 和 URL 的同步;
  3. <MemoryRouter> :能在內存保存你 “URL” 的歷史紀錄(并沒有對地址欄讀寫);
  4. <NativeRouter> :為使用React Native提供路由支持;
  5. <StaticRouter> :從不會改變地址;

TIPS:算是第二坑吧,和之前的Router不一樣,這里 <Router> 組件下只允許存在一個子元素,如存在多個則會報錯。

反面典型在這里:

<Router>  <ul>  <li><Link to="/">首頁</Link></li>  <li><Link to="/about">關于</Link></li>  <li><Link to="/topics">主題列表</Link></li>  </ul>  <hr/>  <Route exact path="/" component={Home}/>  <Route path="/about" component={About}/>  <Route path="/topics" component={Topics}/> </Router>

沒錯,示例2在沒有 <div> 爸爸的保護下,會報如下異常信息:

 

 
React,Router,v4

 

我們知道,Route組件主要的作用就是當一個location匹配路由的path時,渲染某些UI。示例如下:

<Router> <div> <Route exact path="/" component={Home}/> <Route path="/news" component={NewsFeed}/> </div></Router>// 如果應用的地址是/,那么相應的UI會類似這個樣子:<div> <Home/></div>// 如果應用的地址是/news,那么相應的UI就會成為這個樣子:<div> <NewsFeed/></div>

<Route> 組件有如下屬性:

  1. path(string): 路由匹配路徑。(沒有path屬性的Route 總是會 匹配);
  2. exact(bool):為true時,則要求路徑與location.pathname必須完全匹配;
  3. strict(bool):true的時候,有結尾斜線的路徑只能匹配有斜線的location.pathname;

再次奉上兩個鮮活的例子:

exact配置:

 

 

路徑 location.pathname exact 是否匹配
/one /one/two true
/one /one/two false

 

 strict配置:

 

路徑 location.pathname strict 是否匹配
/one/ /one true
/one/ /one/ true
/one/ /one/two true

 

同時,新版的路由為 <Route> 提供了三種渲染內容的方法:

  1. <Route component> :在地址匹配的時候React的組件才會被渲染,route props也會隨著一起被渲染;
  2. <Route render> :這種方式對于內聯渲染和包裝組件卻不引起意料之外的重新掛載特別方便;
  3. <Route children> :與render屬性的工作方式基本一樣,除了它是不管地址匹配與否都會被調用;

第一種方式沒啥可說的,和之前一樣,這里我們重點看下 <Route render> 的渲染方式:

// 行內渲染示例<Route path="/home" render={() => <div>Home</div>}/>// 包裝/合成const FadingRoute = ({ component: Component, ...rest }) => ( <Route {...rest} render={props => ( <FadeIn>  <Component {...props}/> </FadeIn> )}/>)<FadingRoute path="/cool" component={Something}/>

TIPS: 第三坑! <Route component> 的優先級要比 <Route render> 高,所以不要在同一個 <Route> 中同時使用這兩個屬性。

和之前版本沒太大區別,重點看下組件屬性:

  1. to(string/object):要跳轉的路徑或地址;
  2. replace(bool): 為 true 時 ,點擊鏈接后將使用新地址替換掉訪問歷史記錄里面的原地址; 為 false 時 ,點擊鏈接后將在原有訪問歷史記錄的基礎上添加一個新的紀錄。 默認為 false ;

示例如下:

// Link組件示例// to為string<Link to="/about">關于</Link>// to為obj<Link to={{ pathname: '/courses', search: '?sort=name', hash: '#the-hash', state: { fromDashboard: true }}}/>// replace <Link to="/courses" replace />

<NavLink><Link> 的一個特定版本, 會在匹配上當前 URL 的時候會給已經渲染的元素添加樣式參數,組件屬性:

  1. activeClassName(string):設置選中樣式,默認值為 active;
  2. activeStyle(object):當元素被選中時, 為此元素添加樣式;
  3. exact(bool):為 true 時, 只有當地址完全匹配 class 和 style 才會應用;
  4. strict(bool):為 true 時,在確定位置是否與當前 URL 匹配時,將考慮位置 pathname 后的斜線; isActive(func):判斷鏈接是否激活的額外邏輯的功能;

從這里我們也可以看出,新版本的路由在組件化上面確實下了不少功夫,來看看NavLink的使用示例:

// activeClassName選中時樣式為selected<NavLink to="/faq" activeClassName="selected">FAQs</NavLink>// 選中時樣式為activeStyle的樣式設置<NavLink to="/faq" activeStyle={{ fontWeight: 'bold', color: 'red' }}>FAQs</NavLink>// 當event id為奇數的時候,激活鏈接const oddEvent = (match, location) => { if (!match) { return false } const eventID = parseInt(match.params.eventID) return !isNaN(eventID) && eventID % 2 === 1}<NavLink to="/events/123" isActive={oddEvent}>Event 123</NavLink>

該組件用來渲染匹配地址的第一個 <Route> 或者 <Redirect> 。那么它與使用一堆route又有什么區別呢?

<Switch> 的獨特之處是獨它僅僅渲染一個路由。相反地,每一個包含匹配地址(location)的 <Route> 都會被渲染。思考下面的代碼:

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

如果現在的URL是 /about ,那么 <About> , <User> , 還有 <NoMatch> 都會被渲染,因為它們都與路徑(path)匹配。這種設計,允許我們以多種方式將多個 <Route> 組合到我們的應用程序中,例如側欄(sidebars),面包屑(breadcrumbs),bootstrap tabs等等。 然而,偶爾我們只想選擇一個 <Route> 來渲染。如果我們現在處于 /about ,我們也不希望匹配 /:user (或者顯示我們的 “404” 頁面 )。以下是使用 Switch 的方法來實現:

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

現在,如果我們處于 /about , <Switch> 將開始尋找匹配的 <Route> 。 <Route path="/about"/> 將被匹配, <Switch> 將停止尋找匹配并渲染 <About> 。同樣,如果我們處于 /michael<User> 將被渲染。

以上就是我對React Router v4 的初試,反正也是一邊查文檔,一邊試水的,如有錯誤或疏漏,還請大家諒解并不吝指正!也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91香蕉电影院| 国产亚洲福利一区| 国产欧美精品一区二区三区-老狼| 69av成年福利视频| 欧美日韩高清在线观看| 亚洲一区二区少妇| 日韩欧美国产中文字幕| 亚洲三级 欧美三级| 日日骚久久av| 亚洲精品少妇网址| 色老头一区二区三区在线观看| 亚洲成人av资源网| 亚洲欧洲一区二区三区久久| 国产精品高清免费在线观看| 亚洲电影av在线| 久久国产加勒比精品无码| 国产精品入口夜色视频大尺度| 久久久久久久久久婷婷| 日韩高清电影免费观看完整版| 亚洲福利在线视频| 国产精品久久久久久久久久久新郎| www.久久久久| 精品久久香蕉国产线看观看gif| 欧美自拍视频在线| 欧美日韩亚洲成人| 国产+成+人+亚洲欧洲| 97avcom| 成人a在线视频| 国产主播喷水一区二区| 国产在线视频一区| 国产伦精品免费视频| 欧美在线视频一区| 日韩国产在线播放| 亚洲精品国产精品久久清纯直播| 国产成人在线一区| www.久久久久久.com| 国产精品 欧美在线| 久久人人爽人人爽人人片av高请| 欧美激情va永久在线播放| 午夜美女久久久久爽久久| 久久99精品国产99久久6尤物| 欧美一级淫片videoshd| 日韩女优人人人人射在线视频| 91精品国产自产91精品| 亚洲国产精品久久精品怡红院| 欧美激情小视频| 亚洲视频电影图片偷拍一区| 青青草原成人在线视频| 色妞色视频一区二区三区四区| 亚洲成人三级在线| 久久乐国产精品| 97在线观看免费| 伊人伊人伊人久久| 91网在线免费观看| 久久久av一区| 国产欧美日韩亚洲精品| 96国产粉嫩美女| 亚洲第一天堂无码专区| 欧美一级bbbbb性bbbb喷潮片| 亚洲a在线播放| 国产香蕉97碰碰久久人人| 91亚洲精品久久久| 久久久国产精品x99av| 欧美夫妻性生活视频| 国产精品久久久久一区二区| 国产精品久久久久久久久久三级| 亚洲欧美日韩久久久久久| 久久免费成人精品视频| 欧美午夜激情在线| 亚洲精品v欧美精品v日韩精品| 日韩大片免费观看视频播放| 亚洲精品美女在线观看播放| 国产拍精品一二三| 91亚洲精品久久久久久久久久久久| 日韩在线视频播放| 在线电影av不卡网址| 疯狂做受xxxx高潮欧美日本| 日本韩国欧美精品大片卡二| 国内精久久久久久久久久人| 国产69精品久久久久99| 亚洲国产欧美精品| 亚洲精品美女视频| 91久久久久久久久久久久久| 国产精品欧美激情在线播放| 久久中国妇女中文字幕| 亚洲欧美日韩精品| 伊人男人综合视频网| 日韩精品在线观看视频| 欧美国产亚洲视频| 日韩免费观看高清| 亚洲人成人99网站| 国产精品视频网址| 国产精品成人av性教育| 欧美一级免费看| 久久久久久综合网天天| 久久精品视频播放| 欧美大尺度电影在线观看| 欧美在线观看网站| 亚洲欧美三级伦理| 久久精品成人欧美大片古装| 在线电影欧美日韩一区二区私密| 色播久久人人爽人人爽人人片视av| 亚洲欧美国产日韩天堂区| 亚洲性猛交xxxxwww| 国内久久久精品| 中文综合在线观看| 九九热这里只有精品免费看| 欧美一乱一性一交一视频| 欧美老少做受xxxx高潮| 81精品国产乱码久久久久久| 在线播放精品一区二区三区| 国产精品亚洲自拍| 77777少妇光屁股久久一区| 一本一道久久a久久精品逆3p| 国产日韩欧美影视| 亚洲一区二区三区视频| 91久久在线播放| 成人激情黄色网| 亚洲一区二区三区在线视频| 中国日韩欧美久久久久久久久| 91久久久在线| 欧美成人久久久| 久久韩剧网电视剧| 亚洲毛茸茸少妇高潮呻吟| 国产香蕉97碰碰久久人人| 国产精品视频yy9099| 日韩久久精品电影| 久久久久久12| 欧美最近摘花xxxx摘花| 丰满岳妇乱一区二区三区| 亚洲成av人乱码色午夜| 92国产精品视频| 亚洲女人天堂色在线7777| 欧美大肥婆大肥bbbbb| 亚洲免费视频一区二区| 亚洲国内高清视频| 亚洲在线一区二区| 精品久久香蕉国产线看观看亚洲| 国产狼人综合免费视频| 91精品国产高清| 国产精品久久久久久久7电影| 激情成人中文字幕| 久久久91精品国产| 欧美激情精品久久久久久蜜臀| 亚洲综合色激情五月| 久久久久久久国产精品| 欧美成人性色生活仑片| 日韩久久精品成人| 欧美视频一区二区三区…| 亚洲欧美国产日韩中文字幕| 96sao精品视频在线观看| 国产日产亚洲精品| 成人av资源在线播放| 色偷偷偷综合中文字幕;dd| 亚洲人成网7777777国产| 亚洲国产精久久久久久| 日韩精品中文在线观看| 国产精品视频免费在线观看| 亚洲精品美女在线观看| 亚洲xxx自由成熟| 亚洲va欧美va国产综合久久| 亚洲欧美精品一区二区| 亚洲精品美女在线观看播放| 国产精品偷伦视频免费观看国产|