在原来的代码上面加代码是一件特别难过的事情,因为加完功能之后还要拆分,让他们不那么冗余,我有一个保存之后在特定情况下把它们放到一起了,后面mt检查代码的时候发现这样不行,因为不容易维护和可读;(注:代码出于某些原因,变量和某些段落有些删减)
函数里面的逻辑抽离成3个函数,一个是通用校验,一个是和后端调用,一个是判断是否需要弹出list确认, 于是我是这么写的,
const save = useCallback(
async (s-check = false) => {
const result = await validateAllForms();
if (!result) {
message.error('获取表单数据失败');
return;
}
const { params, save, news } = result;
if (shouldShowChecklist(save, s-check)) {
setChecklistVisible(true);
return;
}
await callBackendAPI(params, news);
},
[validateAllForms, shouldShowChecklist, callBackendAPI]
);
mt说这个还是不行,因为他会做两次重复校验,性能不好:这是因为,我把是否确认的弹框参数作为save传进来,到那时我后面在确认弹窗的时候还会调用一次,这个save传true来保存,所以其实这是多余的,需要我分离逻辑,同时易读,将点击保存和点击验证逻辑分离开来:
const save = useCallback(async () => {
resultRef.current = await validateAllForms();
if (shouldShowChecklist(resultRef.current?.save)) {
setChecklistVisible(true);
return;
}
handleSubmit();
}, [validateAllForms, shouldShowChecklist, handleSubmit]);
const handleSave = useCallback(async () => {
await executeActualSave();
}, [executeActualSave]);
const handleChecklistConfirm = useCallback(async () => {
setChecklistVisible(false);
await handleSubmit();
}, [handleSubmit]);
就是这样,将验证结果专门用一个值装起来,这样就不用重复调用,然后将函数分解,就解决啦,各司其职,好看多了!
betaschema的监听提取实践:与其把变动放到内部不断调用form,不如直接提取出来,能更可观的看到变化了什么
<BetaSchemaForm
onValuesChange={handleChange}
/>
const handleChange = useCallback((changes) => {
if ('parent' in changes) {
const { parent } = changes;
}
}, []);