@schema-render/form-render-react
Version:
Out-of-the-box form rendering library based on Core and Antd.
75 lines (74 loc) • 2.88 kB
JavaScript
import { useMemoizedFn, utils } from "@schema-render/core-react";
import { useState } from "react";
import { ACTIONS, ACTIONS_DEFAULT_LOADING_STATE } from "../constants";
/**
* 操作行为按钮事件
*/ export default function useActions({ props, coreRef }) {
const [actionsLoading, setActionsLoading] = useState(ACTIONS_DEFAULT_LOADING_STATE);
// 事件处理器通用函数
const handlerWrapper = useMemoizedFn(async (actionName, handler)=>{
setActionsLoading((prev)=>({
...prev,
[actionName]: true
}));
await handler().catch((err)=>{
utils.logger.warn(err);
});
setActionsLoading((prev)=>({
...prev,
[actionName]: false
}));
});
// 提交事件处理
const handleSubmit = useMemoizedFn(()=>{
handlerWrapper(ACTIONS.submit, async ()=>{
var _props_onSubmit;
if (!coreRef.current) {
return;
}
// 触发 onSubmit 事件前是否执行表单校验
if (props.validateFormOnSubmit) {
const res = await coreRef.current.validate();
// 表单项存在错误或警告,不执行提交事件
if (res.hasError || res.hasWarning) {
return;
}
}
// 触发提交事件
await ((_props_onSubmit = props.onSubmit) === null || _props_onSubmit === void 0 ? void 0 : _props_onSubmit.call(props, coreRef.current.getValue()));
});
});
// Form onSubmit 事件提交处理
const handleFormSubmit = useMemoizedFn((event)=>{
event.preventDefault();
event.stopPropagation();
handleSubmit();
});
// 重置处理
const handleReset = useMemoizedFn(()=>{
handlerWrapper(ACTIONS.reset, async ()=>{
var _props_onBeforeReset, _props_onReset;
if (!coreRef.current) {
return;
}
// 触发重置前置事件
const res = await ((_props_onBeforeReset = props.onBeforeReset) === null || _props_onBeforeReset === void 0 ? void 0 : _props_onBeforeReset.call(props, coreRef.current.getValue()));
const nextValue = {
...res
};
// 重置数据,可填入重置后数据
coreRef.current.setValue(nextValue);
// 重置错误提示
coreRef.current.resetError();
// 触发重置事件
await ((_props_onReset = props.onReset) === null || _props_onReset === void 0 ? void 0 : _props_onReset.call(props, nextValue));
});
});
return {
handleFormSubmit,
handleSubmit,
handleReset,
actionsLoading,
isLoading: actionsLoading.submit || actionsLoading.reset
};
}