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

Expo中React Query返回页面时无法重新获取数据的问题

解决Stack Navigator返回时React Query重新获取数据的问题

方法1:利用React Navigation的useFocusEffect触发重取

Stack导航模式下,返回上一页时组件不会重新挂载,但会触发页面焦点变化。用useFocusEffect监听这个时机,手动调用React Query的重取方法即可。

示例代码:

import { useFocusEffect } from '@react-navigation/native';
import { useQueryClient } from '@tanstack/react-query';
import React from 'react';

function HomeScreen() {
  const queryClient = useQueryClient();

  useFocusEffect(
    React.useCallback(() => {
      // 重取指定queryKey的查询数据
      queryClient.refetchQueries({ queryKey: ['homeData'] });

      // 如果你是通过useQuery直接获取的查询实例,也可以这样调用
      // const { refetch } = useQuery({ 
      //   queryKey: ['homeData'], 
      //   queryFn: () => fetchHomeData() 
      // });
      // refetch();
    }, [queryClient])
  );

  // 组件其他逻辑...
}

方法2:开启React Query的refetchOnFocus配置

React Query在React Native环境中会自动监听App状态,开启refetchOnFocus后,页面获得焦点(比如从其他页面返回)时会自动重取数据。可以全局配置或针对单个查询配置:

全局配置(初始化QueryClient时)

import { QueryClient } from '@tanstack/react-query';

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      refetchOnFocus: true, // 该选项默认就是true,若之前手动改为false,改回即可
    },
  },
});

单个查询配置

import { useQuery } from '@tanstack/react-query';

function HomeScreen() {
  const { data } = useQuery({
    queryKey: ['homeData'],
    queryFn: () => fetchHomeData(),
    refetchOnFocus: true, // 单独给这个查询开启焦点重取
  });

  // 组件其他逻辑...
}

方法3:监听路由参数触发重取

如果需要更精准的控制(比如仅从特定页面返回时才重取),可以通过路由参数标记,监听参数变化触发重取:

import { useRoute } from '@react-navigation/native';
import { useEffect } from 'react';
import { useQuery } from '@tanstack/react-query';

function HomeScreen() {
  const route = useRoute();
  const { refetch } = useQuery({ 
    queryKey: ['homeData'], 
    queryFn: () => fetchHomeData() 
  });

  useEffect(() => {
    // 检测到路由参数中存在重取标记时触发重取
    if (route.params?.needRefetch) {
      refetch();
      // 重置参数,避免后续重复触发
      route.params.needRefetch = false;
    }
  }, [route.params, refetch]);

  // 跳转至Test页面时可传递参数:navigation.navigate('Test')
  // 在Test页面返回前设置标记:navigation.setParams({ needRefetch: true }); 再调用navigation.goBack()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:05:00