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

React Native中useEffect内调用useTimer出现Invalid hook call错误如何解决

问题根源

你遇到的报错是违反了React Hook的核心调用规则:所有Hook必须在函数组件/自定义Hook的顶层作用域调用,不能嵌套在useEffect、条件判断、循环等逻辑块内。

解决方案

react-use-precision-timer提供的useTimer会返回计时器控制器,你只需要将useTimer提到useBreath自定义Hook的顶层调用,关闭自动启动,再在useEffect内手动触发计时器启动即可。

import React from "react";
import { View, Text } from "react-native";
import { useTimer } from "react-use-precision-timer";

const stateTransistions = {
  in: 'out',
  out: 'in'
}

export const useBreath = () => {
  const [breathState, setBreathState] = React.useState(stateTransistions.in)
  // 将useTimer移到Hook顶层调用
  const breathTimer = useTimer({
    startImmediately: false, // 关闭自动启动,手动控制启动时机
    runOnce: true,
    delay: 1000,
    // 用函数式更新避免闭包问题,不需要依赖breathState
    callback: () => {
      setBreathState(prevState => stateTransistions[prevState])
    },
  });

  React.useEffect(() => {
    // 每次呼吸状态变化后启动计时器
    breathTimer.start()
    // 组件卸载/状态更新前清理计时器,避免内存泄漏
    return () => breathTimer.stop()
  }, [breathState, breathTimer]);

  return {
    breathState,
  };
};

export default function TabOneScreen() {
  const { breathState } = useBreath()
  return (
    <View>
      <Text>{breathState}</Text>
    </View>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:30:05