Skip to content

Commit d93d1a9

Browse files
committed
fix(forms): change form transform and onChange calls to reduce excessive calls
1 parent d2914e5 commit d93d1a9

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

demo/FormExamples.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ export function FormExamples() {
2121
// return Promise.resolve();
2222
reset();
2323
}}
24-
transform={(formData) => {
24+
transform={(formData, pathUpdated, update) => {
2525
formData.__v = formData.__v ? formData.__v + 1 : 1;
2626

27-
return formData;
27+
update(formData);
2828
}}
2929
onCancel={() => console.log('onCancel')}
3030
customValidation={true}

src/forms/helpers/useForm.js

+41-15
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,52 @@ import { setValueByPath, deepClone, getValueByPath } from '../../utils/getters-s
44
import { validateFormElement } from './form-helpers';
55
import { debounce } from 'lodash-es';
66

7-
export function useForm(initialState, { validations, onChange, transform }) {
7+
function useFormState(initialState, { onChange, transform }) {
88
const [formState, setFormState] = useState(initialState);
9-
const [submitAttempted, setSubmitAttempted] = useState(false);
10-
const { getAllKeys: getElementNames, get: getElementRefs, push: registerElementRef } = useArrayValueMap();
11-
const _onChange = useCallback(debounce(onChange, 500), []);
12-
const _transfrom = useCallback(
13-
debounce((name) => {
14-
setFormState((prevFormState) => transform(deepClone(prevFormState), name));
15-
}, 1000),
16-
[setFormState, transform]
9+
const _onChange = useCallback(debounce(onChange, 1000), []);
10+
const _transform = useCallback(
11+
debounce(
12+
(nextFormState, name) =>
13+
transform(nextFormState, name, (state) => {
14+
setFormState(state);
15+
}),
16+
500
17+
),
18+
[setFormState]
1719
);
1820

1921
useEffect(() => {
2022
_onChange(formState);
2123
}, [formState, _onChange]);
2224

25+
return {
26+
getState() {
27+
return formState;
28+
},
29+
updateState(name, value) {
30+
setFormState((prevFormState) => {
31+
const nextFormState = nextState(prevFormState, name, value);
32+
33+
setTimeout(() => {
34+
_transform(nextFormState, name);
35+
});
36+
37+
return nextFormState;
38+
});
39+
},
40+
resetState() {
41+
setFormState(initialState);
42+
},
43+
};
44+
}
45+
46+
export function useForm(initialState, { validations, onChange, transform }) {
47+
const { getState, updateState, resetState } = useFormState(initialState, { onChange, transform });
48+
const [submitAttempted, setSubmitAttempted] = useState(false);
49+
const { getAllKeys: getElementNames, get: getElementRefs, push: registerElementRef } = useArrayValueMap();
50+
51+
const formState = getState();
52+
2353
return {
2454
register(name, elementRef) {
2555
registerElementRef(name, elementRef);
@@ -34,11 +64,7 @@ export function useForm(initialState, { validations, onChange, transform }) {
3464
}
3565
},
3666
update(name, value) {
37-
setFormState((prevFormState) => nextState(prevFormState, name, value), name);
38-
39-
setTimeout(() => {
40-
_transfrom(name);
41-
});
67+
updateState(name, value);
4268

4369
if (validations) {
4470
this.validateForm(nextState(formState, name, value));
@@ -51,7 +77,7 @@ export function useForm(initialState, { validations, onChange, transform }) {
5177
return getValueByPath(formState, name);
5278
},
5379
reset() {
54-
setFormState(initialState);
80+
resetState();
5581
setSubmitAttempted(false);
5682
},
5783
setSubmitedAttempted() {

0 commit comments

Comments
 (0)