実用的なクイックスタートReactルーティング開発

実用的なクイックスタートReactルーティング開発

インストール

インストールするには、次のコマンドを入力します。

// ネプ
npm で react-router-dom をインストールします

//糸
糸を追加 react-router-dom

react-router 関連タグ

react-routerにはよく使われる 8 つのコンポーネントがあります。

輸入 { 
  ブラウザルーター、
  ハッシュルーター、
  ルート、
  リダイレクト、
  スイッチ、
  リンク、
  ナビリンク、
  ルータ付き、
} 'react-router-dom' から

シンプルなルートジャンプ

シンプルな第1レベルのルーティングジャンプを実装する

輸入 { 
    ルーターとしての BrowserRouter、 
    ルート、 
    リンク 
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        <Link to="/home" className="link">ホームページへジャンプ</Link>
        <Link to="/about" className="link">About ページへ移動</Link>
        <ルート パス="/home" コンポーネント={Home}/>
        <ルート パス="/about" コンポーネント={About}/>
      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

効果は以下のとおりです。

写真

要点の要約:

  • RouteコンポーネントはRouterコンポーネント内になければなりません
  • Linkコンポーネントのto属性の値は、クリック後にジャンプするパスです。
  • Routeコンポーネントのpath属性はLinkタグのto属性と一致します。component componentは、 Routeコンポーネントが正常に一致した後にレンダリングされるコンポーネント オブジェクトを表します。

ネストされたルートジャンプ

Reactのルーティングマッチングレベルは適切である

たとえば、 Appコンポーネントでは、ルーティング コンポーネントの一致するパスが 2 つ、つまり/home/about設定されています。コードは次のようになります。

輸入 { 
  ルーターとしての BrowserRouter、 
  ルート、 
  リンク、
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {

  戻る (
    <div className="アプリ">
      <ルーター>
        <Link to="/home">ホームページへ移動</Link>
        <Link to="/about">About ページへ移動</Link>

        <ルート パス="/home" コンポーネント={Home}/>
        <ルート パス="/about" コンポーネント={About}/>                           

      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

次に、 Homeコンポーネントで、 /home/one/home/twoという 2 つのルーティング コンポーネントの一致するパスも設定します。この時点で、 /home/one/home/twoは上位レベルのルート/homeの 2 番目のレベルのネストされたルートであることがわかります。コードは次のとおりです。

'react' から React をインポートします
輸入 {
    ルート、
    リンク、
} 'react-router-dom' から
'./one' から One をインポートします
'./two' から Two をインポートします

関数ホーム() {
    
    戻る (
        <>
            私はホームページです <Link to="/home/one">Home/one ページへ移動</Link>
            <Link to="/home/two">ホーム/2 ページへ移動</Link>

            <ルート パス="/home/one" コンポーネント={One}/>
            <ルート パス="/home/two" コンポーネント={Two}/>
        </>
    )
}

エクスポートデフォルトホーム

特記事項: Homeコンポーネント内のルーティング コンポーネントOneのセカンダリ ルート パス マッチングは、 /home/one /oneと記述する必要があります。One OneHomeコンポーネント内にあるように見えるからといって、それを/oneに省略できると考えないでください。

動的リンク

NavLink 、現在active状態にあるリンクにactiveクラス名を添付できます。次に例を示します。

輸入 { 
    BrowserRouterをルーターとして使用する 
    ルート、 
    ナビリンク 
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        <NavLink to="/home" className="link">ホームページへジャンプ</NavLink>
        <NavLink to="/about" className="link">About ページへ移動</NavLink>
        <ルート パス="/home" コンポーネント={Home}/>
        <ルート パス="/about" コンポーネント={About}/>
      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。
/* アクティブクラスのスタイルを設定します */
。アクティブ {
    フォントの太さ: 黒;
    色: 赤;
}

効果は以下のとおりです。

写真

ルートマッチングの最適化

リダイレクト リンクをクリックすると、図に示すように、 Routeに対応するすべてのパスを自動的に一致させようとします。

写真

通常の状況では、1 つのルールに一致させてレンダリングするだけで済みます。つまり、一致が成功した後は、それ以降の一致を試行する必要はありません。この場合、次に示すように、 Switchコンポーネントを使用できます。

輸入 { 
  BrowserRouterをルーターとして使用する 
  ルート、 
  ナビリンク、
  スイッチ、
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        <NavLink to="/home" className="link">ホームページへジャンプ</NavLink>   
        <NavLink to="/about" className="link">About ページへ移動</NavLink>

        <スイッチ>
          <ルート パス="/home" コンポーネント={Home}/>       
          <ルート パス="/about" コンポーネント={About}/>      
          <ルート パス="/home" コンポーネント={Home}/>       
          <ルート パス="/home" コンポーネント={Home}/>        
          *ここでは 1 万個のルート コンポーネントは省略されています*/                  
          <ルート パス="/home" コンポーネント={Home}/>                           
        </スイッチ>

      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

効果は以下のとおりです。

写真

要点の要約:

Switchコンポーネントに複数のRouteコンポーネントを配置すると、意味のない複数のルートの一致を回避し、パフォーマンスを向上させることができます。

リダイレクト

ページがジャンプするときに、ジャンプ リンクがどのRouteコンポーネントとも一致しない場合は404ページが表示されるため、リダイレクト コンポーネントRedirect必要になります。コードは次のとおりです。

輸入 { 
  ルーターとしての BrowserRouter、 
  ルート、 
  ナビリンク、
  スイッチ、
  リダイレクト、
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        <NavLink to="/home" className="link">ホームページへジャンプ</NavLink>   
        <NavLink to="/about" className="link">About ページへ移動</NavLink>
        <NavLink to="/shop" className="link">ショップページへジャンプ</NavLink> {/* クリックすると /shop へジャンプしますが、パスが設定されていません*/

        <スイッチ>
          <ルート パス="/home" コンポーネント={Home}/>       
          <ルート パス="/about" コンポーネント={About}/>      
          <Redirect to="/home" />{/* 上記のすべてのルートコンポーネントが一致しない場合は、/home にリダイレクトします */                    
        </スイッチ>

      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

効果は以下のとおりです。

写真

ルーティングパラメータ

ルートによって渡されるすべてのパラメータは、ジャンプ ルート コンポーネントのpropsで取得されます。パラメータを渡す各メソッドは、わずかに異なる方法でパラメータを受け取ります。

ルーティングを通じてパラメータを渡す方法は 3 つあります。 1 つずつ見ていきましょう。

最初

1 つ目は、 Linkコンポーネントのジャンプ パスでパラメータを渡し、 Routeコンポーネントの一致するパスでパラメータ名を通じてパラメータを受け取ることです:參數名コードは次のとおりです。

輸入 { 
  ルーターとしての BrowserRouter、 
  ルート、 
  ナビリンク、
  スイッチ、
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        パス /home には、Zhang San と 18* の 2 つのパラメータがあります。
        <NavLink to="/home/张三/18" className="link">ホームページへジャンプ</NavLink>   
        <NavLink to="/about" className="link">About ページへ移動</NavLink>

        <スイッチ>
          */home の一致するパスの同じ場所で名前と年齢のパラメータを受け取ります*/
          <ルート パス="/home/:name/:age" コンポーネント={Home}/>       
          <ルート パス="/about" コンポーネント={About}/>                           
        </スイッチ>

      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

ルーティングコンポーネントのpropsジャンプして印刷してみる

写真

ご覧のとおり、最初のメソッドのパラメータはprops.match.paramsを通じて取得されます。

2番目

2 番目の方法は、 ?a=1&b=3のように、 Linkコンポーネントのジャンプ リンクの後に?で始まるパラメータを渡すことです。コードは次のとおりです。

輸入 { 
  ルーターとしての BrowserRouter、 
  ルート、 
  ナビリンク、
  スイッチ、
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        ジャンプパスの後に、? で始まる 2 つのパラメータを渡します。つまり、name=张三、age=18 */
        <NavLink to="/home?name=张三&age=18" className="link">ホームページへジャンプ</NavLink>   
        <NavLink to="/about" className="link">About ページへ移動</NavLink>

        <スイッチ>
          ここで受信操作を行う必要はありません*/
          <ルート パス="/home" コンポーネント={Home}/>       
          <ルート パス="/about" コンポーネント={About}/>                           
        </スイッチ>

      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

ルーティングコンポーネントのpropsジャンプして印刷してみる

写真

ご覧のとおり、2 番目のメソッドのパラメーターはprops.location.searchを通じて取得されますが、ここでのパラメーターは自分でさらに変換する必要があるため、ここでは詳しく説明しません。

3番目

3 番目の方法は、 Linkコンポーネントのto jump プロパティをオブジェクトの形式で記述し、 stateプロパティを通じてパラメータを渡すことです。コードは次のとおりです。

輸入 { 
  ルーターとしての BrowserRouter、 
  ルート、 
  ナビリンク、
  スイッチ、
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        {/* to 属性をオブジェクトの形式で記述し、パス属性の名前は pathname、パラメータ属性の名前は state です */
        <NavLink to={{pathname: "/home", state: {name: '张三', age: 18}}} className="link">ホームページへジャンプ</NavLink>   
        <NavLink to="/about" className="link">About ページへ移動</NavLink>

        <スイッチ>
          ** ここで属性を特に受け取る必要はありません*/
          <ルート パス="/home" コンポーネント={Home}/>       
          <ルート パス="/about" コンポーネント={About}/>                           
        </スイッチ>

      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

ルーティングコンポーネントのpropsジャンプして印刷してみる

写真

ご覧のとおり、3番目のメソッドのパラメータはprops.location.stateを通じて取得されます。

機能ルーティング

上記は主にreact-router-domLinkコンポーネントを介して特定のルーティングコンポーネントにジャンプします。

しかし、関数を呼び出していつでもどこでもルートをジャンプするなど、より柔軟なルートジャンプ方法が必要になる場合があります。これを機能ルーティングと呼びます。

機能ルーティングで使用されるメソッドは5あります (下のスクリーンショットはルーティング コンポーネントのpropsからのものです)

ここに画像の説明を挿入

メソッドはpushreplacegoForwardgoBackgo5です。次に、これらのメソッドを順番に紹介します。

押す

push方式は、ページを対応するパスにジャンプし、ブラウザに記録を残す(つまり、ブラウザの戻るボタンで前のページに戻ることができる)

たとえば、ルーティング コンポーネントHomebuttonを設定し、それをクリックしてpushメソッドを呼び出して/aboutページにジャンプします。

'react' から React をインポートします

関数ホーム(props){

    pushLink = () => { とします。
        props.history.push('/about')
    }
    
    戻る (
        <div クラス名="a">
            ホーム ページにいます <button onClick={pushLink}> About ページへ移動 </button>
        </div>
    )
}

エクスポートデフォルトホーム

ジャンプ効果は以下のとおりです。

写真

ご覧のとおり、 pushメソッドを経由した後、ブラウザの戻るボタンで前のページに戻ることができます。

交換する

replaceメソッドはpushメソッドと似ていますが、ジャンプ後に前のページの記録がブラウザに保存されない点が異なります(つまり、ブラウザの戻るボタンで前のページに戻ることはできません)。

コードを変更する

'react' から React をインポートします

関数ホーム(props){

    replaceLink = () => { とします。
        props.history.replace('/about')
    }
    
    戻る (
        <div クラス名="a">
            ホーム ページにいます <button onClick={replaceLink}> About ページへ移動 </button>
        </div>
    )
}

エクスポートデフォルトホーム

ジャンプ効果は以下のとおりです。

写真

ご覧のとおり、最初のパスは「/」で、次に「/home」にジャンプし、ボタンをクリックして、 replaceメソッドを通じて/aboutページにジャンプします。最後に、ブラウザの戻るボタンから/ページに戻りましたが、中央の/homeブラウザの記録に保存されていないことがわかりました。

前進

goForwardメソッドを呼び出すことは、次の図に示すように、ブラウザの次のページに戻るボタンをクリックすることと同じです。

写真

ここでこれ以上のデモンストレーションは行いません。

戻る

goBackメソッドを呼び出すことは、次の図に示すように、ブラウザのボタンをクリックして前のページに戻ることと同じです。

ここに画像の説明を挿入

行く

名前が示すように、 goメソッドは指定されたパスにジャンプするために使用されます。

このメソッドは、次のように 1 つのパラメータ (パラメータ タイプはNumber ) を受け入れます。

  • パラメータが正の数nの場合、次のnページにジャンプすることを意味します。たとえば、 go(1) goForwardメソッドを1回呼び出すことと同じです。
  • パラメータが負の数nの場合、前のnページにジャンプすることを意味します。たとえば、 go(-3) goBackメソッドを 3 回呼び出すことと同じです。
  • パラメータが0の場合、現在のページを更新することを意味します

共通コンポーネントはルーティングを使用する

ここでは、通常のコンポーネントとルーティングコンポーネントという2つの概念があります。

Routeコンポーネントによってレンダリングされるコンポーネントはルーティングコンポーネントであり、残りは基本的に通常のコンポーネントです。

たとえば、次のコードでは、 Homeコンポーネントはルーティングコンポーネントであり、 Appコンポーネントは通常のコンポーネントです。

輸入 {
  ルーターとしての BrowserRouter、 
  ルート、 
  ナビリンク、
  スイッチ、
} 'react-router-dom' から
'./home' から Home をインポートします。

デフォルト関数App()をエクスポートする{
  
  戻る (
    <div className="アプリ">
      <ルーター>
        <NavLink to='/home' className="link">ホームページへジャンプ</NavLink>   

        <スイッチ>
          <ルート パス="/home" コンポーネント={Home}/>                              
        </スイッチ>

      </ルーター>
    </div>
  );
}

そして、ルーティングコンポーネントと通常のコンポーネントの最大の違いは、コンポーネントのprops属性に次の図に示す内容が含まれているかどうかです。(前者は含まれていますが、後者は含まれていません)

写真

この時点で、 react-router-dom withRouterメソッドを提供しており、これにより通常のコンポーネントがルーティング コンポーネントと同じメソッドやデータを持つことができるようになります。

使い方は次のとおりです:

輸入 { 
  ルーターとしての BrowserRouter、 
  ルート、 
  ナビリンク、
  スイッチ、
  withRouter, // 1. witRouterを導入する
} 'react-router-dom' から
'./about' から About をインポートします

関数App(props) {

  console.log(props); // 3. 通常のコンポーネント App の props を出力してみると、props にすでにコンテンツが含まれていることがわかります。つまり、通常のコンポーネントもルーティング コンポーネントと同じ機能を持つことができます。 return (
    <div className="アプリ">
      <ルーター>
        <NavLink to="/about" className="link">About ページへ移動</NavLink>

        <スイッチ>
          <ルート パス="/about" コンポーネント={About}/>                           
        </スイッチ>

      </ルーター>
    </div>
  );
}

export default withRouter(App); // 2. withRouterメソッドを使用して通常のコンポーネントをラップする

補充する

交換する

機能ルーティングには、 pushreplace 2 つの主なジャンプ タイプがあります。非機能ルーティングでは、ジャンプ タイプをカスタマイズすることもできます。具体的な実装コードは次のとおりです。

輸入 { 
    BrowserRouterをルーターとして使用する 
    ルート、 
    リンク 
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {
  戻る (
    <div className="アプリ">
      <ルーター>
        <Link to="/home" className="link">ホームページへジャンプ</Link>
        <Link to="/about" className="link">About ページへ移動</Link>

        <Route path="/home" component={Home} replace={true}/> {/* replace は true、ジャンプ タイプは replace です */
        <Route path="/about" component={About} replace={false}/> {/* replace は false、ジャンプ タイプは push */
      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。
Route コンポーネントには、リダイレクト タイプを設定できる replace 属性があります。値が true の場合、リダイレクト タイプは replace になり、値が false の場合、リダイレクト タイプは push になります。

発掘

デフォルトのルート マッチングはあいまいマッチングです。例:

輸入 { 
  BrowserRouterをルーターとして使用する 
  ルート、 
  リンク、
} 'react-router-dom' から
'./home' から Home をインポートします。
'./about' から About をインポートします

関数App() {

  戻る (
    <div className="アプリ">
      <ルーター>
        <Link to="/home/abc">ホームページにジャンプ</Link>{/* /home/abc にジャンプしますが、home の下に abc ルーティング コンポーネントはありません*/
        <Link to="/about/abc">About ページへジャンプ</Link>{/* /about/abc へジャンプしますが、ホームの下に abc ルーティング コンポーネントはありません*/

        <Route path="/home" component={Home} />{/* ルートのマッチングルールは /home で、正確な属性は設定されておらず、現在の一致はあいまいです*/
        <Route path="/about" component={About} exact/> {/* ルートのマッチングルールは /about で、exact 属性が設定されており、現在の一致は exact です*/

      </ルーター>
    </div>
  );
}

デフォルトのアプリをエクスポートします。

効果は以下のとおりです。

写真

図からわかるように、 /home/abcにジャンプする場合、最初のRouteコンポーネントはあいまい一致であるため、最初に/homeに一致し、 Homeコンポーネントがレンダリングされます。一方/about/abcにジャンプする場合、2 番目のRouteコンポーネントは完全一致であるため、 /about/abc /aboutと等しくないため、 Aboutコンポーネントもレンダリングされません。

要約:

  • 完全一致が必要な場合は、 Routeコンポーネントのexactプロパティをtrueに設定するだけです。
  • 完全一致はネストされたルートの使用に影響する可能性があるため、注意して使用する必要があります。

上記は、React ルーティングの簡単なクイックスタートの詳細な内容です。React ルーティングのクイックスタートの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Reactルーティング認証の実装方法
  • Reactルートの遅延読み込みのためのいくつかの実装ソリューション
  • React-router4ルート監視の実装
  • Reactルーティングの各バージョンのリダイレクト方法の詳細な説明
  • Reactのreact-routerルーティングからのログイン認証を制御する方法
  • React-router v4: 履歴を使用してルートジャンプを制御する方法
  • Nginx で React プロジェクトの URL を設定した後にルーティング パスを直接入力すると発生する 404 問題の解決方法
  • React-router v4 ルーティング設定方法の概要

<<:  Linux での SSH パスワードフリーログイン設定の詳細な説明

>>:  Windows での MySQL 5.7.20 のインストールと設定方法のグラフィック チュートリアル

推薦する

MySQL 高可用性クラスタの展開とフェイルオーバーの実装

目次1. 内閣府1. コンセプト2. MHAの構成3. MHAの特徴2. MySQL+MHAをビルド...

JavaScript スタイル オブジェクトと CurrentStyle オブジェクトのケース スタディ

1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...

Ubuntuで顔認識ログインを実装するための完全な手順

1. Howdyをインストール: howdyプロジェクトアドレス sudo add-apt-repo...

MySQLインデックスの使用に関するヒントと注意事項

1. インデックスの役割一般的なアプリケーション システムでは、読み取りと書き込みの比率は約 10:...

Mysqlクエリ条件で文字列の末尾にスペースがあっても一致しない問題の詳細な説明

1. テーブル構造テーブル人id名前1あなた2あなた(スペース) 3あなた(スペース2つ) 2. ク...

MySQL データ アーカイブ ツール mysql_archiver の詳細な説明

目次I. 概要2. pt-archiverの主なパラメータ3. mysql_archiverのインス...

Angular構造ディレクティブモジュールとスタイルの詳細な説明

目次1. 構造指示モジュールforRoot()を書く3. スタイルの定義ドラッグ時の順序を調整するに...

vue+elementui+vuex+sessionStorage を使用して履歴タグ メニューを実装するためのサンプル コード

一般的には、左側にメニューがあった後、ページの上部に履歴タブ メニューを追加する必要があります。他の...

CSS3はキングをマッチングさせるときにパーティクルアニメーション効果を実現します

コーディングをしていると、多くのことが同じ結末を迎えることに気づくでしょう。問題を解決する方法は何千...

HTML構造化実装方法

DIV+css構造 CSSレイアウトを学んでいますか?まだ純粋な CSS レイアウトを完全に習得でき...

Linux で起動時にプログラムを自動的に実行させる最も簡単な方法

たくさん集めましたが、すべて失敗に終わりました。最終的に、この方法は優れており、使用に影響を与えない...

vue.js ルーターのネストされたルート

序文:ルートでは、主要部分は同じでも、基礎となる構造が異なることがあります。たとえば、ホームページに...

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...

vue-cli 3 で vue-bootstrap-datetimepicker 日付プラグインを使用する方法

需要背景最近、Vue を使用してフロントエンド エンジニアリング システムと組み合わせ、以前のデモを...

Dockerデータを完全にクリーンアップする方法

目次定期的に剪定するミラーエビクションコンテナのクリーンアップネットワークソート体積の蒸発完全にクリ...