Вот упрощенный пример, который не требует контроллера. Неконтролируемая рекомендация в документах. По-прежнему рекомендуется, чтобы вы вводили для каждого входа свой собственный name
и преобразовывали / фильтровали данные, чтобы удалить непроверенные значения, например, с помощью yup и validatorSchema в последнем примере, но для целей вашего примера использование того же имени приводит к значения, которые будут добавлены в массив, который соответствует вашим требованиям.
https://codesandbox.io/s/practical-dijkstra-f1yox
В любом случае, проблема в том, что ваш defaultValues
не соответствует структуре ваших флажков , Это должно быть {[name]: boolean}
, где names
, как сгенерировано, является литеральной строкой boat_ids[${boat.id}]
, пока она не пройдет через входы неконтролируемой формы, которые объединяют значения в один массив. Например: form_input1[0] form_input1[1]
испускает form_input1 == [value1, value2]
https://codesandbox.io/s/determined-paper-qb0lf
Сборки defaultValues: { "boat_ids[0]": false, "boat_ids[1]": true ... }
Контроллер ожидает логические значения для переключения значений флажков и в качестве значений по умолчанию он будет добавлен к флажкам.
const { register, handleSubmit, control, getValues, setValue } = useForm({
validationSchema: schema,
defaultValues: Object.fromEntries(
preselectedBoats.map(boat => [`boat_ids[${boat.id}]`, true])
)
});
Схема, используемая для validationSchema, которая проверяет, что выбрано как минимум 2, а также преобразует данные в требуемую схему перед отправкой в onSubmit. Он отфильтровывает ложные значения, поэтому вы получаете массив идентификаторов строк:
const schema = Yup.object().shape({
boat_ids: Yup.array()
.transform(function(o, obj) {
return Object.keys(obj).filter(k => obj[k]);
})
.min(2, "")
});