Skip to content
This repository has been archived by the owner on Jul 27, 2022. It is now read-only.

Commit

Permalink
Merge pull request #105 from wellyshen/feature/code-refactor
Browse files Browse the repository at this point in the history
refactor(useForm): move ignoreFieldsRef to getFields()
  • Loading branch information
wellyshen authored Nov 16, 2020
2 parents 624d597 + 0890b1c commit cf014f9
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 48 deletions.
5 changes: 5 additions & 0 deletions .changeset/ten-fireants-do.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"react-cool-form": patch
---

refactor(useForm): move ignoreFieldsRef to getFields()
13 changes: 5 additions & 8 deletions examples/src/BasicForm/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -221,14 +221,11 @@ export default (): JSX.Element => {
// data-rcf-ignore
defaultValue="test"
/>
{!show1 && (
<Input
label="Controller 1:"
type="checkbox"
{...controller("controller1", { defaultValue: true })}
// defaultChecked
/>
)}
<Input
label="Controller 1:"
{...controller("controller1")}
// defaultChecked
/>
<Controller
label="Controller 2:"
name="controller2"
Expand Down
81 changes: 41 additions & 40 deletions src/useForm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,37 +58,6 @@ const isFieldElement = ({ tagName }: HTMLElement) =>

const isButton = ({ type }: FieldElement) => /image|submit|reset/.test(type);

const getFields = (form: HTMLFormElement | null) =>
form
? Array.from(form.querySelectorAll("input,textarea,select"))
.filter((element) => {
const field = element as FieldElement;

if (isButton(field)) return false;
if (!field.name) {
warn('💡 react-cool-form: Field is missing "name" attribute.');
return false;
}
if (field.dataset.rcfIgnore) return false;

return true;
})
.reduce((acc: Record<string, any>, cur) => {
const field = cur as FieldElement;
const { name } = field;

acc[name] = { ...acc[name], field: cur };

if (isCheckboxField(field) || isRadioField(field)) {
acc[name].options = acc[name].options
? [...acc[name].options, cur]
: [cur];
}

return acc;
}, {})
: {};

export default <V extends FormValues = FormValues>({
defaultValues,
validate,
Expand Down Expand Up @@ -126,6 +95,39 @@ export default <V extends FormValues = FormValues>({
debug
);

const getFields = useCallback(
() =>
// @ts-expect-error
Array.from(formRef.current.querySelectorAll("input,textarea,select"))
.filter((element) => {
const field = element as FieldElement;

if (isButton(field)) return false;
if (!field.name) {
warn('💡 react-cool-form: Field is missing "name" attribute.');
return false;
}

return (
!field.dataset.rcfIgnore && !ignoreFieldsRef.current[field.name]
);
})
.reduce((acc: Record<string, any>, cur) => {
const field = cur as FieldElement;
const { name } = field;

acc[name] = { ...acc[name], field: cur };

if (isCheckboxField(field) || isRadioField(field))
acc[name].options = acc[name].options
? [...acc[name].options, cur]
: [cur];

return acc;
}, {}),
[]
);

const getNodeValue = useCallback(
(field: FieldElement, options?: FieldElement[]) => {
let value = field.value as any;
Expand Down Expand Up @@ -181,7 +183,7 @@ export default <V extends FormValues = FormValues>({
);

const setNodeValue = useCallback((name: string, value: any) => {
if (!fieldsRef.current[name] || ignoreFieldsRef.current[name]) return;
if (!fieldsRef.current[name]) return;

const { field, options } = fieldsRef.current[name];

Expand Down Expand Up @@ -235,8 +237,7 @@ export default <V extends FormValues = FormValues>({
const value = get(values, field.name);

if (!isUndefined(value)) setNodeValue(field.name, value);

if (checkDefaultValue && !ignoreFieldsRef.current[field.name])
if (checkDefaultValue)
setDefaultValue(field.name, getNodeValue(field, options));
}),
[getNodeValue, setNodeValue, setDefaultValue]
Expand Down Expand Up @@ -682,9 +683,9 @@ export default <V extends FormValues = FormValues>({
return;
}

fieldsRef.current = getFields(formRef.current);
fieldsRef.current = getFields();
setAllNodesOrStateValue(initialStateRef.current.values, true);
}, []);
}, [getFields, setAllNodesOrStateValue]);

useEffect(() => {
if (!formRef.current) return () => null;
Expand All @@ -698,8 +699,7 @@ export default <V extends FormValues = FormValues>({
return;
}

if (fieldsRef.current[name] && !ignoreFieldsRef.current[name])
handleFieldChange(field);
if (fieldsRef.current[name]) handleFieldChange(field);
};

const handleBlur = ({ target }: Event) => {
Expand All @@ -711,7 +711,7 @@ export default <V extends FormValues = FormValues>({

const { name } = target as FieldElement;

if (fieldsRef.current[name] && !ignoreFieldsRef.current[name])
if (fieldsRef.current[name])
setFieldTouched(
name,
(validateOnChange && name !== changedFieldRef.current) ||
Expand All @@ -731,7 +731,7 @@ export default <V extends FormValues = FormValues>({

const observer = new MutationObserver(([{ type }]) => {
if (type === "childList") {
fieldsRef.current = getFields(form);
fieldsRef.current = getFields();
setAllNodesOrStateValue(stateRef.current.values, true);
}
});
Expand All @@ -745,6 +745,7 @@ export default <V extends FormValues = FormValues>({
observer.disconnect();
};
}, [
getFields,
handleFieldChange,
reset,
setAllNodesOrStateValue,
Expand Down

0 comments on commit cf014f9

Please sign in to comment.