Я смог заставить это работать, взяв все, что отображается в разделе fields.map()
, и обернул его в свой собственный компонент, чтобы гарантировать, что у каждого из них есть отдельные состояния. Затем я просто помещаю функцию changeB(undefined)
в ответный вызов хука useEffect
, чтобы очистить вторичные выборки после того, как пользователь выбирает другую опцию для первого выбора, например, так:
React.useEffect(() => {
setOptions(optionsMap[aValue]);
return function cleanup() {
changeB(undefined) // clear B
};
}, [aValue, changeB, optionsMap]);
Вы можете видетькак это работает в этой изолированной программной среде: Реакция окончательной формы - Очистка вторичного выбора .
Чтобы изменить вторичные поля выбора, вам нужно будет передать дополнительную подпорку в PickOptions
для типаОпция, которой соответствует массив. Я также подписываюсь и отслеживаю предыдущий bValue
, чтобы проверить, существует ли он в текущем массиве bValueSet
. Если он существует, мы оставляем его в покое, в противном случае мы обновляем его первым значением в соответствующем массиве optionType
.
// subscibe to keep track of previous bValue
const bFieldSubscription = useField(b, { subscription: { value: 1 } })
const bValue = bFieldSubscription.input.value.value
React.useEffect(() => {
setOptions(optionsMap[aValue]);
if (optionsMap[aValue]) {
// set of bValues defined in array
const bValueSet = optionsMap[aValue].filter(x => x.type === optionType);
// if the previous bValue does not exist in the current bValueSet then changeB
if (!bValueSet.some(x => x.value === bValue)) {
changeB(bValueSet[0]); // change B
}
}
}, [aValue, changeB, optionsMap]);
Вот песочница для этого метода: React Final Form - UpdateSecondary Selects .
Я также изменил ваш компонент класса на функционал, потому что мне было легче видеть и тестировать, что происходит, но этот метод должен также работать с вашим компонентом класса.