Masz dobry pomysł. Idź z funkcjonalnością, jeśli twój komponent nie robi nic więcej niż przyjmowanie niektórych rekwizytów i renderowanie. Możesz myśleć o nich jako o czystych funkcjach, ponieważ zawsze będą renderować i zachowywać się tak samo, biorąc pod uwagę te same rekwizyty. Nie dbają też o metody cyklu życia ani nie mają własnego stanu wewnętrznego.
Ponieważ są one lekkie, pisanie tych prostych elementów jako elementów funkcjonalnych jest dość standardowe.
Jeśli komponenty wymagają większej funkcjonalności, np. Utrzymania stanu, użyj klas.
Więcej informacji: https://facebook.github.io/react/docs/reusable-components.html#es6-classes
EDYCJA : Wiele z powyższych było prawdą, dopóki nie wprowadzono React Hooks.
componentDidUpdate
można zreplikować za pomocą useEffect(fn)
, gdzie fn
jest funkcja uruchamiana przy ponownym renderowaniu.
componentDidMount
metody mogą być replikowane useEffect(fn, [])
, gdzie fn
jest funkcja uruchamiana przy ponownym renderowaniu, i []
jest tablicą obiektów, dla których komponent ponownie się wyrenderuje, tylko wtedy, gdy przynajmniej jedna zmieniła wartość od poprzedniego renderowania. Ponieważ ich nie ma, useEffect()
uruchamia się raz na pierwszym montażu.
state
może być zreplikowany useState()
, którego wartość zwracaną można zniszczyć do odwołania do stanu i funkcji, która może ustawić stan (tj const [state, setState] = useState(initState)
.). Przykład może to wyjaśnić jaśniej:
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
Jeśli chodzi o zalecenie, kiedy stosować klasę zamiast komponentów funkcjonalnych, Facebook oficjalnie zaleca używanie komponentów funkcjonalnych tam, gdzie to możliwe . Nawiasem mówiąc, słyszałem wiele osób dyskutujących o nieużywaniu komponentów funkcjonalnych ze względu na wydajność, a konkretnie z tego powodu
„Funkcje obsługi zdarzeń są redefiniowane dla poszczególnych renderów w komponentach funkcjonalnych”
Chociaż to prawda, zastanów się, czy Twoje komponenty naprawdę renderują z taką prędkością lub głośnością, że byłoby to warte zaniepokojenia.
Jeśli tak, możesz zapobiec przedefiniowaniu funkcji za pomocą useCallback
i useMemo
hooków. Należy jednak pamiętać, że może to pogorszyć działanie (mikroskopowo) kodu .
Ale szczerze mówiąc, nigdy nie słyszałem o ponownym definiowaniu funkcji stanowiących wąskie gardło w aplikacjach React. Przedwczesne optymalizacje są źródłem wszelkiego zła - martw się o to, gdy jest to problem