如何导出 mapStateToProps 和 Redux 表单?

Posted

技术标签:

【中文标题】如何导出 mapStateToProps 和 Redux 表单?【英文标题】:How to export mapStateToProps and Redux Form? 【发布时间】:2017-03-08 20:04:44 【问题描述】:

我正在使用 Redux Form(版本 6)作为登录页面。我想做的是当用户填写表单并单击提交时,从我的状态中获取文本,以便我最终可以使用该电子邮件和密码发送操作。但是,我在使用 react-redux 和 Redux Form 的连接时导出这个组件时遇到了问题。

使用 react-redux,connect 在将 state 映射到 props 时想要像这样被导出:

导出默认连接(mapStateToProps)(LogInForm)

但是,Redux Form 希望它的导出设置如下:

export default reduxForm(
  form: 'LogInForm',
  validate,
)(LogInForm);

有没有办法将这两者结合起来?我试过类似的东西:

const reduxFormConfig = reduxForm(
  form: 'LogInForm',
  validate,
);

export default connect(mapStateToProps)(ReduxFormConfig)(LogInForm)

但它不起作用。

或者也许这是处理此问题的更好方法?这是我的组件中的完整代码:

import React from 'react';
import  connect  from 'react-redux';
import  Field, reduxForm  from 'redux-form';
import InputField from '../InputField';
import  validateLogInSignUp as validate  from '../../utils/validateForms.js';

const LogInForm = (props) => 
  const 
    handleSubmit,
    pristine,
    submitting,
   = props;

  return (
    <div>
      <form onSubmit=handleSubmit>
        <Field
          name="email"
          type="email"
          component=InputField
          label="email"
        />
        <Field
          name="password"
          type="password"
          component=InputField
          label="password"
        />
        <div>
          <button type="submit" disabled=submitting>Submit</button>
        </div>
      </form>
    </div>
  );
;

const mapStateToProps = state => 
  return 
    loginInput: state.form,
  ;
;

// export default connect(mapStateToProps)(LogInForm)

// export default reduxForm(
//  form: 'LogInForm',
//  validate,
// )(LogInForm);

非常感谢任何和所有的帮助。谢谢!

【问题讨论】:

【参考方案1】:

你可以试试这个:

import React from 'react';
import  connect  from 'react-redux' ;
import  reduxForm  from 'redux-form';

class Example extends React.Component 
    ...


function mapStateToProps(state) 
    return  ... 


function mapDispatchToProps(dispatch) 
    return  ... 


export default connect(mapStateToProps, mapDispatchToProps)(reduxForm(
      form: 'formname',
      validate
)(Example));

【讨论】:

您能补充一点说明您的代码 sn-p 是如何解决问题的吗?这样你的答案就变得更有用了。 这应该是公认的答案,因为它是更简单的方法【参考方案2】:

有多个线程有相同的问题。 I recently posted my take with my solution here 但有一些变化。

    我使用了基于类的组件而不是基于函数的组件。我找到了专门实现这种方式的指南,并解释了 react-redux 的 connect 方法使其成为高阶组件,因此最好与类实例一起使用。

    正如@doncredas所说,reduxForm和react-redux的connect方法应该分开实现,但是我的实现如下:

    function mapStateToProps(state) 
        return  form: state.form ;
    
    
    Signin = connect(mapStateToProps, actions)(Signin);
    Signin = reduxForm(
     form: 'signin'
    )(Signin);
    export default Signin;
    

[稍后添加]另一个变体可以是:

const form = reduxForm( form: 'signin' );
export default connect(mapStateToProps, actions)(form(Signin));

【讨论】:

【参考方案3】:

在 reduxForm v6 中还有一种方法可以将这两者结合起来:

reduxForm(
  form: 'LogInForm',
  validate,
)(LogInForm);

export default connect(mapStateToProps)(LogInForm)

方法如下:

import React,  Component  from 'react';
import  connect  from 'react-redux

class LogInForm extends Component 
    ...


function mapStateToProps(state) 
    return  ... 


function mapDispatchToProps(dispatch) 
    return  ... 


// First decorate your component with reduxForm
LogInForm = reduxForm(
  form: 'LogInForm',
  validate,
)(LogInForm);

// Then connect the whole with the redux store
export default connect(mapStateToProps, maDispatchToProps)(LogInForm)

【讨论】:

【参考方案4】:

使用redux-form,您不需要直接在LoginForm 中访问状态。相反,您应该在提交表单时访问父组件中的值:

// LoginForm.js
const LogInForm = (props) => 
  ...
;

export default reduxForm(
  form: 'LogInForm',
  validate,
)(LogInForm);


// Parent.js
import LoginForm from './LoginForm';

const handleSubmit = (values) => 
  alert(JSON.stringify(values));  //  email: 'foo@bar.com', password: '1forest1' 
;

const Parent = (props) => 
  return (
    <LoginForm onSubmit= handleSubmit  />
  );
;

有关简单表单的更完整示例,请参阅https://github.com/erikras/redux-form/blob/master/examples/simple/src/index.js#L42。

【讨论】:

但是如果用户刷新了页面呢?!我仍然看到在某些情况下通过 reduxForm 访问 reduxStore/state 很重要。 不,即使在你的例子中你也不应该这样做。

以上是关于如何导出 mapStateToProps 和 Redux 表单?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 mapDispatchToProps 中 mapStateToProps 添加的属性?

如何在 mapStateToProps 中使用 useParams?

我如何在类函数中获取 mapStateToProps 道具

如何使用 Jest - Enzyme 测试 React 中 mapStateToProps 中的方法

如何将 mapStateToProps / redux 添加到 react-navigation TabNavigator?

React-redux mapStateToProps,mapDispatchToProps 如何使用