Đạo cụ mặc định với thành phần lớp
Sử dụng static defaultPropslà 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 defaultPropstheo 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 foothuộ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, defaultPropsbạ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
defaultPropsvớ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
strictNullChecksgiá trị của this.props.foosẽ là possibly undefinedvà 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ó Partialloạ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 defaultPropsvà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( StatelessComponenttrong @types/reacttrước khi phiên bản 16.7.2) giao diện để nguyên cảo biết về defaultPropsvề 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 propstham 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 defaultPropstất cả! Hãy lưu ý rằng nếu bạn làm cung cấp defaultPropstrê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 defaultPropscá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ã đó?