@uiw/react-native
Version:
UIW for React Native
107 lines (102 loc) • 2.17 kB
JavaScript
import { useState } from 'react';
import { useValidator } from '@validator.tool/hook';
import { isObjectEmpty } from '../utils/is';
import { cloneDeep } from '../utils';
export default function useForm() {
const [state, setState] = useState({
initialValues: {},
store: {}
});
const {
validator,
forceUpdate
} = useValidator({
initValues: state.initialValues
});
const updateStore = datas => {
setState({
...state,
...datas
});
};
const innerValidate = () => {
const {
showMessages
} = validator;
showMessages?.();
forceUpdate?.();
};
// 获取表单字段的值
const getFieldValue = field => {
const {
store
} = state;
return store[field];
};
// 设置表单字段的值
const setFieldValue = (field, value) => {
updateStore({
store: {
...state.store,
[field]: value
}
});
};
// 重置表单
const resetFieldValue = () => {
updateStore({
store: {
...state.initialValues
}
});
};
// 触发验证
const validate = () => {
const {
showMessages,
errorMessages
} = validator;
showMessages?.();
forceUpdate?.();
if (Object.keys(errorMessages).length > 0) {
return errorMessages;
}
return {};
};
// 验证并获取表单值
const validateFields = () => {
return new Promise(async function (resolve, reject) {
const errors = validate();
if (isObjectEmpty(errors)) {
const value = cloneDeep(state.store);
resolve(value);
} else {
reject(errors);
}
});
};
const getFormInstance = () => {
return {
getFieldValue,
setFieldValue,
resetFieldValue,
validate,
validateFields,
getInnerMethods: inner => {
let methods = {};
if (inner) {
methods = {
store: state.store,
initialValues: state.initialValues,
updateStore,
validator,
forceUpdate,
innerValidate
};
}
return methods;
}
};
};
return getFormInstance();
}