[material-ui],[redux-from]选择动态选项

时间:2017-04-25 02:37:14

标签: reactjs material-ui redux-form

我从后端请求数据。数据是礼品数据和人员数据。

我的目标是实现连接礼物和人。每个人都会送礼物。

我使用material-uiredux-form包。

人员数据树如:

persons: "
        [ {
            name:'person1_name',
            userID:'person1_userID',
            hobbies: persondata -> the same to persons  
           },
           {
            name:'person2_name',
            userID:'person2_userID',
            hobbies: persondata -> the same to persons  
           }, 
           {
            name:'person3_name',
            userID:'person3_userID',
            hobbies: persondata -> the same to persons  
           }
          ]

我想得到这个结果:      我点击select,3(如果后端人数据是3人),则会显示人item(选项)。

我使用redux状态state.sendGood.driftMemberArray.formData来保存人员数据。

我的代码如下:

import React from 'react'
import {Field, FieldArray, reduxForm } from 'redux-form'
import { connect }   from 'react-redux'
import SelectField from 'material-ui/SelectField'
import MenuItem from 'material-ui/MenuItem'

const renderSelectField = ({ input, label, meta: { touched, error }, children, ...custom }) => (
    <SelectField
        floatingLabelText={label}
        errorText={touched && error}
        {...input}
        onChange={(event, index, value) => input.onChange(value)}
        children={children}
        {...custom}/>
)

const renderMembers = ({ fields, meta: { touched, error, submitFailed } }) => (
    <ul>
      {fields.map((member, index) =>
          <li key={index}>
            <Field name={`${member}.selectMan`} component={renderSelectField} label="select a man">
              {member.hobbies.map( (item,keyIndex) =>
                 <MenuItem  key={keyIndex} value={keyIndex} primaryText='hahah'/>
              )}
            </Field>
          </li>
      )}
    </ul>
)


let NextWeekDriftForm = (props) => {
  const { handleSubmit, pristine, reset, submitting} = props;
  return (
      <form onSubmit={handleSubmit}>
        <div>
          <FieldArray name="members"component={renderMembers}/>
        </div>
      </form>
  )
}

NextWeekDriftForm =  reduxForm({
  form: 'NextWeekDriftForm',     // a unique identifier for this form
  enableReinitialize: true,
})(NextWeekDriftForm)

export default NextWeekDriftForm =  connect(
    state => ({
      initialValues:state.sendGood.driftMemberArray.formData,
    })
) (NextWeekDriftForm)

结果,错误显示:

  

未捕获(承诺)TypeError:无法读取属性&#39; map&#39;未定义的

{member.hobbies.map( (item,keyIndex) => <MenuItem key={keyIndex} value={keyIndex} primaryText='hahah'/>

我的问题可能出在这段代码中。

我使用

  <MenuItem  value='09090' primaryText='hahah'/>
  <MenuItem  value='09090' primaryText='hahah'/>
  <MenuItem  value='09090' primaryText='hahah'/>

替换代码

 {member.hobbies.map( (item,keyIndex) =>
                     <MenuItem  key={keyIndex} value={keyIndex} primaryText='hahah'/>

浏览器呈现良好。

我想实现选择的动态选项。

无论如何,可以实现我的目标是可以的。 如果您在阅读我的描述后没有理解这个问题。我会再次编辑这个问题。

3 个答案:

答案 0 :(得分:1)

当app加载member.hobbies时,problably尚未定义。如果未定义,请尝试声明一个变量将此数组设置为null:

const hobbies = member.hobbies || []

然后:

{hobbies.map( (item,keyIndex) =>
                 <MenuItem  key={keyIndex} value={keyIndex} primaryText='hahah'/>

答案 1 :(得分:0)

您看,控制台显示hobbies未定义。从调试fields开始。 console.log(fields); renderMembersMKMapRectContainsPoint(self.mkMapView.visibleMapRect, MKMapPointForCoordinate(coordinate));后会看到什么?

答案 2 :(得分:0)

希望以下代码段对您有所帮助

{this.props.data.map((e, keyIndex) => {
return (<MenuItem key={keyIndex} value={e.warehouseId}>{e.name}</MenuItem>);

}) }