Redux表单如何在渲染之前渲染一个Field of Arrays?

时间:2017-07-02 16:08:21

标签: reactjs redux redux-form

我正在尝试用ReduxForm执行一个非常简单的例子,我在渲染之前有两个函数,但其​​中一个函数调用另一个函数作为组件道具,但是它是未定义的。我试图绑定它但它仍然不认识它。

这是我的代码:

import React, { Component } from 'react'
import { Field, FieldArray, reduxForm } from 'redux-form'

class Page4 extends Component {
  constructor(props) {
   super(props)
   this.simpleField.bind(this)
  }

  simpleField(field) {
  const { meta }  = field
  return (
    <div className='form-group'>
      <label>{field.label}</label>
      <input
        className='form-control'
        {...field.input}
      />
    </div>
  )
 }
  // This function cannot reach the simpleField component
  myFields(field) {
    let optiosArray = [
      {'label':'Option 1', 'value':'1'},
      {'label':'Option 2', 'value':'2'}
     ]
    return(
      optionsArray.map((option, key) => {
        <Field
          label= {option.label}
          value= {option.value}
          name={option.value}
          component={this.simpleField}
        />
      })
    )
  }

render() {
  return (
    <div>
      <FieldArray
        name='test'
        label='label'
        component={this.myFields}
      />
   </div>
  )  
 }
}

const validate = (value) => {
 const errors = ''
 return errors
}

export default reduxForm({
 validate,
 form: 'Page4'
})(Page4)

2 个答案:

答案 0 :(得分:0)

你确实绑定了错误的功能。您正试图访问this功能中的myFields()。因此,你必须绑定这个而不是simpleField()

你必须在构造函数中绑定你的方法ether:

class Page4 extends Component {
    constructor(props) {
        super(props);
        this.myFields.bind(this);
    }

    myFields(...) {
        ....
    }
}

或者如果您使用babel和ES6,则可以使用箭头功能。这样它将自动绑定:

class Page4 extends Component {
    myFields = (field) => {
        ....
    };
}

不要在渲染周期中绑定函数,因为这意味着您将在每个渲染上创建一个新的回调。

答案 1 :(得分:0)

要访问this.simpleFields,在构造函数中绑定this.myFields就足够了。

 constructor(props) {
   super(props)
   this.myFields = this.myFields.bind(this)
  }

this.myFields = this.myFields.bind(this)

我认为您错误地使用了FieldArray。我修改了代码,以便让您了解FieldArray应该如何使用。在这里工作jsFiddle - https://jsfiddle.net/sherin81/4u3hk7kg/

class Page4 extends Component {
  constructor(props) {
   super(props)
   this.myFields = this.myFields.bind(this)
  }

   simpleField = (field) => {
    const { input: { value } } = field
        return (
        <div className='form-group'>
          <input type="text" name={field.input.name} onChange={field.input.onChange} value={value} />  
        </div>
      )
 }

  myFields({ fields }) {
        return (<div>{fields.map((option, key) => {
        return (<div key={key}>
          <Field
            name={option}
            component={this.simpleField}
          />
        </div>)
      })}</div>)
    }

render() {
  return (
    <div>
      <FieldArray
        name='listOfTextFields'
        component={this.myFields}
      />
   </div>
  )  
 }
}

const validate = (value) => {
 const errors = ''
 return errors
}

const MyTextFields = reduxForm({
 validate,
 form: 'Page4'
})(Page4)

在调用组件时,您应该执行以下操作。

<MyTextFields initialValues={{ listOfTextFields: [ 'Text 1','Text 2' ] }}/>