ホームページ  >  記事  >  ウェブフロントエンド  >  React Router v4 スタートガイド

React Router v4 スタートガイド

亚连
亚连オリジナル
2018-05-26 13:36:341290ブラウズ

この記事では主に React Router v4 エントリーガイド (概要) を紹介します。編集者が非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう

React Router v4 が正式にリリースされてから 3 か月が経ちましたが、以前のルーティングはまだバージョン v2.7.0 を使用していたので、ルーティングもアップグレードすることにしました。アップグレードされました。ちょうど「何か新しいことを試す」のに間に合いました...

公式が 2.x と 4.x の 2 つのバージョンを同時に管理しているという噂があります。 (ヾ(。ꏿ﹏ꏿ)ノ゙ねえ、この時点で、私と同じくらい賢いあなたも気づくと思いますが、ReactRouter v3 はどこに行ったのでしょうか?すべて失ったでしょうか??Bala は問題を解決しました???完璧な説明をしていただけませんか?) 実際、バージョン 3.x にはバージョン 2.x と比べて新しい機能は導入されておらず、バージョン 2.x のいくつかの廃止された API の警告が削除されているだけです。計画によれば、歴史的な問題のない新しいプロジェクトが ReactRouter の安定版を使用したい場合は、ReactRouter 3.x を使用する必要があります。 3.x バージョンは現在まだベータ段階ですが、4.x バージョンよりも前に正式にリリースされる予定です。すでにバージョン 2.x を使用している場合は、3.x にアップグレードしても追加のコード変更は必要ありません。

丁寧な紹介

React Router V4 は、以前の 3 つのバージョンと比較して根本的な変更があります。まず、Just Component の API 設計コンセプトに従っています。第 2 に、API も大幅に合理化されています。初心者の学習の難しさは軽減されますが、以前のプロジェクトの再構築であれば、まあ、言うことはありません。このアップグレードの主な機能は次のとおりです:

  • 宣言型

  • 構成可能性

React Router V4 は、React の哲学に従っています: すべてがコンポーネントです。したがって、アップグレードされるルート、リンク、スイッチなどはすべて共通のコンポーネントです。

React Router V4 は、Lerna に基づいて複数のリポジトリを管理します。このコードベースに含まれるもの:

  1. react-router React Router core

  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 を使用するときは、通常、プラグインを導入する必要があります 2 つパッケージ、react および react-dom の場合、react-router および react-router-dom は使用しないでください。両方引用しますか? react 和  react-dom ,那么 react-routerreact-router-dom 是不是两个都要引用呢? 注意,前方高能,入门第一坑就在这里 。他们两个只要引用一个就行了,不同之处就是后者比前者多出了 52a25b17b52424c09a9e188108722f11 6177ae8eed0322e277a7e6c21878d6d7 这样的 DOM 类组件。因此我们只需引用 react-router-dom 这个包就OK了。当然,如果搭配 redux ,你还需要使用 react-router-redux

主要组件简介

在4.0之前版本的 API 中, a7f2cf15f06fbef780c6b2609731da81 组件的 children 只能是 React Router 提供的各种组件,如 f1752bb1b5753d208371fbe2bc37516a、6fa8d15dc243beab39bb4f4079053772、8a5440a00d77d6842e44278244fc3a30 等。而在 React Router 4 中,你可以将各种组件及标签放进 a7f2cf15f06fbef780c6b2609731da81 组件中,他的角色也更像是 Redux 中的 97c08e022d0743df1dbe093233ea8aa7 。**不同的是 97c08e022d0743df1dbe093233ea8aa7 是用来保持与 store 的更新,而 a7f2cf15f06fbef780c6b2609731da81 是用来保持与 location 的同步。**示例如下:

// 示例1
<Router>
 <p>
  <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}/>
 </p>
 </Router>

Router是所有路由组件共用的底层接口,一般我们的应用并不会使用这个接口,而是使用高级的路由:

  1. 6177ae8eed0322e277a7e6c21878d6d7 :使用 HTML5 提供的 history API 来保持 UI 和 URL 的同步;

  2. 4915f05e1fd45774514682b289f54a27 :使用 URL 的 hash (例如:window.location.hash) 来保持 UI 和 URL 的同步;

  3. ab736354b76d127562077b87d19fcb68 :能在内存保存你 “URL” 的历史纪录(并没有对地址栏读写);

  4. 5045a35d6d66252713cf484dccb46c37 :为使用React Native提供路由支持;

  5. 918422798e26d25f6fed3e9f4a3226eb :从不会改变地址;

TIPS:算是第二坑吧,和之前的Router不一样,这里 a7f2cf15f06fbef780c6b2609731da81 组件下只允许存在一个子元素,如存在多个则会报错。

反面典型在这里:

<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在没有 e388a4556c0f65e1904146cc1a846bee注意、前方には高いエネルギーがあり、スタートする最初のピットはすぐそこです

。違いは、後者には前者よりも 52a25b17b52424c09a9e188108722f11<browserrouter></browserrouter> などの DOM クラス コンポーネントが多く含まれることです。したがって、react-router-dom パッケージを参照するだけで済みます。もちろん、redux と組み合わせる場合は、react-router-redux も使用する必要があります。 🎜🎜🎜主要コンポーネントの紹介🎜🎜🎜 4.0 より前の API バージョンでは、a7f2cf15f06fbef780c6b2609731da81 コンポーネントの子は、<Route&gt など、React Router によって提供されるさまざまなコンポーネントのみにすることができます。 ; 、6fa8d15dc243beab39bb4f4079053772、8a5440a00d77d6842e44278244fc3a30 など。 React Router 4 では、さまざまなコンポーネントやタグを a7f2cf15f06fbef780c6b2609731da81 コンポーネントに入れることができ、その役割は Redux code> の 97c08e022d0743df1dbe093233ea8aa7 に似ています。 。 **違いは、97c08e022d0743df1dbe093233ea8aa7 はストアとの最新情報を維持するために使用されるのに対し、a7f2cf15f06fbef780c6b2609731da81 は場所との同期を維持するために使用されることです。 **例は次のとおりです: 🎜

🎜

<Router>
 <p>
 <Route exact path="/" component={Home}/>
 <Route path="/news" component={NewsFeed}/>
 </p>
</Router>

// 如果应用的地址是/,那么相应的UI会类似这个样子:
<p>
 <Home/>
</p>

// 如果应用的地址是/news,那么相应的UI就会成为这个样子:
<p>
 <NewsFeed/>
</p>
🎜🎜🎜Router は、すべてのルーティング コンポーネントによって共有される基礎となるインターフェイスです。通常、アプリケーションはこのインターフェイスを使用しませんが、高度なルーティングを使用します。 🎜 🎜6177ae8eed0322e277a7e6c21878d6d7: HTML5 が提供する履歴 API を使用して、UI と URL の同期を維持します。 🎜🎜🎜🎜4915f05e1fd45774514682b289f54a27: のハッシュを使用します。 UI と URL の同期を保つための URL (例: window.location.hash) 🎜🎜🎜🎜ab736354b76d127562077b87d19fcb68: 「URL」の履歴をメモリに保存できます。アドレス バーの書き込み) ;🎜🎜🎜🎜5045a35d6d66252713cf484dccb46c37 : React Native を使用するためのルーティング サポートを提供します 🎜🎜🎜🎜918422798e26d25f6fed3e9f4a3226eb : アドレスを変更しません。 ; 🎜🎜🎜 🎜ヒント: これは 2 番目の落とし穴です。前の Router とは異なり、a7f2cf15f06fbef780c6b2609731da81 コンポーネントの下に子要素が 1 つだけ許可されている場合、エラーが発生します。報告。 🎜🎜否定的な例は次のとおりです: 🎜

🎜

// 行内渲染示例
<Route path="/home" render={() => <p>Home</p>}/>

// 包装/合成
const FadingRoute = ({ component: Component, ...rest }) => (
 <Route {...rest} render={props => (
 <FadeIn>
  <Component {...props}/>
 </FadeIn>
 )}/>
)

<FadingRoute path="/cool" component={Something}/>
🎜🎜🎜はい、例 2 は e388a4556c0f65e1904146cc1a846bee の保護なしで次の例外メッセージを報告します: 🎜

我们知道,Route组件主要的作用就是当一个location匹配路由的path时,渲染某些UI。示例如下:

<Router>
 <p>
 <Route exact path="/" component={Home}/>
 <Route path="/news" component={NewsFeed}/>
 </p>
</Router>

// 如果应用的地址是/,那么相应的UI会类似这个样子:
<p>
 <Home/>
</p>

// 如果应用的地址是/news,那么相应的UI就会成为这个样子:
<p>
 <NewsFeed/>
</p>

f1752bb1b5753d208371fbe2bc37516a 组件有如下属性:

  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

同时,新版的路由为 f1752bb1b5753d208371fbe2bc37516a 提供了三种渲染内容的方法:

  1. 135ea3ba59cf0f3cb1f3d808e28c9a39 :在地址匹配的时候React的组件才会被渲染,route props也会随着一起被渲染;

  2. 042e5e850d8a4f46d4c8ce5a47f64889 :这种方式对于内联渲染和包装组件却不引起意料之外的重新挂载特别方便;

  3. 267f3d31687634d3c230ef8911379a05 :与render属性的工作方式基本一样,除了它是不管地址匹配与否都会被调用;

第一种方式没啥可说的,和之前一样,这里我们重点看下 042e5e850d8a4f46d4c8ce5a47f64889 的渲染方式:

// 行内渲染示例
<Route path="/home" render={() => <p>Home</p>}/>

// 包装/合成
const FadingRoute = ({ component: Component, ...rest }) => (
 <Route {...rest} render={props => (
 <FadeIn>
  <Component {...props}/>
 </FadeIn>
 )}/>
)

<FadingRoute path="/cool" component={Something}/>

TIPS: 第三坑! 135ea3ba59cf0f3cb1f3d808e28c9a39 的优先级要比 042e5e850d8a4f46d4c8ce5a47f64889 高,所以不要在同一个 f1752bb1b5753d208371fbe2bc37516a 中同时使用这两个属性。

和之前版本没太大区别,重点看下组件属性:

  1. to(string/object):要跳转的路径或地址;

  2. replace(bool): 为 true 时 ,点击链接后将使用新地址替换掉访问历史记录里面的原地址; 为 false 时 ,点击链接后将在原有访问历史记录的基础上添加一个新的纪录。 默认为 false

示例如下:

// Link组件示例

// to为string
<Link to="/about">关于</Link>

// to为obj
<Link to={{
 pathname: &#39;/courses&#39;,
 search: &#39;?sort=name&#39;,
 hash: &#39;#the-hash&#39;,
 state: { fromDashboard: true }
}}/>

// replace 
<Link to="/courses" replace />

75eb454a3f4763f7cc3bc54947f512fc52a25b17b52424c09a9e188108722f11 的一个特定版本, 会在匹配上当前 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: &#39;bold&#39;,
 color: &#39;red&#39;
 }}
>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>

该组件用来渲染匹配地址的第一个 f1752bb1b5753d208371fbe2bc37516a 或者 8a5440a00d77d6842e44278244fc3a30 。那么它与使用一堆route又有什么区别呢?

da7c15ee158c884a4ad5d56e941eda87 的独特之处是独它仅仅渲染一个路由。相反地,每一个包含匹配地址(location)的 f1752bb1b5753d208371fbe2bc37516a 都会被渲染。思考下面的代码:

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

如果现在的URL是 /about ,那么 22d3513757c67113d267f5266c466f35 , 4c8e0c17c3bd7e0081bb17cc795e1984 , 还有 8e755732ff1d94af2a86b2f7ba06415c 都会被渲染,因为它们都与路径(path)匹配。这种设计,允许我们以多种方式将多个 f1752bb1b5753d208371fbe2bc37516a 组合到我们的应用程序中,例如侧栏(sidebars),面包屑(breadcrumbs),bootstrap tabs等等。 然而,偶尔我们只想选择一个 f1752bb1b5753d208371fbe2bc37516a 来渲染。如果我们现在处于 /about ,我们也不希望匹配 /:user (或者显示我们的 “404” 页面 )。以下是使用 Switch 的方法来实现:

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

现在,如果我们处于 /aboutda7c15ee158c884a4ad5d56e941eda87 将开始寻找匹配的 f1752bb1b5753d208371fbe2bc37516ac24ab0bf30485ffb3eda2a2bce62653d 将被匹配, da7c15ee158c884a4ad5d56e941eda87 将停止寻找匹配并渲染 22d3513757c67113d267f5266c466f35 。同样,如果我们处于 /michael4c8e0c17c3bd7e0081bb17cc795e1984 将被渲染。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

AJAX封装类使用指南

Ajax中浏览器和服务器交互详解

AJAX初级教程之初识AJAX

以上がReact Router v4 スタートガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。