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

如何将setState函数作为参数传入其他函数?附代码重构需求

重构方案:将认证函数抽离并传入setState

1. 在handlers文件中定义抽离后的函数

新建(或修改)handlers/auth.ts文件,把原函数的依赖项(setLoading、navigation、email)都作为参数传入,同时补全TypeScript类型:

// handlers/auth.ts
import { NavigationProp } from '@react-navigation/native';
// 假设你的导航栈类型是RootStackParamList,根据实际项目调整
import { RootStackParamList } from '../navigation/types';

export const handleSignIn = async (
  email: string,
  setLoading: React.Dispatch<React.SetStateAction<boolean>>,
  navigation: NavigationProp<RootStackParamList>
) => {
  setLoading(true);
  const { error } = await supabase.auth.signInWithOtp({ email });

  if (error) {
    console.log(error);
    setLoading(false);
  } else {
    setLoading(false);
    // 原代码中的userEmail替换为传入的email即可,若需组件内其他状态也可作为参数传入
    navigation.navigate('VerifyOtp', { email });
  }
};

2. 在组件中调用抽离后的函数

在屏幕组件中导入该函数,在需要触发认证的场景(比如按钮点击)调用时,传入组件内的setLoading、navigation实例和用户输入的email:

// 你的屏幕组件文件
import { handleSignIn } from '../handlers/auth';
import { useState } from 'react';
import { useNavigation } from '@react-navigation/native';

const SignInScreen = () => {
  const [loading, setLoading] = useState(false);
  const [email, setEmail] = useState('');
  const navigation = useNavigation();

  const onSignInPress = () => {
    handleSignIn(email, setLoading, navigation);
  };

  // 组件渲染逻辑...
};

关键说明

  • setLoading是React返回的状态更新函数,可直接作为参数传递,它在组件生命周期内是稳定的,无需额外用useCallback包裹(除非组件存在频繁重渲染场景)。
  • 如果原函数还有其他状态依赖(比如错误提示的setError),只需在函数参数中添加对应的状态更新函数即可,逻辑和setLoading完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:20:30