react本机和全局可访问的对象

IT技术 reactjs react-native
2021-05-13 01:30:47

我在使用 React Native 和能够从更深层次的函数中访问函数、变量和对象的时候真的很糟糕。老实说,我认为 Redux 是我的救星,但我也遇到了完全相同的障碍。一个例子:

export class Home extends React.Component {

static propTypes = {
    navigation: PropTypes.object,
    dispatch: Proptypes.func,
};

componentDidMount() {
    Firebase.init();
    firebase.auth().onAuthStateChanged((user) => {
        if (user) {
            this.setState({ loading: false, user });
            firebaseUserID = this.state.user.uid;
            this.props.dispatch(setUserID(firebaseUserID));
            firebaseRef = firebase.database().ref().child("Profiles").child(this.props.userID);
            firebaseRef.once("value").then(function(snapshot) {
                firebaseUserName = snapshot.child("Name").val();
                this.props.dispatch(setUserName(firebaseUserName));
                console.log('Logged in user: ' + this.props.userName);
            });
            this.props.navigation.navigate('Map');
        } else {
            this.props.navigation.navigate('Login');
        }
    });
}

在这个例子中,对我的 Redux 内容的第一次调用非常好:

this.props.dispatch(setUserID(firebaseUserID));

这会抓取正确的用户名并将其保存到我的 Redux 存储中。没问题。

错误在于这一行:

this.props.dispatch(setUserName(firebaseUserName));

因为它比上一个语句更深一层调用,所以“this”的上下文不同。它是下面子函数的一部分,所以 this.props 在这里不存在,尽管上面的四行是好的:

firebaseRef.once("value").then(function(snapshot) {

一旦我必须创建子功能(这是所有时间,因为这是代码的工作方式),我就无法访问使应用程序工作所需的所有资源。我一直在通过狡猾的变通方法和多余的变量重新创建来解决问题,但现在已经足够了,我需要它像普通语言一样正常工作。那么,我做错了什么?我应该如何创建对象、函数和变量以便我可以实际使用它们?

也许如果有人能帮我算出上面的具体例子,也许这会让我大开眼界,我应该如何前进。

谢谢大家,我相信对你们中的一些人来说这是一个明智的选择,但对我来说这是一堵我无法逾越的墙。

1个回答

根据MDN

箭头函数表达式的语法比函数表达式短,并且没有自己的this, arguments, super, or new.target.

由于您的函数firebaseRef.once("value").then(function(snapshot)不受约束,因此它正在丢失this.

因此,最简单的方法是使用箭头函数将其绑定为firebaseRef.once("value").then((snapshot) =>