javascript - 在组件状态和 props 中使用相同的变量名和 redux,我得到未定义的 props 错误

标签 javascript react-native react-redux react-props

我有一些组件需要知道用户是否使用 Facebook 登录,所以我使用函数 mapStateToProps 将 redux 状态映射到组件 props .
同时,一些组件可以自己登录用户,所以他们需要本地 state 来知道用户是否登录(我不能更新组件内部的组件属性本身)。

当用户登录时,他们会发送一个 loggedIn 事件。

这是最佳做法还是我做错了什么? 我有这样的组件:

import ...

const FBSDK = require('react-native-fbsdk');
const {
    LoginButton,
    AccessToken,
    LoginManager
} = FBSDK;

class Settings extends Component {

    constructor(props) {
        super(props);

        this.state = {
            isLoggedIn: false,
        };
    }

    componentDidMount () {
        this._loadInitialState();
    }

    async _loadInitialState() {
        AccessToken.getCurrentAccessToken().then(
            (data) => {
                if (data) {
                    this.setState({
                        isLoggedIn: true,
                    });

                    // Dispatch loggedIn action
                    this.props.loggedIn();
                }
            }
        );
    }

    render() {
        const {navigate} = this.props.navigation;

        return (
            <Content>
                <List style={styles.list}>
                    {this.state.isLoggedIn &&
                        <ListItem>
                            <Body>
                                ...
                            </Body>
                        </ListItem>
                    }
                    <ListItem style={styles.listItem}>
                        <LoginButton
                            readPermissions={["user_friends", "email"]}
                            onLoginFinished={
                                (error, result) => {
                                    if (error) {
                                        alert("login has error: " + result.error);
                                    } else if (result.isCancelled) {
                                        alert("login is cancelled.");
                                    } else {
                                        AccessToken.getCurrentAccessToken().then(
                                            (data) => {                                                                                                       this.setState({isLoggedIn: true});

                                                // Dispatch loggedIn action
                                                this.props.loggedIn();
                                            }
                                        ).catch(function(e) {
                                            log(e); // "oh, no!"
                                        });
                                    }
                                }
                            }
                            onLogoutFinished={() => {
                                this.setState({isLoggedIn: false});

                                // Dispatch loggedOut action
                                this.props.loggedOut();
                            }} />
                    </ListItem>
                </List>
            </Content>
        )
    }
}

Settings.propTypes = {
    isLoggedIn: PropTypes.bool.isRequired,
}

const mapStateToProps = (state) => {
    return {
        isLoggedIn: state.isLoggedIn,
    };
};

const mapDispatchToProps = (dispatch) => ({
    startup: () => dispatch(StartupActions.startup()),
    loggedIn: () => dispatch({
        type: LOGGED_IN
    }),
    loggedOut: () => dispatch({
        type: LOGGED_OUT
    })
});

export default connect(mapStateToProps, mapDispatchToProps, null, {pure: false})(Settings);

如您所见,该组件确实具有 isLoggedIn 本地状态和 isLoggedIn 属性,我需要同时更新两者。

我问的是实践以外的原因,当我使用 Facebook 登录用户时出现此错误(我没有寻找位置,但似乎某处 props未定义):

TypeError: Cannot read property 'loggedIn' of undefined

而且我不知道它发生的位置和原因,以及它是否取决于此代码。

最佳答案

您需要绑定(bind)您的方法以在 _loadInitialState 方法中访问 this

最简单的方法是使用箭头函数作为

 _loadInitialState = async() => {

一旦 setState 完成更新,也会在其回调方法中调度操作

this.setState({
    isLoggedIn: true,
 }, () => this.props.loggedIn()); 

onLogoutFinished={() => {
   this.setState({isLoggedIn: false}, () => this.props.loggedOut());
}}

关于javascript - 在组件状态和 props 中使用相同的变量名和 redux,我得到未定义的 props 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52395781/

相关文章:

javascript - JQuery 在使用 PHP 的 json_encode 时给出 JSON 语法错误

javascript - GitHub:如何在搜索对某些存储库有贡献的用户的帐户详细信息时避免超出搜索限制?

reactjs - React-Redux:调度时无限循环

react-native - 在 Redux 中,如何让状态生效?

reactjs - React 仅针对有省略号的文本显示 Material-UI 工具提示

javascript - 在 javascript 中检测屏幕上的虚拟键盘和横向

javascript - 如何计算两个元素之间的宽度?

javascript - 获得一个简单的滚动动画以在react-native中工作

react-native - navigator.geolocation.getCurrentPosition 在使用 React Native 的 iOS 模拟器中未触发

react-native - 如何在 React Native 的导航界面中隐藏标签栏?