this.setState Не работает для моего собственного проекта React
На моем реагировать родное приложение, которое я разрабатываю this.setState не работает и не обновляет значение в конструкторе. но this.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>
);
}
}
3 ответа
this.setState()
является асинхронным, ваше обновленное значение теперь будет доступно сразу после его вызова.
когда setState()
После обновления значения вы сможете получить доступ к обновленным данным в своем render
функция под this.state.uType
,
Если вы хотите сразу использовать свое значение в своей функции, вы должны поместить его в другую переменную:
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
})
}
Это из-за асинхронной проблемы в setSate. Пусть кнопка показывается, когда данные, извлеченные из базы данных и состояний, становятся установленными. Вот ты где:
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>
);
}
}