Đạo cụ mặc định với thành phần lớp
Sử dụng static defaultProps
là chính xác. Bạn cũng nên sử dụng các giao diện, không phải các lớp, cho các đạo cụ và trạng thái.
Cập nhật 2018/12/1 : TypeScript đã cải thiện việc kiểm tra loại liên quan đến defaultProps
theo thời gian. Đọc về cách sử dụng mới nhất và lớn nhất cho đến các vấn đề và cách sử dụng cũ hơn.
Dành cho TypeScript 3.0 trở lên
TypeScript đặc biệt bổ sung hỗ trợdefaultProps
để thực hiện công việc kiểm tra kiểu như bạn mong đợi. Thí dụ:
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>
);
}
}
Mà có thể được kết xuất và biên dịch mà không cần thông qua một foo
thuộc tính:
<PageComponent bar={ "hello" } />
Lưu ý rằng:
Đối với TypeScript 2.1 cho đến 3.0
Trước khi TypeScript 3.0 triển khai hỗ trợ trình biên dịch, defaultProps
bạn vẫn có thể sử dụng nó và nó hoạt động 100% với React khi chạy, nhưng vì TypeScript chỉ xem xét các đạo cụ khi kiểm tra các thuộc tính JSX mà bạn phải đánh dấu các đạo cụ có mặc định là tùy chọn ?
. Thí dụ:
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>
);
}
}
Lưu ý rằng:
- Đó là một ý tưởng tốt để chú thích
defaultProps
với Partial<>
để nó gõ-kiểm tra chống lại đạo cụ của bạn, nhưng bạn không cần phải cung cấp tất cả các tài sản cần thiết với giá trị mặc định, mà làm cho không có ý nghĩa vì các đặc tính cần thiết không bao giờ nên cần một mặc định.
- Khi sử dụng
strictNullChecks
giá trị của this.props.foo
sẽ là possibly undefined
và yêu cầu một xác nhận không null (nghĩa là this.props.foo!
) hoặc loại bảo vệ (tức là if (this.props.foo) ...
) để loại bỏ undefined
. Điều này gây khó chịu vì giá trị prop mặc định có nghĩa là nó thực sự sẽ không bao giờ được xác định, nhưng TS không hiểu luồng này. Đó là một trong những lý do chính TS 3.0 bổ sung hỗ trợ rõ ràng cho defaultProps
.
Trước TypeScript 2.1
Điều này hoạt động giống nhau nhưng bạn không có Partial
loại, vì vậy chỉ cần bỏ qua Partial<>
và cung cấp giá trị mặc định cho tất cả các đạo cụ cần thiết (mặc dù những mặc định đó sẽ không bao giờ được sử dụng) hoặc bỏ hoàn toàn chú thích loại rõ ràng.
Bạn có thể sử dụng defaultProps
vào các thành phần chức năng là tốt, nhưng bạn phải gõ chức năng của mình vào FunctionComponent
( StatelessComponent
trong @types/react
trước khi phiên bản 16.7.2
) giao diện để nguyên cảo biết về defaultProps
về chức năng:
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
Lưu ý rằng bạn không phải sử dụng Partial<PageProps>
bất cứ nơi nào vì FunctionComponent.defaultProps
đã được chỉ định là một phần trong TS 2.1+.
Một lựa chọn tốt khác (đây là những gì tôi sử dụng) là để cấu trúc các props
tham số của bạn và gán trực tiếp các giá trị mặc định:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
Sau đó, bạn không cần defaultProps
tất cả! Hãy lưu ý rằng nếu bạn làm cung cấp defaultProps
trên một thành phần chức năng nó sẽ được ưu tiên hơn các giá trị tham số mặc định, vì Phản ứng sẽ luôn luôn vượt qua một cách rõ ràng defaultProps
các giá trị (vì vậy các thông số không bao giờ undefined, do đó các thông số mặc định là không bao giờ được sử dụng.) Vì vậy, bạn muốn sử dụng cái này hay cái kia, không phải cả hai.
static defaultProps
đúng. Bạn có thể gửi mã đó?