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

如何在React类组件中调用函数式组件实现字体加载状态更新

方案1:抽离字体加载逻辑为公共函数,直接在App类组件中调用

这是最适配你现有类组件写法的方案,无需大幅改动现有App结构。
首先修改你的缓存逻辑文件,把字体加载逻辑单独抽离为可复用的异步函数:

// cache.js
import * as Font from 'expo-font';
import SplashScreen from 'expo-splash-screen';

// 抽离成独立的异步加载函数
export async function loadFontResources() {
  try {
    await SplashScreen.preventAutoHideAsync();
    await Font.loadAsync({
      // 此处填写你的字体配置,示例:
      // 'custom-font': require('./assets/fonts/CustomFont.ttf')
    });
  } finally {
    await SplashScreen.hideAsync();
  }
}

然后修改App.js文件:

import { loadFontResources } from './cache';

export class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      loaded: false,
      loggedIn: false, // 建议提前初始化该state,避免未定义报错
    };
  }

  async componentDidMount() {
    // 先执行字体加载逻辑,完成后更新状态
    await loadFontResources();
    this.setState({ loaded: true });

    // 原有登录状态监听逻辑保持不变
    firebase.auth().onAuthStateChanged((user) => {
      this.setState({
        loggedIn: !!user,
      });
    });
  }

  render() {
    const { loggedIn, loaded } = this.state;

    if (!loaded) {
      return null; // 也可以替换为自定义的启动屏占位UI
    }
    
    // 加载完成后渲染实际业务内容,可根据loggedIn判断跳转登录页还是首页
    return loggedIn ? <HomePage /> : <LoginPage />;
  }
}

方案2:保留组件形式,通过回调传递加载状态

如果你需要保留现有组件形式的写法,可以给Cache组件新增回调props,在App中渲染该组件并监听加载完成事件:
首先修改Cache组件:

export default function Cache({ onLoadComplete }) {
  const [isLoadingComplete, setLoadingComplete] = React.useState(false);

  React.useEffect(() => {
    async function loadResourcesAndDataAsync() {
      try {
        SplashScreen.preventAutoHideAsync();
        await Font.loadAsync({
          /// 此处填写你的字体配置
        });
      } finally {
        setLoadingComplete(true);
        SplashScreen.hideAsync();
        // 加载完成后触发回调
        onLoadComplete?.();
      }
    }

    loadResourcesAndDataAsync();
  }, [onLoadComplete]);

  // 加载过程中不渲染任何可视内容
  return null;
}

然后修改App.js的渲染逻辑:

import Cache from './Cache';

export class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      loaded: false,
      loggedIn: false,
    };
  }

  componentDidMount() {
    firebase.auth().onAuthStateChanged((user) => {
      this.setState({
        loggedIn: !!user,
      });
    });
  }

  // 字体加载完成的回调方法
  handleFontLoadComplete = () => {
    this.setState({ loaded: true });
  }

  render() {
    const { loggedIn, loaded } = this.state;

    if (!loaded) {
      return <Cache onLoadComplete={this.handleFontLoadComplete} />;
    }

    return loggedIn ? <HomePage /> : <LoginPage />;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:06:00