反応ルーティング 02 - 反応ルーター V6 でのルーティング テーブルの使用 (useRoutes フック + データ ルーティング createBrowserRouter API + RouterProvider コンポーネントの使用)
1. ルーティングテーブルを使用しない
1.1 React-routerV6ルーティングの簡単な使い方について
- 次の記事
「反応ルーティング 01 - 反応ルーターV6 のルーティングでパラメーターを渡すいくつかの方法」を参照してください。
1.2 ルーティング テーブルが設定されていない
- まず、ルーティング テーブルが構成されていないときのプロジェクト構造を次のように見てみましょう。
- 効果は次のとおりです。
2. ルーティング テーブル - useRoutes フック
2.1 ルーティングテーブルの設定
- ルーティング テーブルを次のように構成します。
import Home from "../pages/Home" import Dog from "../pages/Dog" import Cats from "../pages/Cat/Cats" import CatInfo from "../pages/Cat/Info/CatInfo" export default[ { path:'/', element:<Home/> },{ path:'/dog', element:<Dog/> },{ path:'/cats/*', element:<Cats/>, children:[ { // path:'info', // element:<CatInfo name='张三' age={18}/> path:'info/:catId/:catName', element:<CatInfo name='张三' age={ 18}/> } ] } ]
2.2 第 1 レベルのルーティング コンポーネント - useRoutes フック
-
元のルーティング コンポーネントは次のように変更されます (元の記述方法との比較については上記を参照してください)。1.2 ルーティング テーブルが設定されていない):
import React from "react" import { Link,useRoutes} from 'react-router-dom' import './index.css' import routes from "../../routes" function PetLef(){ const myRoutes = useRoutes(routes); return( <div> <div className="myMainData left" > { /* 编写路由链接 靠路由链接实现切换组件 */} <ul> <li><Link to="/">Home</Link></li> <li><Link to="/dog">狗狗信息</Link></li> <li><Link to="/cats">猫咪信息</Link></li> </ul> </div> <div className="myMainData right" > { /* 注册路由 */} { myRoutes} </div> </div> ) } export default PetLef;
- パラメータの取得
- パラメータの取得
2.3 二次ルーティングコンポーネント - アウトレットコンポーネント
- 子ルート要素をレンダリングするには、親ルート要素で使用する必要があります
<Outlet>
。これにより、サブルートがレンダリングされるときにネストされた UI を表示できるようになります。親ルートが完全に一致する場合は、子のインデックス ルートがレンダリングされますが、インデックス ルートが存在しない場合は、何もレンダリングされません。 - 元のルーティング コンポーネントは次のように変更されます (元の記述方法との比較については上記を参照してください)。1.2 ルーティング テーブルが設定されていない):
import React,{ useState} from "react"; import { Link,Outlet} from 'react-router-dom' export default function Cats(){ const [cats] = useState([ { catId:'A1001',catName:'点点'}, { catId:'A1002',catName:'阿苔'}, { catId:'A1003',catName:'花花'} ]); return( <div> <h2>猫咪信息</h2> <ul> { cats.map((cat)=>{ return( <li key={ cat.catId}> { /* 编写路由链接 */} { /* <Link to='info'> {cat.catId}--{cat.catName} </Link> */} <Link to={ `/cats/info/${ cat.catId}/${ cat.catName}`}> { cat.catId}--{ cat.catName} </Link> </li> ) }) } </ul> <br /><br /> { /* 二级路由——展示路由组件 二级路由不用useRoutes,用Outlet */} <Outlet/> </div> ) }
2.4 ディレクトリ構造
- 次のように:
2.5. 発生した問題
2.5.1 问题1:useRoutes() のみ使用できます……
- この問題は次のように説明されています。
useRoutes() may be used only in the context of a <Router> component.
- 問題の原因:
ルーティング テーブルを使用した後、BrowserRouter ラベルが上位に配置されませんでした。元のプロジェクトでは上位のコンポーネント ルートに配置されていましたが、実際には上位に配置されるはずです。 - 問題を解く:
- 1⃣️ 次のように、App.js に BrowserRouter タグを配置できます。
- 2⃣️ もちろん、
index.js
次のようにプロジェクトの入り口に直接配置することもできます。
- 1⃣️ 次のように、App.js に BrowserRouter タグを配置できます。
3. データ ルーター—V6.4 データ API:
3.1 簡単な説明
- 次のように:
3.2 createBrowserRouter API + RouterProvider コンポーネント
3.2.1 公式サイトの例
- 次のように:
3.2.2 リライトプロジェクトの例
3.2.2.1 プロジェクト設計の簡単な説明
- 次のように:
3.2.2.2 書き換えられたディレクトリ構造
- 次のように:
3.2.2.3 ルーティング設定
-
次のように:
import Dog from "../pages/Dog" import Cats from "../pages/Cat/Cats" import CatInfo from "../pages/Cat/Info/CatInfo" import LayOut from "../pages/Layout/index.jsx" import UserInfo from "../pages/Layout/UserInfo.jsx" import OrganInfo from "../pages/Layout/OrganInfo.jsx" import Login from "../pages/Login" import About from "../pages/About" import { createBrowserRouter } from "react-router-dom" const myRouter = createBrowserRouter([ { path:'/', element:<LayOut/>, children:[ { path:'user', element:<UserInfo/>, },{ path:'organ', element:<OrganInfo/>, },{ path:'/dog', element:<Dog/> },{ path:'/cats/*', element:<Cats/>, children:[ { path:'info/:catId/:catName', element:<CatInfo name='张三' age={ 18}/> } ] } ] },{ path:'/login', element: <Login/> },{ path:'/about', element: <About/> } ]) export default myRouter;
3.2.2.4 エフェクト表示
- 次のように:
3.2.2.5 その他のコアコード
- App.js +index.js (エントリ)
- Layout-index.jsx +cats.jsx +organInfo.jsx
-
Layout-index.jsx は次のようになります。
import { Outlet } from "react-router-dom"; import { Link } from "react-router-dom"; import './index.css' const LayOut = ()=>{ return ( <div> <div className="myMainData left" > { /* 展示一级路由 */} <ul> <li><Link to="/user">用户信息</Link></li> <li><Link to="/organ">机构信息</Link></li> { /* <li><Link to="/home">Home</Link></li> */} <li><Link to="/dog">狗狗信息</Link></li> <li><Link to="/cats">猫咪信息</Link></li> </ul> </div> <div className="myMainData right" > { /* 展示二级路由 */} <Outlet/> </div> </div> ) } export default LayOut;
-
cat.jsx は次のようになります。
import React,{ useState} from "react"; import { Link,Outlet} from 'react-router-dom' export default function Cats(){ const [cats] = useState([ { catId:'A1001',catName:'点点'}, { catId:'A1002',catName:'阿苔'}, { catId:'A1003',catName:'花花'} ]); return( <div> <h2>猫咪信息</h2> <ul> { cats.map((cat)=>{ return( <li key={ cat.catId}> { /* 编写路由链接 */} <Link to={ `/cats/info/${ cat.catId}/${ cat.catName}`}> { cat.catId}--{ cat.catName} </Link> </li> ) }) } </ul> <br /><br /> { /* 三级路由 猫猫的详细信息 */} <Outlet/> </div> ) }
-
orgInfo.jsx は次のようになります。
const OrganInfo = ()=>{ return( <div>机构信息</div> ) } export default OrganInfo;
-
3.3
4. プログラムによるナビゲーション
4.1 コンポーネント間の単純なジャンプ (パラメーターなし)
-
コードは以下のように表示されます。
import { useNavigate } from "react-router-dom"; const UserInfo = ()=>{ const navigate = useNavigate();//返回的是一个函数 const goToOrganInfo = ()=>{ //跳转 到机构信息 navigate('/organ'); } const login = ()=>{ //跳转到登录页面 navigate('/login'); } return( <div> 用户信息 <br /> <button onClick={ goToOrganInfo}>回到机构信息</button> <br /> <button onClick={ login}>登录/重新登录</button> </div> ) } export default UserInfo;
-
効果は次のとおりです。
4.2 コンポーネント間の単純なジャンプ (パラメータあり)
4.2.1 paramsパラメータ
-
コードは以下のように表示されます。
-
追加されたコアコードは次のとおりです。
import { Link,Outlet,useNavigate} from 'react-router-dom' const navigate = useNavigate(); const catDetails = (cat)=>{ navigate(`info/${ cat.catId}/${ cat.catName}`); } <button onClick={ ()=>catDetails(cat)}>详情信息</button>
-
効果:
4.2.2 状態パラメータ
- コードは以下のように表示されます。
import { Link,Outlet,useNavigate} from 'react-router-dom' const navigate = useNavigate(); const catDetails = (cat)=>{ navigate('info',{ replace: false, state:{ catId:cat.catId, catName:cat.catName } }); } <button onClick={ ()=>catDetails(cat)}>详情信息</button>
- 注意点:
- パラメータの受け取り方法を変更する必要がある
- 席を占有する必要はありません
- パラメータの受け取り方法を変更する必要がある
5. 付属品
- プロジェクトの内容概要は以下の通りです。
- プロジェクトをダウンロードします。react
-router V6 ルーティング構成とその他の例 1. ルーティングでパラメーターを渡すいくつかの方法とその他の例 2. ルーティング テーブルの構成。