React Memo
React.memoist eine Higher-Order-Komponente (HOC), die zur Optimierung der Performance von Funktionskomponenten verwendet wird. Sie verbessert die Performance, indem sie die Render-Ausgabe der Komponente memoisiert und erneutes Rendern überspringt, wenn sich die props der Komponente nicht geändert haben. Das Folgende istReact.memodie detaillierte Einführung und die Verwendungsmethoden.
1. Grundlegende Verwendung
React.memoDie grundlegende Verwendung besteht darin, eine Funktionskomponente als Argument anReact.memozu übergeben, und eine memoisierte Komponente zurückzugeben.
Beispiel
import ReactDOM from 'react-dom';
const MyComponent = React.memo((props) => {
console.log('Rendering MyComponent');
return <div>{props.text}</div>;
});
const App = () => {
const [count, setCount] = React.useState(0);
const [text, setText] = React.useState('Hello, world!');
return (
<div>
<button onClick={() => setCount(count + 1)}>Zähler erhöhen</button>
<MyComponent text={text} />
</div>
);
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
In diesem Beispiel, selbst wenncountder State ändert sich,MyComponentwird es nicht neu gerendert, weil seinpropssich nicht geändert hat.
2. Verwenden einer benutzerdefinierten Vergleichsfunktion
Standardmäßig,React.memovergleicht nur die vorherigen und nächstenprops, und wenn es keine Änderung gibt, wird es nicht neu gerendert. Sie können die Logik für das erneute Rendern präziser steuern, indem Sie eine benutzerdefinierte Vergleichsfunktion übergeben.
Signatur der benutzerdefinierten Vergleichsfunktion:
function areEqual(prevProps, nextProps) {
// 返回 true 表示相等,不需要重新渲染
// 返回 false 表示不相等,需要重新渲染
}
Beispiel
import ReactDOM from 'react-dom';
const MyComponent = React.memo((props) => {
console.log('Rendering MyComponent');
return <div>{props.text}</div>;
}, (prevProps, nextProps) => {
return prevProps.text === nextProps.text;
});
const App = () => {
const [count, setCount] = React.useState(0);
const [text, setText] = React.useState('Hello, world!');
return (
<div>
<button onClick={() => setCount(count + 1)}>Zähler erhöhen</button>
<MyComponent text={text} />
</div>
);
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
In diesem Beispiel prüft die benutzerdefinierte Vergleichsfunktiontextob es sich geändert hat. Wenntextes sich nicht geändert hat,MyComponentes wird nicht neu gerendert.
3. Praktische Anwendungsszenarien
React.memoEs eignet sich sehr gut für die folgenden Szenarien:
- Statische Datenanzeige: die von der Komponente empfangenen Props
propssich selten ändern, aber die Komponente selbst relativ komplex ist und das erneute Rendern kostspielig ist. - Leistungsoptimierung: In großen Listen oder Tabellen ist jedes Element eine unabhängige Komponente; die Verwendung von
React.memokann unnötige erneute Renderings vermeiden. - Tiefe Gleichheitsprüfungen vermeiden: Die benutzerdefinierte Vergleichsfunktion kann tiefe Gleichheitsprüfungen vermeiden, insbesondere wenn
propseine große Datenmenge enthält.
4. Hinweise
- Flacher Vergleich: Standardmäßig
React.memoführt einen flachen Vergleich durch, was bedeutet, dass nurpropsdie oberste Ebene verglichen wird. Verschachtelte Objekte erfordern eine benutzerdefinierte Vergleichsfunktion. - State und Kontext:
React.memokonzentriert sich nur aufpropsÄnderungen. Änderungen am internen Zustand und Kontext der Komponente lösen kein erneutes Rendern aus.
5. MituseMemounduseCallbackder Unterschied
React.memo: wird verwendet, um die gesamte Komponente zu memoisieren und das Rendern der Komponente zu optimieren.useMemo: wird verwendet, um Werte oder berechnete Ergebnisse innerhalb von Funktionskomponenten zu memoisieren.useCallback: wird verwendet, um Callback-Funktionen innerhalb von Funktionskomponenten zu memoisieren, um unnötiges erneutes Erstellen zu vermeiden.
Beispiel
import ReactDOM from 'react-dom';
const ChildComponent = React.memo(({ onClick, count }) => {
console.log('Rendering ChildComponent');
return <button onClick={onClick}>Count: {count}</button>;
});
const App = () => {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(count + 1);
}, [count]);
const doubledCount = useMemo(() => count * 2, [count]);
return (
<div>
<p>Verdoppelte Anzahl: {doubledCount}</p>
<ChildComponent onClick={increment} count={count} />
</div>
);
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
In diesem Beispiel,useCallbackunduseMemowird verwendet, um Funktionen und berechnete Ergebnisse zu optimieren,React.memowird verwendet, um das Rendern von Kindkomponenten zu optimieren.
Zusammenfassung
React.memoist ein leistungsstarkes Werkzeug, das die Leistung von Funktionskomponenten effektiv verbessern und unnötige erneute Renderings vermeiden kann. Durch die Verwendung vonReact.memound benutzerdefinierten Vergleichsfunktionen können Sie die Anwendungsleistung erheblich optimieren, ohne die Anwendungslogik zu beeinträchtigen.