1

我创建了一个条件字段,显示是和否单选按钮。如果选择是,则应显示子组件。

下面的代码实现了这一点。问题是选择是或否未在 redux 状态下注册。如果我删除 onChange 函数,那么 redux 状态会更新为 Yes 或 No 值,但当然子组件不会显示。

我相信我传递的 onChange 函数正在覆盖 redux-form 传递的其他一些 onChange 函数。尝试了很多东西,但得到了相同的结果。

我正在考虑将 value 属性与 ReactLink 链接,但它已被弃用。

使用 React 0.15、Redux-Form 6.0 alpha 和 ES7。

const YesNoRadioButtonGroup = (props) =>
  <RadioButtonGroup {...props}>
    <RadioButton value='Yes' label='Yes' className={s.radio}/>
    <RadioButton value='No' label='No' className={s.radio}/>
  </RadioButtonGroup>

// TODO: Clear child fields when "No" is selected
// TODO: See if we can generalize into ConditionalField
export class ConditionalRadio extends React.Component {

  state = {conditional: false}

  updateConditional(event) {
    console.log(event)
    this.setState({conditional: event.target.value === 'Yes'})
  }

  render() {
    return <div>
      <Field name={this.props.name}
             component={YesNoRadioButtonGroup}
             onChange={::this.updateConditional} />  // The trouble line.

      {this.state.conditional ? this.props.children : null}
    </div>
  }
}    

它是这样使用的:

       <ConditionalRadio name='willRelocate'>
              <Field name='willRelocateTo.withinCurrentState' component={Checkbox} label='Within Current State'/>
              <Field name='willRelocateTo.outOfState' component={Checkbox} label='Out of State'/>
              <Field name='willRelocateTo.outOfCountry' component={Checkbox} label='Out of Country'/>
        </ConditionalRadio>
4

3 回答 3

3

如果您在创建 redux-form 时定义了字段名称,那么您只需在自定义更改事件处理程序中为该字段调用默认的 onChange 事件。

在您的情况下,应该是:

  updateConditional(event) {
    this.setState({conditional: event.target.value === 'Yes'});
    this.props.fields.name.onChange(event);
  }
于 2016-08-24T10:24:50.900 回答
2

您是否尝试使用可以检查新值然后设置新条件的函数 componentWillReceiveProps?在此处查看所有有用的 React 生命周期函数

你的组件会这样写:

export class ConditionalRadio extends React.Component {

  state = {conditional: false}

  componentWillReceiveProps(nextProps) {
    const displayChildren = nextProps.**value of the radio from redux form STORE** === 'Yes'
    this.setState({conditional: displayChildren});
  }

  render() {
    return (
      <div>
        <Field name={this.props.name}
               component={YesNoRadioButtonGroup}/>
          {this.state.conditional ? this.props.children : null}
      </div>
    )
  }
} 
于 2016-06-02T19:35:23.630 回答
0

这很好用:

class YesNoRadioButtonGroup extends React.Component {

  handleChange(event) {
    // Call the event supplied by redux-form.
    this.props.onChange(event)

    // If custom handler exists, call it.
    if (this.props.hasOwnProperty('customHandler')) {
      this.props.customHandler(event)
    }
  }

  render() {
    return <RadioButtonGroup {...this.props} onChange={::this.handleChange}>
        <RadioButton value='Yes' label='Yes' className={s.radio}/>
        <RadioButton value='No' label='No' className={s.radio}/>
      </RadioButtonGroup>
  }
}
于 2016-06-03T15:44:13.967 回答