实习日记9:cr函数优化

39 阅读1分钟

在原来的代码上面加代码是一件特别难过的事情,因为加完功能之后还要拆分,让他们不那么冗余,我有一个保存之后在特定情况下把它们放到一起了,后面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;
     
    }
  }, []);