简体   繁体   English

React - useEffect 中的渲染滞后 UI

[英]React - Rerenders in useEffect lags UI

I'm trying to think of a better way to do my onChange validation for my form but it's really laggy because of the multiple rerenders.我正在尝试一种更好的方法来对我的表单进行 onChange 验证,但由于多次重新渲染,它真的很滞后。

This is my useEffect code:这是我的 useEffect 代码:

useEffect(() => {
        if (passwordValues.password) {
            setValidPassword({ confirmPassword: validateConfirmPassword(correctPassword), password: validatePassword(correctPassword) })
        }
        if(formData.name){
            setValidFormData(validFormData => ({...validFormData, name: validateData(correctFormData, "name")}))
        }
        
        if(formData.lastName){
            setValidFormData(validFormData => ({...validFormData, lastName: validateData(correctFormData, "lastName")}))
        }
        if(formData.email){
            setValidFormData(validFormData => ({...validFormData, email: validateData(correctFormData, "email")}))
        }
        if(formData.phone){
            setValidFormData(validFormData => ({...validFormData, phone: validateData(correctFormData, "phone")}))
        }
    }, [passwordValues, correctPassword, correctFormData, formData])

I know I can maybe do that in just a couple lines but is that what is doing so many rerenders?我知道我可能只需要几行代码就可以做到这一点,但这就是在做这么多重新渲染的原因吗?

My formData, passwordValues, correctPassword and correctFormData change on every input change.每次输入更改时,我的 formData、passwordValues、correctPassword 和 correctFormData 都会更改。

-- EDIT -- - 编辑 -

I removed most of the dependencies in the array and I just stayed with [formData], improves the speed, but still quite a bit laggy.我删除了数组中的大部分依赖项,只保留了 [formData],提高了速度,但仍然有点滞后。

I am writing it here, because it will be a bit long explanation, not suitable for comments.我写在这里,因为解释会有点长,不适合评论。

These scenarios are pretty common in any application, where you have to react to changes in values and to tackle this I just created one special hook, use-effect-x (Writing tests is pending)这些场景在任何应用程序中都很常见,您必须对值的变化做出反应并解决这个问题,我刚刚创建了一个特殊的钩子, use-effect-x (编写测试待定)

This custom hook will tell you the changed item set, which can be very useful here.这个自定义钩子会告诉您更改的项目集,这在这里非常有用。 Below is the code, that I was able to write based on your inputs.以下是我能够根据您的输入编写的代码。 you can make use of useEffectX as a replacement of useEffect everywhere.您可以在任何地方使用 useEffectX 作为 useEffect 的替代品。 This way non-needed setValidFormData will not run.这样不需要的 setValidFormData 将不会运行。 Give it a try and let me know.试一试,让我知道。

import { useEffectX } from "use-effect-x";
useEffectX(
  ({
    changedItem: [
      changeObjConfirmPassword,
      changeObjPassword,
      changeObjName,
      changeObjLastname,
      changeObjEmail,
      changeObjPhone,
    ],
  }) => {
    if (changeObjConfirmPassword.changed) {
      setValidPassword({
        confirmPassword: validateConfirmPassword(confirmPassword),
      });
    }

    if (changeObjPassword.changed) {
      setValidPassword({
        password: validatePassword(correctPassword),
      });
    }

    if (changeObjName.changed) {
      setValidFormData((validFormData) => ({
        ...validFormData,
        name: validateData(correctFormData, "name"),
      }));
    }

    if (changeObjLastname.changed) {
      setValidFormData((validFormData) => ({
        ...validFormData,
        lastName: validateData(correctFormData, "lastName"),
      }));
    }
    if (changeObjEmail.changedd) {
      setValidFormData((validFormData) => ({
        ...validFormData,
        email: validateData(correctFormData, "email"),
      }));
    }
    if (changeObjPhone.changed) {
      setValidFormData((validFormData) => ({
        ...validFormData,
        phone: validateData(correctFormData, "phone"),
      }));
    }
  },
  [confirmPassword, password, name, lastName, email, phone]
);


   

Thanks and let me know, if this is not the suggestion you were expecting, I will move it.谢谢,让我知道,如果这不是您所期望的建议,我会移动它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM