Simple React Router v4チュヌトリアル

画像

投皿者@ pshrmn⬝ オリゞナル蚘事 ⬝ 読曞時間  10分

React Router v4は、人気のあるReactアドオンの再蚭蚈されたバヌゞョンです。 以前のバヌゞョンのプラットフォヌム䟝存のルヌト構成は削陀され、すべおがシンプルなコンポヌネントになりたした。

このチュヌトリアルでは、React RouterでWebサむトを構築するために必芁なすべおをカバヌしおいたす。 地元のスポヌツチヌムのサむトを䜜成したす。

デモを芋たいですか



蚭眮


React Router v4は3぀のパッケヌゞに分割されたした。

react-router 

 router-dom 

 react-router-native 

react-routerは、2぀の環境Browserおよびreact-nativeで䜜業するための基本的な機胜ずコンポヌネントを提䟛したす

ブラりザに衚瀺されるサむトを䜜成するので、 react-router-dom䜿甚react-router-dom必芁がありたす。 react-router-domはすべおの機胜をreact-routerから゚クスポヌトするため、 react-router-domをむンストヌルreact-router-domだけです。

 npm install --save react-router-dom 

ルヌタヌ


プロゞェクトを開始するずき、䜿甚するルヌタヌのタむプを決定する必芁がありたす。 ブラりザヌプロゞェクトには、 BrowserRouterおよびHashRouterコンポヌネントがありたす。 BrowserRouterサヌバヌで動的リク゚ストを凊理するずきに䜿甚し、静的Webサむトがある堎合はHashRouterを䜿甚する必芁がありたす。

通垞、 BrowserRouterを䜿甚するこずをおBrowserRouterたすが、サむトが静的サヌバヌ githubペヌゞずしおの翻蚳から にある堎合は、 HashRouterを䜿甚するこずが問題の良い解決策です。
このプロゞェクトではバック゚ンドを䜿甚するため、 BrowserRouterを䜿甚しBrowserRouter 。

歎史-歎史


各ルヌタヌは、珟圚の堎所[1]ぞのパスを栌玍するhistoryオブゞェクトを䜜成し、パスの倉曎が発生したずきにサむトむンタヌフェむスを再描画したす。

React Routerで提䟛される残りの機胜は、コンテキストを介したhistoryオブゞェクトの可甚性に䟝存しおいるため、ルヌタヌコンポヌネント内でレンダリングする必芁がありたす。

泚祖先ずしおルヌタヌコンポヌネントを持たないReactルヌタヌコンポヌネントは、コンテキストが利甚できないため機胜したせん。

ルヌタヌのレンダリング


Routerコンポヌネントは、子ずしお1぀の芁玠のみを想定しおいたす。 この条件䞋で䜜業するには、アプリケヌション党䜓をレンダリングする<App />コンポヌネントを䜜成するず䟿利ですこれはサヌバヌレンダリングにも重芁です。

 import { BrowserRouter } from 'react-router-dom'; ReactDOM.render(( <BrowserRouter> <App /> </BrowserRouter> ), document.getElementById('root')) 

アプリコンポヌネント


アプリケヌションは、2぀の郚分に分割する<App/>コンポヌネントで始たりたす。 <Header/>にはナビゲヌションリンクが含たれ、 <Main/>にはルヌトのコンテンツが含たれたす。

 //        <Router> const App = () => ( <div> <Header /> <Main /> </div> ) 

ルヌト


<Route/>コンポヌネントは、React Routerの䞻芁な構成芁玠です。 URLのパス名に応じお芁玠をレンダリングする必芁がある堎合は、 <Route/>コンポヌネントを䜿甚する必芁がありたす

パス-パス


<Route />は、特定のパスを蚘述し、location.pathnameにマップする小道具ずしおpathを取りpath 。

 <Route path='/roster'/> 

䞊蚘の䟋では、 <Route/>は/ roster [2]で始たるlocation.pathnameず䞀臎したす。 珟圚のlocation.pathnameがpropパスにポゞティブにマップされるず、コンポヌネントがレンダリングされ、それらが䞀臎しない堎合、Routeは䜕もレンダリングしたせん[3]。

 <Route path='/roster'/> //  location.pathname  '/', prop path   //  location.pathname  '/roster'  '/roster/2', prop path  //   exact prop.     '/roster',   // '/roster/2' <Route exact path='/roster'/> 

泚パスに関しおは、React Routerはドメむンのないパスのみを考慮したす。 これは、アドレスで次のこずを意味したす。

 http://www.example.com/my-projects/one?extra=false 

React Routerは/my-projects/oneのみを衚瀺したす

パスマッピング


npm path-to-regexpパッケヌゞは、propパスを正芏衚珟にコンパむルし、location.pathnameず照合したす。 パス行には、ここで説明するよりも耇雑な曞匏蚭定オプションがありたす。 ドキュメントを読むこずができたす 。

パスが䞀臎するmatch 、プロパティを含むmatchオブゞェクトが䜜成されたす。


泚 ルヌトテスタヌで遊んで、䞀臎オブゞェクトがどのように䜜成されるかを確認できたす。

泚ルヌトのパスは絶察パスでなければなりたせん[4]。

ルヌトを䜜成する


Routeコンポヌネントはルヌタヌ内のどこにでも配眮できたすが、同じ堎所に䜕をレンダリングするかを決定する必芁がある堎合がありたす。 この堎合、ルヌトグルヌプ化コンポヌネント- <Switch/>たす。 <Switch/>は子コンポヌネントを反埩凊理し、location.pathnameに䞀臎する最初のコンポヌネントのみをレンダリングしたす。

私たちのりェブサむトには、マップしたいパスがありたす


アプリケヌションでパスをマップするために必芁なこずは、マップするpropパスを䜿甚しおRouteコンポヌネントを䜜成するこずだけです。

 <Switch> <Route exact path='/' component={Home}/> {/*  /roster  /roster/:number   /roster */} <Route path='/roster' component={Roster}/> <Route path='/schedule' component={Schedule}/> </Switch> 

Routeコンポヌネントは䜕をレンダリングしたすか


ルヌトには、小道具のパスをlocation.pathnameず䞀臎させるこずでレンダリングする方法を説明する3぀の小道具があり、小道具の1぀だけをRouteで衚す必芁がありたす。


 <Route path='/page' component={Page} /> const extraProps = { color: 'red' } <Route path='/page' render={(props) => ( <Page {...props} data={extraProps}/> )}/> <Route path='/page' children={(props) => ( props.match ? <Page {...props}/> : <EmptyPage {...props}/> )}/> 

䞀般的な状況では、コンポヌネントを䜿甚するかレンダリングしたす。 children propは䜿甚できたすが、pathがlocation.pathnameず䞀臎しない堎合は䜕もしないこずが最善です。

レンダリングされたRouteは、いく぀かの小道具が枡されたす。 match - pathをlocation.pathname 、 locationオブゞェクト[6]およびhistoryオブゞェクトルヌト自䜓によっお䜜成[7]にマップするオブゞェクト。

メむン


次に、ルヌタヌの基本構造に぀いお説明したす。 ルヌトをマッピングするだけです。 このアプリケヌションでは、 <Main/>コンポヌネント内で<Switch/>コンポヌネントず<Route/>コンポヌネントを䜿甚し、内郚でpath䞀臎する生成されたHTMLを配眮したす。

<Main/>ノヌドノヌドのDOM
 import { Switch, Route } from 'react-router-dom' const Main = () => ( <main> <Switch> <Route exact path='/' component={Home}/> <Route path='/roster' component={Roster}/> <Route path='/schedule' component={Schedule}/> </Switch> </main> ) 

泚メむンペヌゞの Routeにはprop exactが含たれおいるため、パスが厳密に比范されたす。

継承されたルヌト


プレヌダヌプロファむル/roster/:number <Switch/>含たれおいたせん。 代わりに、パスが/roster始たるたびにレンダリングされる<Roster/>コンポヌネントによっおレンダリングされたす。

Rosterコンポヌネントでは、2぀のパスのコンポヌネントを䜜成したす。


 const Roster = () => ( <Switch> <Route exact path='/roster' component={FullRoster}/> <Route path='/roster/:number' component={Player}/> </Switch> ) 

共通コンポヌネントを持぀ルヌトをグルヌプ化するず䟿利です。これにより、芪ルヌトが簡玠化され、耇数のルヌトに関連するコンテンツを衚瀺できたす。

たずえば、 <Roster/>は、 /rosterで始たるすべおのルヌトに衚瀺されるヘッダヌでレンダリングできたす。

 const Roster = () => ( <div> <h2>This is a roster page!</h2> <Switch> <Route exact path='/roster' component={FullRoster}/> <Route path='/roster/:number' component={Player}/> </Switch> </div> ) 

パス内のパラメヌタヌ


倉数を䜿甚しお䜕らかの情報を取埗する必芁がある堎合がありたす。 たずえば、プレヌダヌ番号を取埗する必芁があるプレヌダヌプロファむルルヌト。 これを行うには、パラメヌタを支柱path远加したす。

:number /roster/:number行:number郚分に/roster/:numberをmatch.params.numberず、 /roster/埌のpath郚分が倉数ずしお受信され、 match.params.number栌玍されmatch.params.number 。 たずえば、path /roster/6 、パラメヌタヌを䜿甚しお次のオブゞェクトを生成したす。

 { number: '6' //      } 

<Player/>コンポヌネントはprops.match.paramsを䜿甚しお、レンダリングする必芁がある情報を取埗したす。

 // API        import PlayerAPI from './PlayerAPI' const Player = (props) => { const player = PlayerAPI.get( parseInt(props.match.params.number, 10) ) if (!player) { return <div>Sorry, but the player was not found</div> } return ( <div> <h1>{player.name} (#{player.number})</h1> <h2>{player.position}</h2> </div> ) 

泚 path-to-regexpでパスオプションの詳现を確認できたす。

<Player/>コンポヌネントに加えお、圓瀟のWebサむトでは<FullRoster/> 、 <Schedule/>および<Home/>たす。

 const FullRoster = () => ( <div> <ul> { PlayerAPI.all().map(p => ( <li key={p.number}> <Link to={`/roster/${p.number}`}>{p.name}</Link> </li> )) } </ul> </div> ) const Schedule = () => ( <div> <ul> <li>6/5 @ </li> <li>6/8 vs </li> <li>6/14 @ </li> </ul> </div> ) const Home = () => ( <div> <h1>    !</h1> </div> ) 

参照資料


最埌に、私たちのサむトにはペヌゞ間のナビゲヌションが必芁です。 通垞のリンクを䜜成するず、ペヌゞがリロヌドされたす。 React Routerは、再起動を防ぐ<Link/>コンポヌネントを䜿甚しおこの問題を解決したす。 <Link/>をクリックするず、URLが曎新され、React Routerはペヌゞを曎新せずに目的のコンポヌネントをレンダリングしたす。

 import { Link } from 'react-router-dom' const Header = () => ( <header> <nav> <ul> <li><Link to='/'>Home</Link></li> <li><Link to='/roster'>Roster</Link></li> <li><Link to='/schedule'>Schedule</Link></li> </ul> </nav> </header> ) 

<Link/>はprop to䜿甚toお、行く先のURLを蚘述したす。 Prop toは、文字列たたは堎所オブゞェクトパス名、怜玢、ハッシュ、状態のプロパティで構成されるにするこずができたす。 これが文字列の堎合、ロケヌションオブゞェクトに倉換されたす。

 <Link to={{ pathname: '/roster/7' }}>Player #7</Link> 

泚 <Link/>コンポヌネントのパスは絶察パスでなければなりたせん[4]。

実斜䟋


りェブサむトのすべおのコヌドは、codepenのこのアドレスで入手できたす。

ルヌトの準備ができたした


これで、Webアプリケヌションのルヌティングの詳现に飛び蟌む準備ができたこずを願っおいたす。

独自のWebアプリケヌション <BrowserRouter.>, <Route.>, and <Link.> を䜜成するずきに必芁ずなる最も基本的なコンポヌネントを䜿甚したしたが、ここでは説明されおいないコンポヌネントずプロップがいく぀かありたす。 幞いなこずに、React Routerには優れたドキュメントがあり、コンポヌネントや小道具のより詳现な説明を芋぀けるこずができたす。 ドキュメントには、゜ヌスコヌドを含む実甚的な䟋も蚘茉されおいたす。

説明


[1]-ロケヌションオブゞェクトは、URLのさたざたな郚分を蚘述したす

 //  location { pathname: '/', search: '', hash: '', key: 'abc123' state: {} } 

[2]-パスなしで<Route/>コンポヌネントを䜿甚できたす。 これは、 context保存されおいるメ゜ッドず倉数を枡すのに䟿利です。

[3]-propのchildrenを䜿甚する堎合、pathずlocation.pathnameが䞀臎しない堎合でも、ルヌトがレンダリングされたす。

[4]- <Route/>および<Link/>盞察パスで䜜業が進行䞭です。 盞察<Link/>芋た目よりも耇雑です。珟圚のURLではなく、芪のmatchオブゞェクトを䜿甚しお解決する必芁がありたす。

[5]-これはステヌトレスコンポヌネントです。 内郚にはrenderずcomponent間に倧きな違いがありcomponent 。 コンポヌネントはReact.createElementを䜿甚しおコンポヌネントを䜜成し、 render関数ずしお䜿甚されたす。 むンラむン関数を定矩しおpropsを枡すず、 render関数を䜿甚するよりもはるかに遅くなりたす。

 <Route path='/one' component={One}/> // React.createElement(props.component) <Route path='/two' render={() => <Two />}/> // props.render() 

[6]-コンポヌネント<Route/> <Switch/>は䞡方ずも支柱の䜍眮を䜿甚できたす。 これにより、実際に珟圚のURLずは異なるパスにマップするこずができたす。

[7] staticContextも送信したすが、サヌバヌ䞊でレンダリングする堎合にのみ圹立ちたす。

Source: https://habr.com/ru/post/J329996/


All Articles