【问题标题】:Trouble using actions in react-redux presentational component在 react-redux 演示组件中使用操作时遇到问题
【发布时间】:2016-09-11 02:36:03
【问题描述】:

我是 redux 的新手,无法理解展示和容器组件。

相关堆栈:

  • 反应 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;

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

已解决!当使用 ES6 类时,您需要在构造方法中调用 super(props) 才能访问连接的展示组件中的容器属性:

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

    render(){    
        // ...
    }
}

【问题讨论】:

    标签: javascript reactjs react-native redux react-redux


    【解决方案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);
    

    【讨论】:

    • 我有点困惑,因为在 redux 文档 (redux.js.org/docs/basics/ExampleTodoList.html) 上,他们有一个不渲染任何内容的容器 (containers/VisibleTodoList.js)。有什么区别?
    • hm ...这是一个基本示例,他们仅使用容器来注入状态和操作,这并不常见,更真实的示例检查github.com/reactjs/redux/tree/master/examples/real-world
    • 您好 QoP,感谢您的回复 :) 为什么我的示例中的代码不能仅用于注入状态和操作?
    • 其实,我用你的例子就知道了。我没有将属性提供给连接的组件。我需要在类构造函数中调用super(props)。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2019-11-12
    • 1970-01-01
    • 2019-07-20
    • 2020-10-04
    • 1970-01-01
    • 2020-09-07
    • 2014-12-03
    相关资源
    最近更新 更多