可见性监听

页面的「可见」指用户当前看到的栈顶页面;从 A push 到 B 时,A 变为不可见,B 变为可见;pop 回 A 时反之。可用于刷新列表、暂停播放、埋点等。

useVisibleEffect

在函数组件中监听当前页面的显示与隐藏:页面变为可见时执行回调,返回的清理函数在页面变为不可见时执行。

import { View } from 'react-native';
import { useVisibleEffect } from 'hybrid-navigation';

function MyScreen() {
  useVisibleEffect(() => {
    console.log('页面可见');
    return () => console.log('页面不可见');
  });
  return <View>...</View>;
}

注意:useVisibleEffect 内部依赖 useNavigator(),因此必须在已挂载到 hybrid-navigation 的页面组件内使用(即通过 Navigation.registerComponent 注册的、被 withNavigationItem 等包裹的组件)。

useNavigator

获取当前页面对应的 Navigator 实例(与 props 中的 navigator 一致),用于在无法从 props 拿到 navigator 的深层子组件中执行导航。

import { useNavigator } from 'hybrid-navigation';

function Child() {
  const navigator = useNavigator();
  return (
    <Button onPress={() => navigator.push('Detail')} title="进入详情" />
  );
}

仅在已注册的页面组件及其子组件树内有效。

高级:按 sceneId 监听(addVisibilityEventListener)

若需要在页面外根据 sceneId 监听某页面的可见性(例如在 Store 或服务层),可使用:

import Navigation from 'hybrid-navigation';

const subscription = Navigation.addVisibilityEventListener(sceneId, (visibility) => {
  if (visibility === 'visible') {
    // 该页面变为可见
  } else {
    // 该页面变为不可见
  }
});

// 取消监听
subscription.remove();

visibility 取值为 'visible' | 'invisible' | 'pending'

全局可见性(addGlobalVisibilityEventListener)

监听任意页面的可见性变化,用于统一埋点、统计等:

import Navigation from 'hybrid-navigation';

const subscription = Navigation.addGlobalVisibilityEventListener((sceneId, visibility) => {
  console.log(`scene ${sceneId} -> ${visibility}`);
});
subscription.remove();
上次更新: