reactjs - care este diferența dintre ( )=>React.FC și ( )=>JSX.Element
În React, se pare că pot declara un component funcțional sau doar o funcție care returnează un element JSX. Ceea ce mă confundă este că nu știu diferența cheie dintre aceste două abordări. Există ceva ce poate face doar o abordare și cealaltă nu poate?
import React from "react";
type ItemProps = {
id: number
name: string
}
const Item: React.FC<ItemProps> = ({ id, name }) =>
(
<section>
my id is {id}
my name is {name}
</section>
)
const item = ({ id, name }: ItemProps) =>
(
<section>
my id is {id}
my name is {name}
</section>
)
export const Container = () =>
(
<section>
{item({ id: 1, name: "item-1" })}
<Item id={1} name={"item-1"} />
</section>
)
Răspuns #1
Rezumând diferențele:
React.FC:
- are o proprietate implicită
children, ceea ce înseamnă că, chiar dacă componenta ta nu permite copii, TypeScript nu s-ar plânge dacă foloseștiReact.FCși părintele transmite un children. Acest lucru nu afectează nimic la rulare, dar este mai bine să fii mai explicit cu privire la proprietatea children. Aceasta ar putea să dispară în următoarea versiune aReact.FC, chiar acum poți folosiReact.VFC - nu funcționează bine cu defaultProps
- nu permite generice
- nu poate fi folosit pentru a comenta o declarație de funcție, doar expresiile de funcție
- face ca tiparul „component ca un namespace” să fie dificil de scris
JSX.element + interfața de proprietăți
- nu are o proprietate implicită children, așa că trebuie să o declari explicit, ceea ce este bine, și unii oameni preferă oricum tipul de returnare implicit. Aceasta nu are suport implicit pentru alte proprietăți/statice cum ar fi
propTypes,displayNameetc., așa că acestea ar trebui adăugate explicit dacă sunt necesare. - nu ține cont de proprietățile implicite, aceasta este doar o tipizare obișnuită a funcțiilor pentru argumente și tipurile de returnare
- poate fi folosit cu generice
- poate fi folosit pentru a adnota o declarație de funcție, precum și expresii
Resurse
- https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/function_components/
- https://fettblog.eu/typescript-react-de-ce-nu-folosesc-react-fc/
- https://github.com/facebook/create-react-app/pull/8177
Răspunsul #2
React.FC oferă suport pentru verificarea tipurilor
De asemenea, poți scrie componente cu React.FunctionComponent (sau prescurtarea React.FC - sunt la fel):
const App: React.FunctionComponent<{ message: string }> = ({ message }) => (
<div>{message}</div>
);
Unele diferențe față de versiunea „funcției normale”: :
- React.FunctionComponent este explicit în ceea ce privește tipul de retur, în timp ce versiunea normală a funcției este implicită (sau altfel necesită o adnotare suplimentară).
Oferă verificare de tip și completare automată pentru proprietăți statice precum displayName, propTypes și defaultProps.
- Rețineți că există unele probleme cunoscute la utilizarea defaultProps cu
React.FunctionComponent. Consultați această problemă pentru detalii. Menținem o
secțiune separată defaultProps pe care o puteți consulta de asemenea.
- Rețineți că există unele probleme cunoscute la utilizarea defaultProps cu
Consultați documentația pentru mai multe informații
https://github.com/typescript-cheatsheets/react/blob/main/README.md#section-2-getting-started
