https://github.com/react-hook-form/react-hook-form/issues/10862
a) bad, shouldValidate not works well
setValue("item1.positions", [{ activities: [] }], {
shouldValidate: true
});
b) good, shouldValidate works well!
setValue("item2.positions.0.activities", [], {
shouldValidate: true
});
const setValue: UseFormSetValue<TFieldValues> = (
name,
value,
options = {},
) => {
const field = get(_fields, name);
const isFieldArray = _names.array.has(name);
const cloneValue = cloneObject(value);
set(_formValues, name, cloneValue);
if (isFieldArray) {
...
} else {
// Q1. a, b case모두 setValues로 가나?? 아닐듯?
// a) [activities: []] -> setValues
// b [] -> setFieldValue로 갈 듯?
field && !field._f && !isNullOrUndefined(cloneValue)
? setValues(name, cloneValue, options)
: setFieldValue(name, cloneValue, options); // here!!
}
const setValues = <
T extends InternalFieldName,
K extends SetFieldValue<TFieldValues>,
U extends SetValueConfig,
>(
name: T,
value: K,
options: U,
) => {
for (const fieldKey in value) {
const fieldValue = value[fieldKey];
const fieldName = `${name}.${fieldKey}`;
const field = get(_fields, fieldName);
(_names.array.has(name) ||
!isPrimitive(fieldValue) ||
(field && !field._f)) &&
!isDateObject(fieldValue)
? setValues(fieldName, fieldValue, options)
: setFieldValue(fieldName, fieldValue, options); // here!
}
};
const setFieldValue = (
name: InternalFieldName,
value: SetFieldValue<TFieldValues>,
options: SetValueConfig = {},
) => {
...
options.shouldValidate && trigger(name as Path<TFieldValues>);
};
---
const setValues = <
T extends InternalFieldName,
K extends SetFieldValue<TFieldValues>,
U extends SetValueConfig,
>(
name: T, // "item1.positions.0"
value: K, // { activities: [] }
options: U,
) => {
for (const fieldKey in value) {
const fieldValue = value[fieldKey]; // []
const fieldName = `${name}.${fieldKey}`; // "item1.positions.0.activities"
const field = get(_fields, fieldName);
(_names.array.has(name) ||
!isPrimitive(fieldValue) || // isPrimitive([]) == false
(field && !field._f)) &&
!isDateObject(fieldValue) &&
!fieldValue.isEmpty // like this?
? setValues(fieldName, fieldValue, options)
: setFieldValue(fieldName, fieldValue, options);
// [] -> setFieldValue 호출하게 변경!
// {} 도 동일하게 핸들링 해야 하나? (isEmptyObject참고!)
}
};
setValues(
"item1.positions.0.activities",
[],
{ shouldValidate: true }
) => for (const fieldKey in value) { .. } // [] 라서 암것도 안함!
https://github.com/react-hook-form/react-hook-form/blob/6d83aacb719671cd048832b332cb1d50933ab398/src/logic/createFormControl.ts#L594
https://github.com/react-hook-form/react-hook-form/blob/6d83aacb719671cd048832b332cb1d50933ab398/src/__tests__/useForm/setValue.test.tsx#L528-L530