将redux-form迁移到v6,onBlur和onChange函数

时间:2016-07-21 13:48:46

标签: reactjs redux redux-form

我正在将redux-form迁移到最新版本6.0.0rc3。在这个版本中,'fields'数组消失了,并被Field组件替换(参见http://redux-form.com/6.0.0-rc.3/docs/MigrationGuide.md/)。我曾经在v5中扩展默认的onBlur函数,如下所示:

const { user_zipcode } = this.props.fields;
onChange={
  val => user_zipcode.onChange(this._handleZipcodeChange(val))
}

但是,在新版本中不能再这样做了,因为this.props.fields不存在。

根据我在文档中发现的内容,新方法应该是为每个具有不同功能的表单字段创建一个组件,并在那里扩展onBlur函数:

_onBlur() {
  // my custom blur-function
}

render() {
  const { input, touched, error } = this.props;
  return (
    <input
      className={styles.input}
      {...input}
      onBlur={() => {
        // 2 functions need to be called here
        this._onBlur();
        input.onBlur();
      }}
    />
  );
}

这很好,除了我需要为每个字段创建一个新元素,当模糊事件发生时需要做一些不同的事情。在某些领域,我必须调用API,我通过调度操作来完成。例如,我必须这样做才能得到一个地址。在这些组件中,我必须连接我的商店,因此它连接多次。

我尝试将自定义函数从父组件传递给Field组件,如下所示:

<Field
  type="text"
  name="user_zipcode"
  component={Zipcode}
  onBlurFunction={this._myBlurFunction}
/>

从道具中获取我的组件中的两个函数:

...
onBlur={() => {
  input.onBlurFunction();
  input.onBlur();
}}
...

由于新的React warning,这无效。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我最终为每个具有onChange或onBlur函数的表单字段创建了一个自定义组件。通过这种方式,您可以运行这两个函数,因此将调用所有默认的redux-form操作。

// Licenceplate-component

export default class Licenceplate extends Component {

    _handleBlur = ({ currentTarget: { value } }) => {
        // my blur function
    }

    render() {
        const {
          input,
          meta: { touched, error }
        } = this.props;

        return (
          <div className={styles.wrapper}>
            <input
              {...input}
              type="text"
              onBlur={
                e => input.onBlur(this._handleBlur(e))
              }
            />

         </div>
       );
   }
}


// In my form-component
<Field
    component={Licenceplate}
    name="car_licenceplate"
    type="text"
/>

答案 1 :(得分:0)

在文档中说明了这个

道具:对象[可选]

具有自定义道具的对象,用于将Field组件传递到提供给组件prop的组件中。这个道具将合并到Field本身提供的道具。如果您使用TypeScript,这可能很有用。这个结构是完全可选的;将props传递给组件的主要方法是直接将它们提供给Field组件,但是如果由于某种原因,您希望将它们捆绑到一个单独的对象中,则可以将它们传递给props。

<Field component={renderField} props={{ disabled: true }} />

http://redux-form.com/6.0.0-rc.3/docs/api/Field.md/

也许尝试那个。它可能会防止错误。或者在将函数prop传递给输入之前拉动它。