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

React Navigation v6:如何检测屏幕进入/失去焦点状态?

React Navigation v6 实现焦点切换(从失焦到聚焦)检测的方法

在React Navigation v6中,你可以根据组件类型(函数组件/类组件)选择以下方案,实现与v4中withNavigationFocus + componentDidUpdate完全一致的效果:

函数组件方案

方案1:精准检测焦点切换(useIsFocused + useRef + useEffect)

通过保存上一次的焦点状态,精准捕获从失焦到聚焦的瞬间:

import { useIsFocused } from '@react-navigation/native';
import { useEffect, useRef } from 'react';

function YourScreen() {
  const isFocused = useIsFocused();
  // 用ref保存上一次的焦点状态
  const wasFocused = useRef(isFocused);

  useEffect(() => {
    // 判断:上一次失焦,当前聚焦
    if (!wasFocused.current && isFocused) {
      // 这里写入你需要触发的业务逻辑
      console.log('屏幕从失焦切换为聚焦');
    }
    // 更新ref的状态,用于下次判断
    wasFocused.current = isFocused;
  }, [isFocused]);

  return (
    // 你的组件渲染内容
  );
}

方案2:简洁的聚焦触发(useFocusEffect)

useFocusEffect是v6提供的专用钩子,会在屏幕首次挂载和每次从其他屏幕切换回来聚焦时自动触发,可直接替代原有逻辑:

import { useFocusEffect } from '@react-navigation/native';
import { useCallback } from 'react';

function YourScreen() {
  useFocusEffect(
    useCallback(() => {
      // 屏幕聚焦时执行的逻辑(包含切换回来的场景)
      console.log('屏幕已聚焦');

      // 可选:返回清理函数,在屏幕失焦时执行
      return () => {
        console.log('屏幕已失焦');
      };
    }, []) // 依赖项为空时,仅在聚焦状态变化时触发
  );

  return (
    // 你的组件渲染内容
  );
}

类组件方案

React Navigation v6移除了官方的withNavigationFocus高阶组件,你可以自行封装一个完全兼容的版本:

import { useIsFocused } from '@react-navigation/native';
import React from 'react';

// 自定义高阶组件,向类组件注入isFocused属性
const withNavigationFocus = Component => props => {
  const isFocused = useIsFocused();
  return <Component {...props} isFocused={isFocused} />;
};

// 类组件使用方式与v4完全一致
class YourScreen extends React.Component {
  componentDidUpdate(prevProps) {
    if (!prevProps.isFocused && this.props.isFocused) {
      // 触发从失焦到聚焦的逻辑
      console.log('屏幕刚刚获得焦点');
    }
  }

  render() {
    return (
      // 你的组件渲染内容
    );
  }
}

export default withNavigationFocus(YourScreen);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:05:07