javascript - React - 作为导致额外渲染的 Prop

标签 javascript reactjs

我正在处理一些繁重的表格。因此,我试图在任何可以找到的地方压缩性能。最近,我添加了 Why-did-you-render 插件,以更深入地了解可能会减慢页面速度的因素。例如,我注意到,当我单击一个复选框组件时,所有其他组件都会重新渲染。理由总是一样的。 WDYR 说

Re-rendered because of props changes: different functions with the same name {prev onChangeHandler: ƒ} "!==" {next onChangeHandler: ƒ}

我会尽可能尊重我发现的最佳实践指示。我的组件传递的回调函数遵循此模式

import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
export function TopLevelComponent({props}){

    const defaultData = {name: '', useMale: false, useFemale: false}

    const [data, setData] = useState(defData);
    const { t } = useTranslation();
    const updateState = (_attr, _val) => {
        const update = {};
        update[_attr] = _val;
        setData({ ...data, ...update });
    }

    const updateName = (_v) => updateState('name', _v);//Text input
    const updateUseMale = (_v) => updateState('useMale', _v);//checkbox
    const updateUseFemale = (_v) => updateState('useFemale', _v);//checkbox
    ...

    return <div>
        ...
        <SomeInputComponent value={data.name} text={t('fullName')} onChangeHandler={updateName} />
        <SomeCheckboxComponent value={data.useMale} onChangeHandler={updateUseMale} text={t('useMale')}/>
        <SomeCheckboxComponent value={data.useFemale} onChangeHandler={updateUseFemale} text={t('useFemale')}/>
        ...
    </div>
}

在这样的示例中,更改任何输入(例如:在文本输入中写入文本或单击其中一个复选框)都会导致其他 2 个组件按照上述理由重新渲染。

我想我可以停止使用函数式组件并利用 shouldComponentUpdate() 函数,但函数式组件确实提供了一些我宁愿保留的优点。我应该如何编写我的函数,以便与一个输入交互时不会强制更新另一个输入?

最佳答案

问题源于您定义更改处理程序的方式:

const updateName = (_v) => updateState('name', _v)

该行在每次渲染时都会被调用,因此,每次渲染组件时,该 prop 都会有一个新的(尽管功能上相同)值。这同样适用于其他所有处理程序。

作为一个简单的解决方案,您可以将功能组件升级为成熟的组件并在渲染函数之外缓存处理程序,或者您可以实现 shouldComponentUpdate()在您的子组件中。

关于javascript - React - 作为导致额外渲染的 Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56178669/

相关文章:

javascript - 类型错误:无法读取未定义的属性 'number'

reactjs - 如何将参数传递给历史推送

JavaScript 游戏 - 如何自动调用对象的新实例

javascript - 在遵循 Flow 规则的同时通过匹配键合并两个对象

javascript - 如何从按钮网格中获取点击按钮的索引?

javascript - 如何在打印前隐藏按钮并在打印过程完成后显示它?

reactjs - TypeScript (ReactJS) 编译器错误,隐含类型为 any

javascript - Javascript/浏览器中的 Cocos2d ClippingNode 和 Alphathreshold

reactjs - 如何在 React Typescript 应用程序中导入 React-admin?

javascript - 如何更改 React Native Text 中的特定单词颜色