Я использую react-select
и react-final-form
для условных раскрывающихся списков, где параметры для второго выбора предоставляются компонентом <PickOptions/>
на основе значения первого выбора (благодаря этому SO answer).
Вот компонент:
/** Changes options and clears field B when field A changes */
const PickOptions = ({ a, b, optionsMap, children }) => {
const aField = useField(a, { subscription: { value: 1 } });
const bField = useField(b, { subscription: {} });
const aValue = aField.input.value.value;
const changeB = bField.input.onChange;
const [options, setOptions] = React.useState(optionsMap[aValue]);
React.useEffect(() => {
changeB(undefined); // clear B
setOptions(optionsMap[aValue]);
}, [aValue, changeB, optionsMap]);
return children(options || []);
};
Он очищает второй выбор, когда значение первого изменяется на changeB(undefined)
. Я также установил второй выбор для первой опции в массиве, передав initialValue
. Поскольку мне нужно инициализировать значения из состояния, я получил следующий код:
initialValue={
this.state.data.options[index] &&
this.state.data.options[index].secondOption
? this.state.data.options[index]
.secondOption
: options.filter(
option => option.type === "option"
)[0]
}
Но это не работает. Начальные значения из состояния не передаются в поля, отображаемые <PickOptions/>
. Если я удаляю changeB(undefined)
из компонента, значения передаются, но тогда входное значение второго выбора не обновляется, когда значение первого выбора изменяется (даже если параметры были обновлены). Вот ссылка на мой codeandbox.
Как я могу это исправить?