在 React Native 中不能只调用一次函数?

Mar*_*ere 2 javascript apollo reactjs react-native expo

我有一个带有 GraphQL 服务器的 React Native 项目。我正在使用 Apollo Client 从我的 API 获取数据。我创建了这个简单的组件,它从路由参数中获取注册所需的所有数据(形成逐步注册),并进行突变以创建新商店。

export default function AuthRegisterStore({ navigation, route }) {
  const [
    register,
    { loading: validating, error: validationError, data: returnData },
  ] = useMutation(REGISTER, { onError: (e) => Alert.alert(String(e)) });

  const handleRegistration = () => {
    register({
      variables: {
        username: route.params.username,
        password: route.params.password,
        latitude: route.params.latitude,
        longitude: route.params.longitude,
      },
    });
  };

  handleRegistration()

  if (validating) {
    return <Loader />;
  }

  if (validationError) {
    return (
      <View style={styles.container}>
        <Text>Error</Text>
      </View>
    );
  }

  if (returnData) {
    navigation.navigate("Login", { message: "Te logueaste!" });
  }

  return null;
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
  },
});
Run Code Online (Sandbox Code Playgroud)

问题是该函数handleRegistration()被一次又一次调用,导致无限循环。我尝试过使用useEffect(),但由于某种原因它不会进行 API 调用。我缺少什么?

I'm*_*Too 7

是的 -handleRegistration()现在设置为在每次重新渲染时运行。如果您使用了useEffect,您可能没有包含依赖项数组(我将在一秒钟内向您展示),这也会导致它在每次重新渲染时运行。尝试这个:

useEffect(() => {
  handleRegistration()
}, [])
Run Code Online (Sandbox Code Playgroud)

注意 中的空数组useEffect。这告诉 React 只运行一次。您可以省略它(就像您可能所做的那样),它告诉 React 在每次组件重新渲染时运行它。或者您可以将参数传递到数组中,当这些特定参数发生变化时,该数组将监视并运行。