Class vs Functional Components in React a super tajná třetí možnost

Dávám přednost žvýkacím stolům.

Když začínám svůj útok na React, nejčastěji jsem slyšel otázku: „Proč bych pro všechny nepoužíval jen třídní komponentu? Proč vůbec obtěžovat funkční komponenty? “

Navzdory tomu, co by mohly říkat některé funkční programovací nástroje, není to nutně špatná otázka. Komponenty třídy nám nakonec poskytují mnohem větší flexibilitu, mnohem větší potenciál než jednoduchá „hloupá“ součást. Určitě existuje několik dobrých důvodů, proč jsme se obtěžovali s funkčními (nebo „bezstátovými“) součástkami, které bychom měli začít.

Po nějaké kopání je odpověď…

Subjektivní.

Pojďme tedy rychle projít dvěma typy a proč byste je měli chtít použít jeden nad druhým.

Funkční komponenty

Snad lépe známý v React komunitě jako 'Stateless' komponenty, to jsou přesně to, co říká na cínu: Stateless funkce. Vzhledem k tomu, že to není možné, aby používal své vlastní metody nebo odkazoval na to, veškerá složka bez státní příslušnosti může skutečně dosáhnout, je vykreslení vrácením nějaké JSX (nebo React.createElement (), pokud jste stará škola).

Nemají k tomu přístup, takže nemohou mít svůj vlastní stav, ani nemohou mít metody životního cyklu ze stejného důvodu. Pro ty potřebujete…

Komponenty třídy

Chléb a máslo z Reactovy struktury, komponenty třídy dokážou všechno: stav, metody životního cyklu, pravidelné metody a vykreslování, vše zabalené do uklizeného těla třídy.

Elegantní! Co teď použít?

Iluze volby

Jaký znepokojující titulky! Po přečtení toho, co je každé z nich, pravděpodobně přemýšlíte „samozřejmě, použijte komponentu bez státní příslušnosti, pokud potřebujete pouze vykreslit něco na základě rekvizit!“ A měli byste mít pravdu! To je obvykle důvod, proč byste měli uvažovat o použití komponenty bez státní příslušnosti, ale co výkon? Paměť?

Ty většinou závisí na velikosti komponenty třídy. Mějte na paměti, že oba tyto typy budou muset být transponovány, což samo o sobě bude mít vliv na paměť. Podrobnější soubor bude samozřejmě využívat více paměti a ovlivňovat výkon více než jednoduchá složka bez státní příslušnosti, která může být díky své síle tak velká, než byste měli pravděpodobně přehodnotit, zda by měla být pouze jednou nebo více složkami.

A co ta děsivá podtitul? Zeptejme se experta Reacta Dan Abramova sám.

Vezměte si to se zrnkem soli, protože v tomto bodě je to trochu datum a aktualizace v této záležitosti je obtížné vykopat a další vývojáři v týmu React říkali, že došlo k určitým zlepšením rychlosti funkčních součástí. Po dlouhou dobu se také hovořilo o optimalizaci komponent bez státní příslušnosti, aby se ukázaly jako užitečnější v řadě.

Po mém vlastním benchmarkovém testu se zdá, že funkční komponenty mají v průměru potenciál běžet asi o 20% rychleji, což není nic, co by otřáslo hůlkou.

A přesto… existuje ještě jiný způsob…

Spoiler Alert: skutečný je JavaScript

Vděčím za to, upřímně ohromující, pozorování středních článků 45% Faster React Functional Philippe Lehoux, nyní. Důvodem, proč funkční komponenty nejsou okamžitě mnohem rychlejší než komponenty třídy, je to, že stále rozšiřují React.Component a tím stále načítají veškerou logiku komponenty třídy!

Abychom tyto hloupé komponenty zrychlili, musíme obejít zbytečné zavazadlo, které nám React.Component předá, a pokud musíme Reactovi vzdát, je odpověď dobrá JS.

Výložník.

Vím. Je to tak jednoduché, ale tak krásné. Navíc v mých benchmarkových testech porazil normální komponentu třídy o 51%. 51!

Pojďme se podívat na transplantaci a uvidíme, proč tomu tak je.

Přímé volání funkce vs. okamžité spuštění komponenty

V našem běžném instančním komponentu jsme vnořili volání .createElement (), abychom vytvořili náš strom DOM, ale s přímými voláními funkcí můžeme jednoduše snížit návratnou hodnotu naší funkce.

Jaká je tedy pravda?

(promiň, ne promiň)

Na konci dne, co s sebou?

  1. Třídy jsou silnější a flexibilnější,
  2. Bez státní příslušnosti jsou o něco rychlejší (a vyžadují méně psaní!), S některými přísliby optimalizace,
  3. K dispozici je (poněkud netestovaný) speed-hack, pokud potřebujete vytlačit veškerý výkon, který můžete získat,
  4. Na konci dne udělejte, co je pro komponentu holé minimum. Pravděpodobně je to správná volba.