/

React Router:如何從動態路由中獲取數據

React Router:如何從動態路由中獲取數據

當您使用 React Router 以動態參數的方式時,一個非常常見的需求是獲取我們在頁面中顯示的數據。

舉個例子,假設我們有一個項目列表,點擊項目後會進入項目詳情頁,URL 地址為 /project/PROJECT_ID

我找到了兩種方法來實現這個需求。

首先,在路由中聲明這樣的路徑:

1
2
3
<Route path="/project/:id">
<SingleProject />
</Route>

注意這裡的 /project/:id 路徑。這表示該組件將接收到 id 參數中的動態部分。

接下來,在 SingleProject 組件中,我們可以使用 useParams 鉤子來獲取 id 參數:

1
2
3
4
5
import { useHistory, useParams } from 'react-router-dom';

//...

const { id } = useParams();

在我的案例中,我使用這個 id 參數從一個項目數組中過濾出數據,但您也可以使用它來查詢數據庫或者進行其他任務。

另一種方式是使用 props:

1
<Route path="/project/:id" render={(props) => <SingleProject {...props} />} />

在 SingleProject 組件中(即在上面的 render 屬性中列舉的那個組件),我們使用傳入的 props

1
2
3
function SingleProject(props) {
//...
}

這些 props 包含在 match.params 屬性下的參數,所以我們可以使用對象解構來重新獲取我們的 id

1
const { id } = props.match.params;

match 也可以在內聯渲染的路由中使用,這在我們在渲染組件之前使用 id 參數查找帖子數據源時很有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const posts = [
{ id: 1, title: 'First', content: 'Hello world!' },
{ id: 2, title: 'Second', content: 'Hello again!' }
]

const Post = ({post}) => (
<div>
<h2>{post.title}</h2>
{post.content}
</div>
)

//...

<Route exact path="/post/:id" render={({match}) => (
<Post post={posts.find(p => p.id === match.params.id)} />
)} />

tags: [“React Router”, “dynamic route”, “useParams”, “props”]