[英]Invalid Hook Call React Native
我不斷在我的注冊屏幕上收到此錯誤。 如果您能告訴我問題所在,我將不勝感激。 謝謝!
錯誤:無效的掛鈎調用。 鈎子只能在 function 組件的主體內部調用。 這可能由於以下原因之一而發生:
- 你可能有不匹配的 React 版本和渲染器(例如 React DOM)
- 您可能違反了 Hooks 規則
- 您可能在同一個應用程序中擁有多個 React 副本,請參閱 https: //fb me/react-invalid-hook-call 以獲取有關如何調試和修復此問題的提示。
import { ImageBackground, StyleSheet, StatusBar, Dimensions, View, Image } from 'react-native';
import { Block, Button, Text, theme } from 'galio-framework';
import * as Yup from 'yup';
import SafeView from '../components/SafeView';
import Form from '../components/Forms/Form';
import FormField from '../components/Forms/FormField';
import FormButton from '../components/Forms/FormButton';
import IconButton from '../components/IconButton';
import FormErrorMessage from '../components/Forms/FormErrorMessage';
import { registerWithEmail } from '../config/firebase';
const { height, width } = Dimensions.get('screen');
const validationSchema = Yup.object().shape({
name: Yup.string()
.required()
.label('Name'),
email: Yup.string()
.required('Please enter a valid email')
.email()
.label('Email'),
password: Yup.string()
.required()
.min(6, 'Password must have at least 6 characters')
.label('Password'),
confirmPassword: Yup.string()
.oneOf([Yup.ref('password')], 'Confirm Password must match Password')
.required('Confirm Password is required')
});
const [passwordVisibility, setPasswordVisibility] = useState(true);
const [rightIcon, setRightIcon] = useState('eye');
const [confirmPasswordIcon, setConfirmPasswordIcon] = useState('eye');
const [confirmPasswordVisibility, setConfirmPasswordVisibility] = useState(true);
const [registerError, setRegisterError] = useState('');
function handlePasswordVisibility() {
if (rightIcon === 'eye') {
setRightIcon('eye-off');
setPasswordVisibility(!passwordVisibility);
} else if (rightIcon === 'eye-off') {
setRightIcon('eye');
setPasswordVisibility(!passwordVisibility);
}
}
function handleConfirmPasswordVisibility() {
if (confirmPasswordIcon === 'eye') {
setConfirmPasswordIcon('eye-off');
setConfirmPasswordVisibility(!confirmPasswordVisibility);
} else if (confirmPasswordIcon === 'eye-off') {
setConfirmPasswordIcon('eye');
setConfirmPasswordVisibility(!confirmPasswordVisibility);
}
}
async function handleOnSignUp(values, actions) {
const { email, password } = values;
try {
await registerWithEmail(email, password);
} catch (error) {
setRegisterError(error.message);
}
}
export default class Register extends React.Component {
render() {
const { navigation } = this.props;
return (
<SafeView style={styles.container}>
<Form
initialValues={{
name: '',
email: '',
password: '',
confirmPassword: ''
}}
validationSchema={validationSchema}
onSubmit={values => handleOnSignUp(values)}
>
<FormField
name="name"
leftIcon="account"
placeholder="Enter name"
autoFocus={true}
/>
<FormField
name="email"
leftIcon="email"
placeholder="Enter email"
autoCapitalize="none"
keyboardType="email-address"
textContentType="emailAddress"
/>
<FormField
name="password"
leftIcon="lock"
placeholder="Enter password"
autoCapitalize="none"
autoCorrect={false}
secureTextEntry={passwordVisibility}
textContentType="password"
rightIcon={rightIcon}
handlePasswordVisibility={handlePasswordVisibility}
/>
<FormField
name="confirmPassword"
leftIcon="lock"
placeholder="Confirm password"
autoCapitalize="none"
autoCorrect={false}
secureTextEntry={confirmPasswordVisibility}
textContentType="password"
rightIcon={confirmPasswordIcon}
handlePasswordVisibility={handleConfirmPasswordVisibility}
/>
<FormButton title={'Register'} />
{<FormErrorMessage error={registerError} visible={true} />}
</Form>
<IconButton
style={styles.backButton}
iconName="keyboard-backspace"
color={Colors.white}
size={30}
onPress={() => navigation.goBack()}
/>
</SafeView>
);
}
}
const styles = StyleSheet.create({
container: {
padding: 15,
},
backButton: {
justifyContent: 'center',
alignItems: 'center',
marginVertical: 10
}
});```
您正在混合基於功能和 class 的組件。 React Hooks 只能在功能組件內部使用。 將您的Register
組件轉換為功能組件,並將所有useState
調用移動到組件內。
正如錯誤所暗示的,您沒有正確使用鈎子。 鈎子需要在功能組件內部。 目前,您在沒有組件的情況下使用它們。 您在這里擁有的唯一組件是 class 組件,因此如果您想使用鈎子,您需要先將其轉換為功能組件,如下所示:
import React, { useState } from 'react';
const Register = (props) => {
const [passwordVisibility, setPasswordVisibility] = useState(true);
const [rightIcon, setRightIcon] = useState('eye');
const [confirmPasswordIcon, setConfirmPasswordIcon] = useState('eye');
const [confirmPasswordVisibility, setConfirmPasswordVisibility] = useState(true);
const [registerError, setRegisterError] = useState('');
// other component logic code here
return (
// your component rendering code here
);
}
export default Register;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.