亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React - 用作導致額外渲染的道具

React - 用作導致額外渲染的道具

元芳怎么了 2021-06-01 15:12:11
我正在處理一些繁重的表格。因此,我試圖在我能找到的任何地方擠壓性能。最近我添加了Why-did-you-render插件,以更深入地了解可能導致我的頁面變慢的原因。我注意到,例如,當我單擊有關所有其他組件的復選框組件時會重新渲染。理由總是一樣的。WDYR 說由于 props 更改而重新渲染:具有相同名稱的不同函數 {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()功能,但功能組件確實提供了一些我寧愿保留的優勢。我應該如何以與一個輸入交互不會強制更新另一個輸入的方式編寫我的函數?
查看完整描述

3 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

問題源于您定義更改處理程序的方式:

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

每次渲染都會調用這一行,因此,每次渲染組件時,道具都有一個新的(盡管功能方面相同)值。這同樣適用于所有其他處理程序。

作為一個簡單的解決方案,您可以將功能組件升級為完全成熟的組件并在渲染函數之外緩存處理程序,也可以shouldComponentUpdate()在子組件中實現。


查看完整回答
反對 回復 2021-06-03
  • 3 回答
  • 0 關注
  • 242 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號