反应原生和全球可访问的对象

时间:2018-05-07 07:56:09

标签: reactjs 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.props不存在于这里,即使它上面的四行很好:

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

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

也许如果有人可以帮我解决上面的具体例子,也许这会让我看到我应该如何前进。

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

1 个答案:

答案 0 :(得分:2)

根据MDN

  

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

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

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