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

Reactjs 此.setState不适用于我的React本机项目,reactjs,react-native,setstate,Reactjs,React Native,Setstate,在我正在开发的react本机应用程序上,this.setState不起作用,并且未更新构造函数中的值。但是这个.state({})正在工作。但是当我使用它重置构造函数时,请指出代码中的错误 import React from 'react'; import { StyleSheet, Text, View, TouchableOpacity, TextInput, Image } from 'react-native'; import { RkTextInput, RkButton } from

在我正在开发的react本机应用程序上,this.setState不起作用,并且未更新构造函数中的值。但是这个.state({})正在工作。但是当我使用它重置构造函数时,请指出代码中的错误

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>
        );
    }
}
从“React”导入React;
从“react native”导入{样式表、文本、视图、TouchableOpacity、TextInput、图像};
从“react native ui kitten”导入{RkTextInput,RkButton};
从“firebase”导入*作为firebase;
导出默认类Home扩展React.Component{
建造师(道具){
超级(道具)
此.state={
uType:'正常',
AdminNavbutton:“”
}
}
ProfileSubmithandler=()=>{
警报(this.state.uType+“”+this.state.AdminNavbutton)
}
componentDidMount(){
此参数为.readUserData();
}
readUserData=()=>{
userstype='users/'+firebase.auth().currentUser.uid+'/userType'
firebase.database().ref(userstype).once('value')。然后(snapshot=>{
this.setState({uType:snapshot.val()})//不工作且不更新uType
警报(snapshot.val())//工作正常
})
}
emailid=()=>{
}
render(){
返回(
塔姆斯
开发者版
家
阿尔法0.0.0.1
this.ProfileSubmithandler()}>
提交
this.props.navigation.navigate(this.state.AdminNavbutton)}>Profile
);
}
}
此.setState()
是异步的,您的更新值在调用后立即可用

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>
        );
    }
}
setState()
完成值更新后,您将能够在
this.state.uType
下的
render
函数中访问更新的数据

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>
        );
    }
}
如果要立即在函数中使用值,则应将其放入其他变量中:

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>
        );
    }
}
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
    })

}
this.setState()
是异步的,您的更新值现在在调用它后立即可用

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>
        );
    }
}
setState()
完成值更新后,您将能够在
this.state.uType
下的
render
函数中访问更新的数据

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>
        );
    }
}
如果要立即在函数中使用值,则应将其放入其他变量中:

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>
        );
    }
}
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
    })

}

这是因为SetState中存在异步问题。设置从firebase提取的数据和状态时,显示按钮。给你:

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>
        );
    }
}
           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>
                        );
                      }
                    }
从“React”导入React;
从“react native”导入{样式表、文本、视图、TouchableOpacity、TextInput、图像};
从“react native ui kitten”导入{RkTextInput,RkButton};
从“firebase”导入*作为firebase;
导出默认类Home扩展React.Component{
建造师(道具){
超级(道具)
这个州={
uType:“正常”,
AdminNavbutton:false,
}
}
ProfileSubmithandler=()=>{
警报(this.state.uType+“”+this.state.AdminNavbutton)
}
componentDidMount(){
此参数为.readUserData();
};
readUserData=()=>{
userstype='users/'+firebase.auth().currentUser.uid+'/userType'
firebase.database().ref(userstype).once('value')。然后(snapshot=>{
this.setState({uType:snapshot.val()})//不工作且不更新uType
警报(snapshot.val())//工作正常
})
}
emailid=()=>{
}
render(){
返回(
塔姆斯
开发者版
家
阿尔法0.0.0.1
{
this.state.AdminNavbutton&&
this.ProfileSubmithandler()}>
提交
this.props.navigation.navigate(this.state.AdminNavbutton)}>Profile
}
);
}
}

这是因为SetState中存在异步问题。设置从firebase提取的数据和状态时,显示按钮。给你:

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>
        );
    }
}
           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>
                        );
                      }
                    }
从“React”导入React;
从“react native”导入{样式表、文本、视图、TouchableOpacity、TextInput、图像};
从“react native ui kitten”导入{RkTextInput,RkButton};
从“firebase”导入*作为firebase;
导出默认类Home扩展React.Component{
建造师(道具){
超级(道具)
这个州={
uType:“正常”,
AdminNavbutton:false,
}
}
ProfileSubmithandler=()=>{
警报(this.state.uType+“”+this.state.AdminNavbutton)
}
componentDidMount(){
此参数为.readUserData();
};
readUserData=()=>{
userstype='users/'+firebase.auth().currentUser.uid+'/userType'
firebase.database().ref(userstype).once('value')。然后(snapshot=>{