从v5到v6:React Router组件传参踩坑总结
React Router v6的发布带来了许多重要变化,其中最显著的就是路由组件的渲染方式发生了根本性改变。在v5中,我们可以通过<Route>直接渲染组件,而v6则强制使用element属性来传递组件实例。
核心问题:组件传参方式变化
在v5中,这样写是可行的:
<Route path="/user/:id" component={UserComponent} />
但在v6中,这种方式会报错。正确的做法是:
<Route path="/user/:id" element={<UserComponent />} />
踩坑实例:传递路由参数
错误写法(v6):
<Route
path="/user/:id"
element={<UserComponent userId={this.props.match.params.id} />}
/>
正确写法:
function UserComponent() {
const { id } = useParams();
return <div>用户ID: {id}</div>;
}
<Route path="/user/:id" element={<UserComponent />} />
多参数传递方案
如果需要传递多个参数,可以结合useParams和useLocation:
function UserProfile() {
const { id } = useParams();
const location = useLocation();
return (
<div>
<h1>用户ID: {id}</h1>
<p>查询参数: {new URLSearchParams(location.search).get('tab')}</p>
</div>
);
}
升级建议
- 项目中所有标签都需要更新为element写法
- 所有使用this.props.match的代码需要替换为useParams等hooks
- 嵌套路由结构需要重新审视组件层级
- 测试用例需要同步更新以覆盖新语法
v6版本虽然提升了性能和灵活性,但对现有代码改动较大,建议在升级前做好充分测试。

讨论