反应本机参考子失败

时间:2019-02-24 12:35:26

标签: react-native firebase-realtime-database react-native-android

const { width: WIDTH } = Dimensions.get('window');
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth() + 1;
var yyyy = today.getFullYear();
if (dd < 10) {
    dd = '0' + dd;
}
if (mm < 10) {
    mm = '0' + mm;
}
today = mm + dd + yyyy;

class Attendance extends Component {
    state = {
        image: null,
        submit: false,
        loading: false,
        face: null,
        confidence: 0,
        class: '',
        flag: ''
    };
    async componentDidMount() {
        await Permissions.askAsync(Permissions.CAMERA);
        const { currentUser } = firebase.auth();
        firebase
         .database()
         .ref('users/')
         .child(currentUser.uid)
         .on('value', snap => 
            this.setState({ 
                face: snap.val().image,
                class: snap.val().stream_sem
            })
         );
    }
    render(){
        return(
            <View style={styles.Conatiner}>
                <Loader loading={this.state.loading} />
                {this.renderContent()}
            </View>
        );
    }
    renderContent = () =>  {
        firebase.database().ref('attendance')
        .child(this.state.class)
        .child(today)
        .on("value", snap => {
            this.setState({ flag: snap.val().flag});
        });
        if(this.state.flag === "0") {
            //**something**
        }
        else {
            //**something**
        }
    }
}

当我尝试写this.state.class时,它显示参考子项失败。 Here是我得到的错误详细信息。 我的Firebase数据库Picture在这里。你能告诉我我要去哪里错了。我想访问数据库的“标志”部分。 CSE8应该与用户stream_sem相匹配 提前谢谢您

1 个答案:

答案 0 :(得分:1)

第一次调用renderContent时,state.class为空字符串,请记住,firebase快照将异步加载。另外,不要在render方法调用的render函数中将侦听器附加到firebase上,否则最终会有很多侦听器。

您的逻辑应该类似于:

  1. 从Firebase获取用户数据
  2. 如果数据不为空,请设置状态
  3. state is set之后,从数据库获取出勤数据
  4. 适当设置状态

总是在将状态转移到dev之前编写粗略的算法(如果您已经知道,则忽略它)。学习愉快,干杯!