Sie haben die richtige Idee. Gehen Sie mit funktional, wenn Ihre Komponente nicht viel mehr tut, als einige Requisiten aufzunehmen und zu rendern. Sie können sich diese als reine Funktionen vorstellen, da sie bei gleichen Requisiten immer gleich gerendert werden und sich gleich verhalten. Außerdem interessieren sie sich nicht für Lebenszyklusmethoden oder haben ihren eigenen internen Status.
Da sie leicht sind, ist das Schreiben dieser einfachen Komponenten als Funktionskomponenten ziemlich Standard.
Wenn Ihre Komponenten mehr Funktionen benötigen, z. B. den Status beibehalten, verwenden Sie stattdessen Klassen.
Weitere Informationen: https://facebook.github.io/react/docs/reusable-components.html#es6-classes
EDIT : Vieles davon stimmte bis zur Einführung von React Hooks.
componentDidUpdate
kann repliziert werden mit useEffect(fn)
, wo fn
ist die Funktion, die beim erneuten Rendern ausgeführt werden soll.
componentDidMount
Methoden können repliziert werden mit useEffect(fn, [])
, wobei fn
die Funktion beim erneuten Rendern ausgeführt werden soll und []
ein Array von Objekten ist, für die die Komponente genau dann erneut rendern wird, wenn mindestens eines den Wert seit dem vorherigen Rendern geändert hat. Da es keine gibt, useEffect()
wird beim ersten Mount einmal ausgeführt.
state
kann repliziert werden mit useState()
, dessen Rückgabewert auf eine Referenz des Zustands und eine Funktion, die den Zustand festlegen kann (dh const [state, setState] = useState(initState)
), zerstört werden kann. Ein Beispiel könnte dies klarer erklären:
const Counter = () => {
const [count, setCount] = useState(0)
const increment = () => {
setCount(count + 1);
}
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>+</button>
</div>
)
}
default export Counter
In Bezug auf die Empfehlung, wann Klasse über Funktionskomponenten verwendet werden soll, empfiehlt Facebook offiziell , wo immer möglich Funktionskomponenten zu verwenden . Abgesehen davon habe ich eine Reihe von Leuten gehört, die darüber diskutierten, aus Leistungsgründen keine funktionalen Komponenten zu verwenden, insbesondere aus diesem Grund
"Ereignisbehandlungsfunktionen werden pro Render in Funktionskomponenten neu definiert"
Bitte prüfen Sie, ob Ihre Komponenten tatsächlich mit einer solchen Geschwindigkeit oder Lautstärke gerendert werden, dass dies Anlass zur Sorge gibt.
Wenn dies der Fall ist, können Sie verhindern, dass Funktionen mithilfe von useCallback
und useMemo
Hooks neu definiert werden. Beachten Sie jedoch, dass dies die Leistung Ihres Codes (mikroskopisch) beeinträchtigen kann .
Aber ehrlich gesagt habe ich noch nie davon gehört, dass die Neudefinition von Funktionen ein Engpass in React-Apps ist. Vorzeitige Optimierungen sind die Wurzel allen Übels - machen Sie sich darüber Sorgen, wenn es ein Problem ist