You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Expo Router传参异常:photoURL转义字符丢失求助

Expo Router传递Firebase Storage photoURL时%2F被还原为/的问题解决

问题原因

这是因为Expo Router在传递路由参数时,会自动对URL的query参数进行URL解码。你原始photoURL里的%2F是URL编码后的路径分隔符/,当参数通过URL的query string传递时,路由框架会自动把转义字符还原成原始字符,所以接收时就变成了/。


解决方法

方法1:二次编码+解码

传递参数前对photoURL做二次URL编码,接收时再解码回来:
主页面代码修改:

const onMarkerPressed = useCallback((userData) => {
  const userparams = {
    userData: JSON.stringify(userData),
    photoURL: encodeURIComponent(userData.photoURL) // 二次编码
  };
  router.navigate({ pathname: '/screen2', params: userparams });
}, [userLocation]); 

Screen2接收时解码:

const params = useLocalSearchParams();
const photoURL = decodeURIComponent(params.photoURL);
console.log("photoURL", photoURL)

方法2:通过JSON字符串传递(推荐)

既然已经把userData转成了JSON字符串,直接从解析后的userData里取photoURL即可,避免单独参数的编码解码问题:
主页面去掉单独的photoURL参数:

const onMarkerPressed = useCallback((userData) => {
  const userparams = { userData: JSON.stringify(userData) };
  router.navigate({ pathname: '/screen2', params: userparams });
}, [userLocation]); 

Screen2解析后获取:

const params = useLocalSearchParams();
const userData = JSON.parse(params.userData);
const { photoURL } = userData;
console.log("photoURL", photoURL)

方法3:使用路由state传递

Expo Router支持通过state传递参数,这部分参数不会经过URL编码解码,直接存在内存中:
主页面修改:

const onMarkerPressed = useCallback((userData) => {
  router.navigate('/screen2', {
    state: { userData, photoURL: userData.photoURL }
  });
}, [userLocation]); 

Screen2通过useRouter的state接收:

const router = useRouter();
const { photoURL } = router.state;
console.log("photoURL", photoURL)

内容的提问来源于stack exchange,提问作者Robert Kocev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:26:13