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

使用expo-router时,如何通过router.back()回传参数?

Expo Router 页面回传参数解决方案

下面提供两种实用方案,解决扫码页面回传参数到原页面的问题:

方案一:利用路由 State 传递参数

无需额外依赖,直接借助 Expo Router 的路由状态实现参数回传

1. 修改原页面跳转代码

跳转时给目标页面传入空的路由 state(用于后续携带回传参数):

<TouchableOpacity style={styles.qrButton} onPress={()=> {
  router.push('/rent-bike/qr-scanner', {})
}}>
  <Text style={styles.qrText}>Użyj kodu QR</Text>
</TouchableOpacity>

2. 扫码页面回传参数并返回

获取到扫码结果后,用 router.replace 回到原页面,同时把参数存入路由 state:

const handleBarCodeScanned = ({type, data}) => {
  setScanData(true)
  console.log(`data: ${data}`);
  console.log(`type: ${type}`);
  // 替换当前路由,携带参数返回原页面(替换成你的原页面实际路由)
  router.replace('/rent-bike/index', {
    scanResult: { type, data }
  })
};

3. 原页面读取回传参数

用 useFocusEffect 监听页面聚焦,实时读取路由 state 中的参数:

import { useRouter } from 'expo-router';
import { useFocusEffect } from '@react-navigation/native';
import { useState } from 'react';

export default function RentBikePage() {
  const router = useRouter();
  const [scanResult, setScanResult] = useState(null);

  useFocusEffect(() => {
    const result = router.state?.scanResult;
    if (result) {
      setScanResult(result);
      // 清空 state,避免重复读取
      router.setParams({ scanResult: null });
    }
  });

  return (
    <>
      {/* 原有页面内容 */}
      {scanResult && (
        <View>
          <Text>扫码类型:{scanResult.type}</Text>
          <Text>扫码数据:{scanResult.data}</Text>
        </View>
      )}
    </>
  );
}

方案二:全局状态管理(以 Zustand 为例)

适合需要在多个页面共享数据的场景,更灵活

1. 安装并创建状态存储

先安装依赖:

npm install zustand

创建状态文件 store/scanStore.js:

import { create } from 'zustand';

export const useScanStore = create((set) => ({
  scanResult: null,
  setScanResult: (data) => set({ scanResult: data }),
  clearScanResult: () => set({ scanResult: null })
}));

2. 扫码页面更新全局状态

获取扫码结果后更新状态,再调用 router.back() 返回:

import { useScanStore } from '../store/scanStore';

const handleBarCodeScanned = ({type, data}) => {
  setScanData(true)
  console.log(`data: ${data}`);
  console.log(`type: ${type}`);
  // 更新全局状态
  useScanStore.getState().setScanResult({ type, data });
  router.back();
};

3. 原页面订阅状态

直接订阅全局状态,实时获取扫码结果:

import { useScanStore } from '../store/scanStore';
import { useEffect } from 'react';

export default function RentBikePage() {
  const scanResult = useScanStore((state) => state.scanResult);
  const clearScanResult = useScanStore((state) => state.clearScanResult);

  useEffect(() => {
    if (scanResult) {
      // 处理扫码结果
      console.log('收到扫码数据:', scanResult);
      // 清空状态,避免下次进入页面重复显示
      clearScanResult();
    }
  }, [scanResult, clearScanResult]);

  return (
    <>
      {/* 原有页面内容 */}
      {scanResult && (
        <View>
          <Text>扫码类型:{scanResult.type}</Text>
          <Text>扫码数据:{scanResult.data}</Text>
        </View>
      )}
    </>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:57:37