简体   繁体   English

this.setState不适用于我的React本机项目

[英]this.setState Not working for my React native Project

On my react native app which i am developing this.setState is not working and not updating the value in the constructor . 在我正在开发this.setState的我的本机应用程序上,它没有工作并且没有更新构造函数中的值。 but this.state({}) is working. 但是this.state({})正在工作。 but when i am using that it is reseting the constructor Anyone please point what is wrong in this code 但是当我使用它正在重置构造函数的时候,任何人请指出这段代码有什么问题

import React from 'react';
import { StyleSheet, Text, View, TouchableOpacity, TextInput, Image } from 'react-native';
import { RkTextInput, RkButton } from 'react-native-ui-kitten';
import * as firebase from 'firebase';

export default class Home extends React.Component {
    constructor(props) {
        super(props)

        this.state = {
            uType: 'normal',
            AdminNavbutton: ''
        }
    }

    ProfileSubmithandler = () => {
        alert(this.state.uType + " " + this.state.AdminNavbutton)
    }

    componentDidMount() {
        this.readUserData();
    }

    readUserData = () => {
        userstype = 'users/' + firebase.auth().currentUser.uid + '/userType'

        firebase.database().ref(userstype).once('value').then(snapshot => {
            this.setState({ uType: snapshot.val() }) // notworking and not updating uType
            alert(snapshot.val()) //working Properly
        })

    }

    emailid = () => {

    }

    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.titleText}>Taams</Text>
                <Text style={styles.edition}>Developer's Edition</Text>
                <Text style={styles.titleText}>Home</Text>
                <Text>Alpha 0.0.0.1</Text>
                <RkButton onPress={() => this.ProfileSubmithandler()}>
                    <Text style={styles.LoginButtonText}>Submit</Text>
                </RkButton>
                <TouchableOpacity onPress={() => this.props.navigation.navigate(this.state.AdminNavbutton)}><Text style={styles.signinButton}>Profile</Text></TouchableOpacity>
            </View>
        );
    }
}

this.setState() is asynchronous, your updated value will now be available right after calling it. this.setState()是异步的,您更新后的值现在将在调用后立即可用。

When setState() is done updating your value, you will be able to access the updated data in your render function under this.state.uType . 完成setState()的更新值后,您将可以在this.state.uType下的render函数中访问更新的数据。

If you wan to use your value right away in your function, you should put it in an other variable : 如果您想立即在函数中使用值,则应将其放在另一个变量中:

readUserData = () => {
    userstype = 'users/' + firebase.auth().currentUser.uid + '/userType'

    firebase.database().ref(userstype).once('value').then(snapshot => {
        const uType = snapshot.val()
        this.setState({ uType }) // notworking and not updating uType
        alert(snapshot.val()) //working Properly
        alert(uType) // Also working
    })

}

您忘记为“ userstype”声明变量了-第25行

It is because of asyncrouse problem in setSate. 这是由于setSate中的异步问题。 Let the button shown when the data extracted from firebase and states becomes set. 当设置从Firebase和状态提取的数据时,让该按钮显示。 Here you are: 这个给你:

           import React from 'react';
                    import { StyleSheet, Text, View, TouchableOpacity, TextInput, Image } from 'react-native';
                    import {RkTextInput, RkButton } from 'react-native-ui-kitten';
                    import * as firebase from 'firebase';



                    export default class Home extends React.Component {
                      constructor(props){
                        super(props)

                        this.state={
                          uType:'normal',
                          AdminNavbutton:false,
                        }
                      }

                      ProfileSubmithandler=()=>{
                        alert(this.state.uType + " " + this.state.AdminNavbutton)


                      }
                      componentDidMount() {
                        this.readUserData();
                      };

                      readUserData=()=> {
                        userstype= 'users/'+ firebase.auth().currentUser.uid + '/userType'

                        firebase.database().ref(userstype).once('value').then(snapshot => {
                            this.setState({ uType: snapshot.val() }) // notworking and not updating uType
                            alert(snapshot.val()) //working Properly
                        })

                        }
                        emailid=()=>{
                        }


                      render() {
                        return (

                          <View style={styles.container}>
                            <Text style={styles.titleText}>Taams</Text>
                            <Text style={styles.edition}>Developer's Edition</Text>
                            <Text style={styles.titleText}>Home</Text>
                            <Text>Alpha 0.0.0.1</Text>
                         {
                          this.state.AdminNavbutton &&
                            <RkButton onPress = {()=>this.ProfileSubmithandler()}>
                              <Text style={styles.LoginButtonText}>Submit</Text>
                            </RkButton>



                        <TouchableOpacity onPress={()=>this.props.navigation.navigate(this.state.AdminNavbutton)}><Text style={styles.signinButton}>Profile</Text></TouchableOpacity>
                        }
                          </View>
                        );
                      }
                    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM