redux-form字段值是否可以保存对象而不仅仅是字符串?

时间:2016-04-28 12:53:38

标签: reactjs redux redux-form

redux-form字段值是否可以保存对象而不仅仅是字符串?

考虑以下示例

    class SelectQuestions extends Component{
          render(){
    const {fields:{question1,question2},handleSubmit}=this.props;
    return <div>
    <form onSubmit={handleSumbit(this.handleFunction.bind(this))}>
        <SelectQuestion {...question1}/>
        <SelectQuestion {...question1}/>
       <button type="submit" className="btn btn-default">Submit</button>
    </form>
    </div>
    }
    }
class SelectQuestion extends Component{

render (){

 <select></select> 
}    

}

&#39; SelectQuestion&#39;需要一系列问题,每个问题都有问题ID和问题名称。

一旦用户选择了我想要返回QuesionId和QuesitonName的问题。如何在反应中使用redux-form实现它

5 个答案:

答案 0 :(得分:5)

<强> TL:DR

是的它可以容纳一个物体。看看这个例子: https://codesandbox.io/s/vq6k6195rl

<强>解释

对于选择,您可以像这样定义您的选择:

const myFancyQuestions = [
  { id: 1, label: 'Why?', category: 'Asking why' },
  { id: 2, label: 'Who?', category: 'Asking who' },
  { id: 3, label: 'When?', category: 'Asking when' }
];

然后使用Field组件包装组件。

<Field component={ObjectSelect} name="myFancySelect" options={myFancyQuestions}/>

然后在渲染中显示它:

class ObjectSelect extends React.Component {
  render() {
    const { input, multiple, options, value, ...rest } = this.props;
    const parse = event => {
      // This is what redux-form will hold:
      return JSON.parse(event.target.value);
    }
    return (
      <select
        onBlur={event => input.onBlur(parse(event))}
        onChange={event => input.onChange(parse(event))}
        {...rest}>
          {options.map(option =>
            <option key={option.id} 
                    value={JSON.stringify(option)} 
                    selected={input.value.id == option.id}>
              {option.label}
            </option>)}
      </select>
    )
  }
}

答案 1 :(得分:2)

是的,该值可以是一个复杂的对象。甚至有一个例子证明了这一点。

Complex Values Example

答案 2 :(得分:0)

我认为更好的方法是创建两个虚拟字段selectedQuestionIdselectedQuestionName。那些字段不显示。然后,每个SelectQuestion都可以触发回调,如:

setSelectedQuestion = (event) => {
  var questionName = event.target.name; //or something like that
  var questionId = event.target.id; //or something like that
  this.props.fields.selectedQuestionName.onChange(questionName );
  this.props.fields.selectedQuestionId.onChange(questionId );
}
可以在redux-form字段上调用

onChange以编程方式设置值。

答案 3 :(得分:0)

这有点晚了,但还是......

是的,它可以!您只需在此处使用FormSection

它会将您的表单拆分为引擎盖下的对象,并将所有部分保留在单个表单对象中。

只需要将name道具传递给FormSection,这将是您的子对象的名称。

import { FormSection } from 'redux-form';

render(){
  return(
      <form onSubmit={...}>
        <FormSection name="firstGroup">
            <SelectQuestion {...question1}/>
        </FormSection>

        <FormSection name="secondGroup">
            <SelectQuestion {...question1}/>
        </FormSection>
       <button type="submit" className="btn btn-default">Submit</button>
      </form>
  )
}

然后通过Redux devTools检查表单结构。

享受;)

答案 4 :(得分:0)

这很简单,您只需添加“ .value”(或其他任何内容,即可)命名prop,它将创建对象并在更改时更新其中的值...

companyName: {
value:"<inputted string>"
}

您将获得对象:

W.2