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

React Navigation v6:滑动关闭模态框时如何向调用页面传值?

React Navigation v6 模态框下滑关闭时传值到调用页面

针对你遇到的问题,这里有两种实用的解决方案,覆盖下滑关闭、手动关闭等所有模态框关闭场景:

方法一:通过回调函数传值(推荐)

打开模态框时传入一个回调函数,在模态框关闭前触发该函数传递数据,逻辑直观且易维护。

调用页面(HomeScreen)代码:

import { useState } from 'react';
import { Button, View, Text } from 'react-native';
import { useNavigation } from '@react-navigation/native';

function HomeScreen() {
  const navigation = useNavigation();
  const [modalReturnValue, setModalReturnValue] = useState(null);

  // 定义接收模态框返回值的回调
  const handleModalData = (value) => {
    setModalReturnValue(value);
  };

  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Button
        title="打开模态框"
        onPress={() => navigation.navigate('ModalScreen', { onClose: handleModalData })}
      />
      {modalReturnValue && (
        <Text style={{ marginTop: 20 }}>
          模态框返回的值:{modalReturnValue}
        </Text>
      )}
    </View>
  );
}

模态框页面(ModalScreen)代码:

import { useState, useEffect } from 'react';
import { View, TextInput, Button } from 'react-native';
import { useNavigation, useRoute } from '@react-navigation/native';

function ModalScreen() {
  const navigation = useNavigation();
  const route = useRoute();
  const [inputValue, setInputValue] = useState('');

  useEffect(() => {
    // 监听模态框关闭前的事件(包括下滑关闭、返回键、手动goBack)
    const unsubscribe = navigation.addListener('beforeRemove', () => {
      // 触发回调传递当前输入的值
      route.params?.onClose(inputValue);
    });

    // 组件卸载时移除监听
    return unsubscribe;
  }, [navigation, route.params, inputValue]);

  return (
    <View style={{ flex: 1, justifyContent: 'center', padding: 20 }}>
      <TextInput
        style={{ borderWidth: 1, padding: 10, marginBottom: 20 }}
        value={inputValue}
        onChangeText={setInputValue}
        placeholder="输入要返回的值"
      />
      <Button
        title="手动关闭模态框"
        onPress={() => {
          route.params?.onClose(inputValue);
          navigation.goBack();
        }}
      />
    </View>
  );
}

方法二:通过路由参数传值

利用navigation.setParams给前一个页面设置参数,在调用页面监听焦点变化获取返回值。

调用页面(HomeScreen)代码:

import { useState, useEffect } from 'react';
import { Button, View, Text } from 'react-native';
import { useNavigation, useRoute } from '@react-navigation/native';

function HomeScreen() {
  const navigation = useNavigation();
  const route = useRoute();
  const [modalReturnValue, setModalReturnValue] = useState(null);

  useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      // 每次页面聚焦时,检查路由参数中的返回值
      if (route.params?.modalValue) {
        setModalReturnValue(route.params.modalValue);
        // 清空参数,避免重复读取
        navigation.setParams({ modalValue: null });
      }
    });

    return unsubscribe;
  }, [navigation, route.params]);

  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Button
        title="打开模态框"
        onPress={() => navigation.navigate('ModalScreen')}
      />
      {modalReturnValue && (
        <Text style={{ marginTop: 20 }}>
          模态框返回的值:{modalReturnValue}
        </Text>
      )}
    </View>
  );
}

模态框页面(ModalScreen)代码:

import { useState, useEffect } from 'react';
import { View, TextInput } from 'react-native';
import { useNavigation } from '@react-navigation/native';

function ModalScreen() {
  const navigation = useNavigation();
  const [inputValue, setInputValue] = useState('');

  useEffect(() => {
    const unsubscribe = navigation.addListener('beforeRemove', () => {
      // 获取前一个页面的路由key
      const prevRouteKey = navigation.getState().routes[navigation.getState().index - 1].key;
      // 给前一个页面设置参数
      navigation.setParams({ modalValue: inputValue }, prevRouteKey);
    });

    return unsubscribe;
  }, [navigation, inputValue]);

  return (
    <View style={{ flex: 1, justifyContent: 'center', padding: 20 }}>
      <TextInput
        style={{ borderWidth: 1, padding: 10 }}
        value={inputValue}
        onChangeText={setInputValue}
        placeholder="输入要返回的值"
      />
    </View>
  );
}

关键说明:

  • beforeRemove事件会在模态框即将关闭时触发,无论关闭方式是下滑、安卓返回键还是手动调用goBack,都能捕获到。
  • 方法一的回调方式更适合需要实时处理返回值的场景,方法二的参数方式适合不需要即时响应的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:50:13