😇React Context với TypeScript: Phần 3 - Context với các thành phần lớp
https://www.carlrippon.com/react-context-with-typescript-p3/
src\App.tsx
Đây là một bài đăng khác trong loạt bài đăng về React context với TypeScript. Trong bài đăng trước , chúng ta đã tạo một context phức tạp và sử dụng nó trong một thành phần hàm.
Phần 3 - Bối cảnh với các thành phần lớp (bài đăng này)
Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng React context với các thành phần lớp.
Đang cố gắng sử dụng móc ngữ cảnh trong một thành phần lớp
Chúng ta sẽ tiếp tục sử dụng ngữ cảnh đã tạo ở bài đăng trước cho phép người dùng chia sẻ và thiết lập chủ đề. Hãy cập nhật Header
thành phần thành thành phần lớp:
Tuy nhiên, việc triển khai này có một vấn đề:
Hook chỉ có thể được gọi bên trong các thành phần hàm, do đó, đoạn mã trên sẽ báo lỗi ở dòng sau:
Sử dụng context
tài sản
context
tài sảnCác thành phần lớp React có một context
thuộc tính mà chúng ta có thể sử dụng để sử dụng một ngữ cảnh. Đầu tiên, chúng ta cần cho lớp biết ngữ cảnh nào mà nó nên sử dụng với một static
contextType
thuộc tính, sau đó chúng ta có thể truy cập context
thuộc tính đó:
Lưu ý rằng chúng ta đặt dấu chấm than( !
) sau context
thuộc tính để báo cho trình biên dịch TypeScript biết rằng đây không phải là undefined
.
Chúng ta hãy xem những loại nào theme
đã setTheme
được suy ra như sau:
Cả hai theme
và setTheme
đều được suy ra là có any
kiểu.
Thiết lập rõ ràng loại cho context
thuộc tính
context
thuộc tínhHiện tại, ngữ cảnh được sử dụng không được đánh kiểu mạnh. Chúng ta có thể định nghĩa rõ ràng context
thuộc tính classes bằng chú thích kiểu để làm cho nó được đánh kiểu mạnh:
Lưu ý rằng chúng ta không sử dụng React.ContextType<ThemeContextType>
chú thích kiểu cho thuộc context
tính vì chúng ta sẽ nhận được lỗi kiểu nếu làm như vậy.
Có thể xem bản triển khai đầy đủ bằng cách nhấp vào liên kết bên dưới. Hãy thử và thay đổi giá trị chủ đề và xem màu nền thay đổi.
Sử dụng Consumer
thành phần
Consumer
thành phầnCó một cách tiếp cận thay thế để sử dụng ngữ cảnh trong thành phần lớp nếu chúng ta chỉ cần truy cập vào nó trong JSX. Phương pháp này là sử dụng Consumer
thành phần ngữ cảnh:
Thành phần con của Consumer
thành phần là một hàm có giá trị của ngữ cảnh được truyền vào và trả về JSX mà chúng ta muốn hiển thị. Lưu ý rằng chúng ta đã đặt dấu chấm than ( !
) sau khi tham chiếu value
để báo cho trình biên dịch TypeScript rằng đây không phải là undefined
.
Lợi ích của cách tiếp cận này là thuộc contextType
tính tĩnh không cần phải được triển khai. Chúng ta context
cũng không cần phải khai báo thuộc tính với chú thích kiểu của nó.
Hãy kiểm tra kiểu suy ra của value
tham số trong Consumer
hàm con của thành phần:
Kiểu của value
tham số làThemeContextType | undefined
Kết thúc
Chúng ta có thể sử dụng ngữ cảnh Reacts trong các thành phần lớp, nhưng chúng ta không thể sử dụng useContext
hook.
Sử dụng Consumer
thành phần là một cách hay để truy cập vào ngữ cảnh trong render
phương thức, trong đó kiểu của nó được suy ra một cách chính xác.
Thuộc context
tính có thể được sử dụng trong các phương thức vòng đời khác để truy cập vào ngữ cảnh. Chúng ta cần xác định rõ ràng chú thích kiểu cho thuộc context
tính và chỉ định ngữ cảnh cụ thể trong contextType
thuộc tính tĩnh.
Trong bài đăng tiếp theo, chúng ta sẽ tìm hiểu về cách tạo ngữ cảnh mà không cần phải truyền giá trị mặc định rồi thực hiện bất kỳ undefined
kiểm tra nào khi sử dụng ngữ cảnh đó.
Last updated
Was this helpful?