Kolejna lekcja, poznajemy tym razem komponenty, propsy oraz default props. Zbieramy do kupy umiejętności Reacta i TSa, małymi kroczkami do celu. Zaczynajmy.
Ok, tworzymy folder components, w nim Heading.tsx:
import { ReactElement } from "react"
const Heading= () => {
}
export default Heading;
Czyli importy na górze, RFC, export default, aby się dało importować w App.tsx. Przykład importu:
import Heading from './components/Heading';
Ok, spoko, napiszmy sobie te propsy i użyjmy ich:
type HeadingProps = { title: string };
const Heading= ({ title } : HeadingProps): ReactElement => {
return <h1>{title}</h1>
}
Ok, zaimportowane w App.tsx, to możemy użyć:
<Heading title={"Hello"} />
Działa? Ok, a teraz spróbujmy przekazać coś źle:
<Heading title={"Hello"} />
<Heading />
<Heading title={1} />
<Heading title={"Hello"} sth="blabla" />
<Heading title={"Hello"}>
<p>Hello world</p>
</Heading>
I TS nie pozwala nam pominąć title, ani przekazać innego typu, niż string, ani też utworzyć sobie innego propsa, którego nie ma w naszym interfejsie. Nawet dzieci nie możemy przekazać, tak, jak to zdefiniowaliśmy, to mamy self-closing component, żadne dzieci tam nie mają prawa być.
Ok, pomału, ogarnijmy sobie default props. Zostawmy to:
<Heading title={"Hello"} />
<Heading />
Dodajmy do title w propsach znak ?:
import { ReactElement } from "react"
type HeadingProps = { title?: string };
const Heading= ({ title } : HeadingProps): ReactElement => {
return <h1>{title}</h1>
}
//(parameter) title: string | undefined
export default Heading;
Niby fajnie, ale teraz widzimy, jaki typ mamy. Może być undefined. Ok, ale teraz wystarczy tylko podać domyślną wartość:
import { ReactElement } from "react"
type HeadingProps = { title?: string };
const Heading= ({ title = 'default title' } : HeadingProps): ReactElement => {
return <h1>{title}</h1>
}
//(parameter) title: string
export default Heading;
I działa. Kiedyś jakieś dziwne kombinacje trzeba było odstawiać, dzisiaj tj. od Reacta 18.3 zdaje się, już można w ten sposób robić defaultowe propsy.
Więcej Reacta i TSa niedługo!