У меня есть следующая форма, которая содержит поле и полевой массив. Внутри FieldArray у меня есть поле выбора с двумя вариантами: Demo и Final. Когда выбрано Demo, я хотел бы скрыть поля Maintenance Period и Maintenance Type Fields, а когда выбрано Final, должно быть показано поле Demo Duration, предыдущие 2 должны быть скрыты. Код ниже:Как я могу показать или скрыть поля в редукционной форме на основе некоторого условия, вызванного событием
const renderLicenses = ({ fields }) => (
<ul className="list-unstyled">
<li>
<button type="button" className="btn btn-info" onClick={() => fields.push({})}>Add License</button>
</li>
{fields.map((license, index) =>
<li key={index}>
<button
type="button"
title="Remove license"
onClick={() => fields.remove(index)}/>
<h4>License #{index + 1}</h4>
<Field
name={`${license}.licenseName`}
type="text"
component={renderSelectLicenses}
collectionOfOptions={LICENSES}
label="Please select license name">
</Field>
<Field
name={`${license}.licenseType`}
type="text"
component={renderSelectLicenseType}
label="Please select license type"/>
<Field
name={`${license}.validFrom`}
type="text"
component={renderCalendar}
label="Valid from"/>
<Field
name={`${license}.validTo`}
type="text"
component={renderCalendar}
label="Valid to"/>
<Field
name={`${license}.demoDuration`}
type="text"
component={renderField}
label="Demo duration"/>
<Field
name={`${license}.maintenancePeriod`}
type="text"
component={renderField}
label="Maintenance period"/>
<Field
name={`${license}.maintenanceType`}
type="text"
component={renderSelectMaintenanceTypes}
collectionOfOptions={MAINTENANCE_OPTIONS}
label="Maintenance type"/>
</li>
)}
</ul>
);
Это код renderSelectLicenseType:
import React from 'react';
const renderSelectLicenseType = ({input, label}) => (
<div className="form-group">
<label>{label}</label>
<select className="form-control" {...input}>
<option disabled>Please select a license type</option>
<option value="demo">Demo</option>
<option value="final">Final</option>
</select>
</div>
);
export default renderSelectLicenseType;
В принципе, я хотел бы иметь событие OnChange на выбор и скрыть/показать другие поля, если event.target. Значение - «демо» или «окончательный». Я не знаю, как распространять это событие на другие поля, которые являются автономными:
const renderField = ({ input, label, type, meta: { touched, error } }) => (
<div className="form-group">
<label>{label}</label>
<div>
<input className="form-control" {...input} type={type} placeholder= {label}/>
{touched && error && <span>{error}</span>}
</div>
</div>
);
Наконец, это код для основного компонента, который содержит всю форму:
render() {
const {handleSubmit, invalid, submitting} = this.props;
return (
<form onSubmit={handleSubmit(this.handleFormSubmit.bind(this))} style={tempStyles}>
<Field name="machineID" type="text" component={renderField} label="Machine ID"/>
<FieldArray name="licenses" component={renderLicenses} />
<div className="form-group">
<RaisedButton type="submit" label="Add new machine" primary={true} disabled={invalid || submitting}/>
</div>
</form>
)
}
export default reduxForm({
form: 'addMachine',
validate: validate
})(AddMachineMaster);
Я новичок в Redux-форме и трудное время, пытаясь понять это. Спасибо!
Благодарим за подтверждение этой стратегии. При использовании инструментов redux я увидел, что значение из выбора было сохранено в магазине через редуктор формы. Однако я не знал, как его извлечь и использовать в форме, чтобы решить, что будет скрыто. Еще раз спасибо! – war81
Добро пожаловать! Redux-форма становится немного странной для моего вкуса, особенно для не столь очевидной формы. И ИМО для основных форм, это тривиально, чтобы справиться с этим самостоятельно, поэтому я не использую его столько, сколько я сделал в наши дни. ;) – CharlieBrown