在 react-redux 展示组件中使用操作时遇到问题

IT技术 javascript reactjs react-native redux react-redux
2021-05-23 17:38:02

我是 redux 的新手,并且无法围绕展示和容器组件进行思考。

相关堆栈:

  • react v0.14.8
  • react-native v0.24.1
  • Redux v3.5.2
  • react-redux v4.4.5

问题:

我有一个登录按钮组件,它在呈现时检查登录状态并调用onSuccessfulLogin使用用户的 Facebook 凭据更新状态的操作。

但是,当尝试将其拆分为单独的展示/容器组件时,我无法调用 onSuccessfulLogin 操作:Error: onSuccessfulLogin is not defined

我在这里做错了什么?我想有一些简单的事情我不理解这两个组件和connect()函数之间的关系

展示组件 (Login.js)

import React, { PropTypes } from "react-native";
import FBLogin from "react-native-facebook-login";
import UserActions from "../users/UserActions";

class LoginPage extends React.Component {

    render() {

        const { userData, onSuccessfulLogin } = this.props;

        return (
          <FBLogin
              permissions={["email","user_friends"]}
              onLoginFound= { data => {
                  onSuccessfulLogin(data.credentials);
              }}
              />
        )
    }
};

export default LoginPage;

容器组件 (LoginContainer.js)

import { connect } from 'react-redux';
import LoginPage from "../login/LoginPage";
import UserActions from "../users/UserActions";

const mapDispatchToProps = (dispatch) => {
  return {
    onSuccessfulLogin: (userData) => {
      dispatch(UserActions.userLoggedIn(userData))
    }
  }
}

const mapStateToProps = (state) => {
  return {
    userData: state.userData
  }
}

const LoginContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(LoginPage);

export default LoginContainer;

另外,如果我想让组件state.userData可以访问更新LoginPage,我该怎么做?任何帮助表示赞赏!

解决了!使用 ES6 类时,您需要调用super(props)构造函数方法,以便在连接的表示组件中访问容器的属性:

class LoginPage extends React.Component {
    constructor(props){
        super(props);
    }

    render(){    
        // ...
    }
}
1个回答

您的容器组件应该是一个组件,并且它必须具有渲染功能以及您要渲染的哑/展示组件。

import { connect } from 'react-redux';
import LoginPage from "../login/LoginPage";
import UserActions from "../users/UserActions";


class LoginContainer extends React.Component {
    constructor(props){
      super(props);
    }
    render() {
        return (
          <LoginPage userData={this.props.userData}
              onSuccessfulLogin={this.props.onSuccessfulLogin}
              />
        )
    }
};

const mapDispatchToProps = (dispatch) => {
  return {
    onSuccessfulLogin: (userData) => {
      dispatch(UserActions.userLoggedIn(userData))
    }
  }
}

const mapStateToProps = (state) => {
  return {
    userData: state.userData
  }
}


export default connect(
  mapStateToProps,
  mapDispatchToProps
)(LoginPage);