开发者问题收集

错误消息后更新状态 - Firebase - React Native

2020-04-04
145

我是 React 新手,在收到注册错误消息后,我尝试更新页面中的值。 我从一个空值开始,一旦收到新值,我就想将其显示在屏幕上。 当我尝试更新状态时,它给了我一个错误

TypeError: undefined is not an object (evaluating 'this.setState').

仅当我在 catch 中添加 this.setState({ error: errorMessage}) 时才会发生这种情况。

这是代码。

export default class Signup extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            email: '',
            password: '',
            error: ''
        };
    }


    signUpUser = (email, password) => {

        firebase.auth().createUserWithEmailAndPassword(email, password)
            .then(function (user) {
                console.log("Created new user " + user.user.providerData[0].uid)
            })
            .catch(function (error) {
                let errorCode = error.code;
                let errorMessage = error.message;
                console.log(errorCode)
                console.log(errorMessage)
                this.setState({error: errorMessage})

            })

    }

    render() {
        return(
            <View style={styles.container}>

                <Text>{this.state.error}</Text>
                <TextInput
                    style={styles.forms}
                    onChangeText={email => this.setState({ email })}
                    placeholder = "email"
                />
                <TextInput
                    style={styles.forms}
                    onChangeText={password => this.setState({ password })}
                    placeholder = "password"
                />
                <Button
                    title="SIGNUP"
                    onPress={() => this.signUpUser(this.state.email, this.state.password)}
                />


            </View>
        )
    }
}
2个回答

function() { ... } 中, this 的含义与该函数外部的含义不同。

最简单的解决方法是使用 => 符号来声明这些函数,就像您在其他地方所做的那样:

firebase.auth().createUserWithEmailAndPassword(email, password)
    .then((user) => {
        console.log("Created new user " + user.user.providerData[0].uid)
    })
    .catch((error) => {
        let errorCode = error.code;
        let errorMessage = error.message;
        console.log(errorCode)
        console.log(errorMessage)
        this.setState({error: errorMessage})
    })

另请参阅:

Frank van Puffelen
2020-04-04

使用箭头函数。

将您的代码更改为我的代码。

signUpUser = (email, password) => {

firebase.auth().createUserWithEmailAndPassword(email, password)
    .then(user => {
        console.log("Created new user " + user.user.providerData[0].uid)
    })
    .catch(error => {
        let errorCode = error.code;
        let errorMessage = error.message;
        console.log(errorCode)
        console.log(errorMessage)
        this.setState({error: errorMessage})

    })

>

Tarun Bhardwaj
2020-04-04