基于 url ID 和 React Router V6 的动态视图
Dynamic views based on url ID with React Router V6
我正在开发一个显示电影列表的电影应用程序,当您单击某部电影时,它会打开电影视图,其中包含有关该电影的更多信息。目前,我学习了如何使用旧版本的 React Router 来完成它,它是这样的(我也在使用 bootstrap):
<Route path="/movies/:movieId" render={({ match }) => {
return
<Col md={8}>
<MovieView movie={movies.find(m => m._id === match.params.movieId)}
</Col>
}}/>
MovieView 根据 URL 请求的电影作为 Bootstrap 卡片元素呈现电影。我想继续使用相同的概念,但将其更新为 React Router V6。我知道他们删除了像 match
这样的 Route 道具,但我想知道我是否仍然可以在新版本中继续这种动态。
我能够更新显示我数据库中所有电影的主页,V6 代码如下所示:
<Route exact path="/" element={
movies.map(m => (
<Col md={3} key={m._id}>
<MovieCard movie={m} />
</Col>
))
} />
但是,由于 MovieView 需要 URL 来匹配 ID,所以它不起作用,因为我需要定义 match
。
如果有人知道解决此问题的方法,我将非常高兴。
非常感谢!
您可以创建一个包装器组件来通过 useParams
挂钩读取 movieId
路由路径参数,进行过滤,并传递 movie
属性。
示例:
import { useParams } from 'react-router-dom';
...
const MovieWrapper = () => {
const { movieId } = useParams();
return (
<Col md={8}>
<MovieView movie={movies.find(m => m._id === movieId)} />
</Col>
);
};
...
<Route path="/movies/:movieId" element={<MovieWrapper />} />
我正在开发一个显示电影列表的电影应用程序,当您单击某部电影时,它会打开电影视图,其中包含有关该电影的更多信息。目前,我学习了如何使用旧版本的 React Router 来完成它,它是这样的(我也在使用 bootstrap):
<Route path="/movies/:movieId" render={({ match }) => {
return
<Col md={8}>
<MovieView movie={movies.find(m => m._id === match.params.movieId)}
</Col>
}}/>
MovieView 根据 URL 请求的电影作为 Bootstrap 卡片元素呈现电影。我想继续使用相同的概念,但将其更新为 React Router V6。我知道他们删除了像 match
这样的 Route 道具,但我想知道我是否仍然可以在新版本中继续这种动态。
我能够更新显示我数据库中所有电影的主页,V6 代码如下所示:
<Route exact path="/" element={
movies.map(m => (
<Col md={3} key={m._id}>
<MovieCard movie={m} />
</Col>
))
} />
但是,由于 MovieView 需要 URL 来匹配 ID,所以它不起作用,因为我需要定义 match
。
如果有人知道解决此问题的方法,我将非常高兴。 非常感谢!
您可以创建一个包装器组件来通过 useParams
挂钩读取 movieId
路由路径参数,进行过滤,并传递 movie
属性。
示例:
import { useParams } from 'react-router-dom';
...
const MovieWrapper = () => {
const { movieId } = useParams();
return (
<Col md={8}>
<MovieView movie={movies.find(m => m._id === movieId)} />
</Col>
);
};
...
<Route path="/movies/:movieId" element={<MovieWrapper />} />