【问题标题】:Too many re-renders in react native app, what can I do?反应原生应用程序中的重新渲染太多,我该怎么办?
【发布时间】:2020-09-30 12:39:40
【问题描述】:

我有一个带有 expo-client 的 react native 应用程序并给出了太多的重新渲染错误我将发布文件,请注意我使用 react-native-paper

这是 App.js,它是应用程序的包装器

import React from "react";
import { Provider as PaperProvider, DefaultTheme } from "react-native-paper";
import { StatusBar } from "expo-status-bar";
import Homescreen from "./views/screens/homescreen";
//import { SafeAreaView, Text } from "react-native";

export default function App() {
  return (
    <PaperProvider theme={theme}>
      <Homescreen />
      <StatusBar />
    </PaperProvider>
  );
}
const theme = {
  ...DefaultTheme,
};

这是主屏幕,它是登录和注册组件的包装器

import React from "react";
import { View } from "react-native";
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import SignUp from "../components/signup";
import Login from "../components/login";
import { Button } from "react-native-paper";

export default function Homescreen({ navigation }) {
  const Stack = createStackNavigator();
  return (
    <View>
      <Button onPress={() => navigation.navigate("SignUp")}>SignUp</Button>
      <Button onPress={() => navigation.navigate("LogIn")}>Login</Button>
      <NavigationContainer>
        <Stack.Navigator>
          <Stack.Screen name="SignUp" component={SignUp} />
          <Stack.Screen name="LogIn" component={Login} />
        </Stack.Navigator>
      </NavigationContainer>
    </View>
  );
}

有非常相同的注册和登录组件

import React, { useState } from "react";
import { View } from "react-native";
import { TextInput, Button } from "react-native-paper";

export default function SignUp() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const signUp = (t1, t2) => {
    setEmail("");
    setPassword("");
  };
  const changeEmailHandler = (e) => {
    setEmail(e.target.value);
  };
  const changePasswordHandler = (e) => {
    setPassword(e.target.value);
  };
  return (
    <View>
      <TextInput
        mode="outlined"
        left
        label="email"
        placeholder="Enter your email: "
        onChangeText={changeEmailHandler}
        value={email}
      />
      <TextInput
        mode="outlined"
        left
        label="password"
        placeholder="Enter your password: "
        onChangeText={changePasswordHandler}
        value={password}
        type="password"
      />
      <Button
        icon="arrow-right-alt"
        mode="contained"
        onClick={signUp(email, password)}
      >
        Join us now
      </Button>
    </View>
  );
}
import React, { useState } from "react";
import { View } from "react-native";
import { TextInput, Button } from "react-native-paper";

export default function Login() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const logIn = (t1, t2) => {
    setEmail("");
    setPassword("");
  };
  const changeEmailHandler = (e) => {
    setEmail(e.target.value);
  };
  const changePasswordHandler = (e) => {
    setPassword(e.target.value);
  };
  return (
    <View>
      <TextInput
        mode={outlined}
        left
        label="email"
        placeholder="Enter your email: "
        onChangeText={changeEmailHandler}
        value={email}
      />
      <TextInput
        mode={outlined}
        left
        label="password"
        placeholder="Enter your password: "
        onChangeText={changePasswordHandler}
        value={password}
        type="password"
      />
      <Button
        icon="arrow-right-alt"
        mode="contained"
        onClick={logIn(email, password)}
      ></Button>
    </View>
  );
}

这是应用栏组件

import React from "react";
import { View } from "react-native";
import { Appbar } from "react-native-paper";

export default function CustomAppBar() {
  return (
    <View>
      <Appbar>
        <Appbar.Header>
          <Appbar.Content title="Date Planner" />
        </Appbar.Header>
      </Appbar>
    </View>
  );
}

【问题讨论】:

    标签: javascript reactjs react-native react-hooks react-native-paper


    【解决方案1】:

    &lt;Button&gt; 中的onClick 事件是问题所在。它在每次渲染时调用signUp(email, password),这会导致无限循环,因为在内部调用setPassword。而在onClick 中,您可以传递回调,请参阅下面的建议。

    您需要将您的按钮修改为:

    <Button
            icon="arrow-right-alt"
            mode="contained"
            onClick={() => signUp(email, password)}
          >
            Join us now
    </Button>
    

    这样signUp函数只会在点击事件时被调用。

    根据评论还需要更改onClick={logIn(email, password)} 以及与上面建议的类似。

    【讨论】:

    • 而onClick={logIn(email, password)}需要改成onClick={() => logIn(email, password)}
    • @AnhDevit 谢谢,刚刚根据您的评论更新了我的答案!
    • 谢谢,它起作用了,但是当我输入它时,它给了我 e 未定义 e.target.value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2019-08-09
    • 2021-12-28
    • 2021-03-10
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多