В реакции, работа с избыточной формой, использование FieldArray для добавления полей в форму при каждом нажатии кнопки.Всего 3 поля.Первые 2 поля являются раскрывающимися.При изменении значения в первом раскрывающемся списке заполняются параметры для второго раскрывающегося списка.Это отлично работает при первой загрузке.T
Проблема: предположим, что я добавил 3 элемента, то есть кнопка была нажата 3 раза, а полевой массив теперь содержит 3 элемента.Когда я удаляю первый элемент, следующие 2 элемента должны оставаться неизменными, но это не так.Значения для 2-го элемента изменяются на 1-й элемент, а значение для 3-го элемента изменяется на 2-й.Проблема в том, что индекс используется для поддержания состояния.
Добавление моего кода ниже:
import React from 'react';
import { Field } from 'redux-form';
import { Row, Col } from 'reactstrap';
import { TextInput } from '../../../../shared/components/form/TextInput';
import renderSelectField from '../../../../shared/components/form/Select';
import { UniqueUserCodeLangaugeSupport } from '../../../../constants/UniqueUserCodeManagerConstant';
import DeleteOutlined from '@material-ui/icons/DeleteOutlined';
class AddConditions extends React.Component {
constructor() {
super();
this.state = {
columnOptions: [],
}
this.onChangeColumn = this.onChangeColumn.bind(this);
this.changeValue = this.changeValue.bind(this);
}
componentDidMount() {
/*
* to make the array to be given to the eligible column dropdown
*/
const columnOptions = this.props.selectedTable.columns.map(column => {
return {
value: column.id.toString(),
label: column.name,
type: column.type
}
});
this.setState({
columnOptions
})
}
onChangeColumn(index, event) {
// A better and right way needed to achieve this entire logic
let conditionOptions;
this.setState({
[`column_type${index}`]: event.type
});
if(event.type === 'number') {
conditionOptions = this.props.applicableConditions.number.map(condition => {
return {
value: condition.id.toString(),
label: condition.name
}
});
} else if(event.type === 'text') {
conditionOptions = this.props.applicableConditions.text.map(condition => {
return {
value: condition.id.toString(),
label: condition.name
}
});
} else if(event.type === 'datetime') {
conditionOptions = this.props.applicableConditions.datetime.map(condition => {
return {
value: condition.id.toString(),
label: condition.name
}
});
}
this.setState({
[`conditionOptions${index}`]: conditionOptions
})
}
changeValue(index, event) {
console.log("some logic here");
}
render() {
const { fields } = this.props;
const { columnOptions } = this.state;
return (
<div>
{fields.map((condition, index) => (
<div className="single-condition-container" key={index}>
<div className="condition-text">
<span className="material-table__toolbar-button-active" onClick={() => fields.remove(index)}><DeleteOutlined /></span>
</div>
<div className="form__form-group">
<span className="form__form-group-label">{UniqueUserCodeLangaugeSupport.addEditForm.conditions.field1}</span>
<div className="form__form-group-field">
<Field
name={`${condition}.column_id`}
component={renderSelectField}
options={columnOptions}
placeholder="Select Column"
onChange={(e) => this.onChangeColumn(index, e)}
/>
</div>
</div>
<div className="form__form-group">
<span className="form__form-group-label">{UniqueUserCodeLangaugeSupport.addEditForm.conditions.field2}</span>
<div className="form__form-group-field">
<Field
name={`${condition}.condition_id`}
component={renderSelectField}
options={this.state[`conditionOptions${index}`]}
placeholder="Select value"
onChange={(e) => this.changeValue(index, e)}
/>
</div>
</div>
</div>
))}
<button className="btn btn-outline-primary btn-sm text-uppercase margin-top-30" type="button" onClick={() => fields.push({})} >
{fields.length > 0 ? 'Add More' : UniqueUserCodeLangaugeSupport.addEditForm.addEligibility}
</button>
</div>
);
}
}
export default AddConditions;
В родительском компоненте вышеуказанный компонент отображается как:
<FieldArray name="conditions" component={AddConditions} selectedTable={selectedTable} applicableConditions={applicableConditions} change={this.props.change} />
Когда я удаляю первый элемент, скажем, чей индекс равен 0, мой второй элемент, чей индекс равен 1, теперь находится на 0-й позиции и принимает параметры раскрывающегося списка conditionOptions0.Любой другой способ работы с fieldArray без необходимости делать setState на основе индекса?