v6路由路径参数编码解码错误排查与修复
在React Router v6升级过程中,我们遇到了一个常见的编码问题:当路由参数包含特殊字符时,会出现URL编码解码不一致的情况。
问题复现
// 路由定义
<Route path="/user/:userId" element={<UserProfile />} />
// 跳转代码
const navigate = useNavigate();
navigate('/user/张三'); // 包含中文字符
访问时发现:URL显示为/user/%E5%BC%A0%E4%B8%89,但组件内通过useParams()获取的参数却是张三,看似正常,但在某些情况下会引发数据不一致问题。
根本原因
v6版本中,路由参数的解码逻辑存在不一致性。在某些浏览器环境下,URLSearchParams处理机制导致特殊字符解码异常。
解决方案
- 统一编码处理:
const encodedPath = encodeURIComponent(userId);
navigate(`/user/${encodedPath}`);
- 自定义参数解析器:
function useSafeParams() {
const params = useParams();
const safeParams = {};
Object.keys(params).forEach(key => {
safeParams[key] = decodeURIComponent(params[key]);
});
return safeParams;
}
- 路由配置优化:在使用
useRoutes时,添加自定义编码处理逻辑。
验证方法
通过测试用例验证所有特殊字符场景,包括中文、特殊符号、emoji等,确保参数正确传递与解析。

讨论