Alat peraga bawaan dengan komponen kelas
Penggunaannya static defaultProps
benar. Anda juga harus menggunakan antarmuka, bukan kelas, untuk alat peraga dan negara.
Pembaruan 2018/12/1 : TypeScript telah meningkatkan pemeriksaan tipe yang terkait dengan defaultProps
waktu. Baca terus untuk penggunaan terbaru dan terhebat hingga penggunaan dan masalah yang lebih lama.
Untuk TypeScript 3.0 dan lebih tinggi
TypeScript secara khusus menambahkan dukungan untukdefaultProps
membuat pemeriksaan jenis berfungsi seperti yang Anda harapkan. Contoh:
interface PageProps {
foo: string;
bar: string;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, { this.props.foo.toUpperCase() }</span>
);
}
}
Yang dapat dirender dan dikompilasi tanpa melewati foo
atribut:
<PageComponent bar={ "hello" } />
Perhatikan bahwa:
foo
adalah tidak ditandai opsional (yaitu foo?: string
) meskipun itu tidak diperlukan sebagai atribut BEJ. Menandai sebagai opsional berarti bahwa itu bisa saja undefined
, tetapi sebenarnya tidak akan pernah undefined
karena defaultProps
memberikan nilai default. Anggap saja mirip dengan bagaimana Anda dapat menandai parameter fungsi opsional, atau dengan nilai default, tetapi tidak keduanya, namun keduanya berarti panggilan tidak perlu menentukan nilai . TypeScript 3.0+ memperlakukan defaultProps
dengan cara yang serupa, yang sangat keren untuk pengguna Bereaksi!
- Tidak
defaultProps
memiliki anotasi jenis eksplisit. Jenisnya disimpulkan dan digunakan oleh kompiler untuk menentukan atribut JSX mana yang diperlukan. Anda bisa menggunakan defaultProps: Pick<PageProps, "foo">
untuk memastikan defaultProps
kecocokan sub-set dari PageProps
. Lebih lanjut tentang peringatan ini dijelaskan di sini .
- Ini membutuhkan
@types/react
versi 16.4.11
untuk berfungsi dengan baik.
Untuk TypeScript 2.1 hingga 3.0
Sebelum TypeScript 3.0 menerapkan dukungan kompiler untuk defaultProps
Anda masih bisa memanfaatkannya, dan itu bekerja 100% dengan Bereaksi pada saat runtime, tetapi karena TypeScript hanya mempertimbangkan alat peraga ketika memeriksa atribut JSX Anda harus menandai alat peraga yang memiliki standar sebagai opsional dengan ?
. Contoh:
interface PageProps {
foo?: string;
bar: number;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps: Partial<PageProps> = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, world</span>
);
}
}
Perhatikan bahwa:
- Ini adalah ide yang baik untuk membuat catatan
defaultProps
dengan itu Partial<>
sehingga ketik-cek terhadap alat peraga Anda, tetapi Anda tidak harus menyediakan setiap properti yang diperlukan dengan nilai default, yang tidak masuk akal karena properti yang diperlukan seharusnya tidak pernah membutuhkan default.
- Saat menggunakan
strictNullChecks
nilai this.props.foo
akan possibly undefined
dan membutuhkan pernyataan non-nol (yaitu this.props.foo!
) atau tipe-penjaga (yaitu if (this.props.foo) ...
) untuk menghapus undefined
. Ini menjengkelkan karena nilai prop standar berarti sebenarnya tidak akan pernah dapat ditentukan, tetapi TS tidak memahami aliran ini. Itulah salah satu alasan utama TS 3.0 menambahkan dukungan eksplisit untuk defaultProps
.
Sebelum TypeScript 2.1
Ini berfungsi sama tetapi Anda tidak memiliki Partial
jenis, jadi abaikan saja Partial<>
dan berikan nilai standar untuk semua alat peraga yang diperlukan (meskipun standar itu tidak akan pernah digunakan) atau abaikan anotasi jenis eksplisit sepenuhnya.
Anda dapat menggunakan defaultProps
komponen fungsi juga, tetapi Anda harus mengetikkan fungsi Anda ke antarmuka FunctionComponent
( StatelessComponent
dalam @types/react
versi sebelum 16.7.2
) sehingga TypeScript tahu tentang defaultProps
fungsi:
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
Perhatikan bahwa Anda tidak harus menggunakan di Partial<PageProps>
mana pun karena FunctionComponent.defaultProps
sudah ditentukan sebagai parsial di TS 2.1+.
Alternatif lain yang bagus (ini yang saya gunakan) adalah merusak props
parameter Anda dan menetapkan nilai default secara langsung:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
Maka Anda tidak perlu defaultProps
sama sekali! Sadarilah bahwa jika Anda tidak memberikan defaultProps
pada komponen fungsi itu akan lebih diutamakan daripada nilai parameter default, karena Bereaksi akan selalu secara eksplisit lulus defaultProps
nilai (sehingga parameter tidak pernah terdefinisi, sehingga parameter default tidak pernah digunakan.) Jadi, Anda akan menggunakan satu atau yang lain, tidak keduanya.
static defaultProps
benar. Bisakah Anda memposting kode itu?