😍React Context với TypeScript: Phần 4 - Tạo một context không có default và không có undefined check
https://codesandbox.io/p/sandbox/react-ts-context-no-default-8ch32?file=%2Fsrc%2Findex.tsx
src\App.tsx
Đây là bài đăng cuối cùng trong loạt bài đăng về React context với TypeScript. Trong bài đăng trước , chúng ta đã sử dụng một context trong một thành phần lớp. Trong bài đăng này, chúng ta sẽ tìm hiểu cách tạo một context mà không cần phải truyền default và sau đó thực hiện bất kỳ undefined
kiểm tra nào khi sử dụng context đó.
Phần 3 - Bối cảnh với các thành phần lớp
Phần 4 - Tạo ngữ cảnh không có kiểm tra mặc định và không có kiểm tra không xác định (bài đăng này)
Vấn đề
Kiểu for createContext
yêu cầu một giá trị mặc định được truyền vào, nhưng thường thì không hợp lý khi truyền giá trị mặc định. Vì vậy, cuối cùng chúng ta truyền undefined
giá trị mặc định:
… và sau đó kiểm tra undefined
mọi nơi chúng ta tiêu thụ nó:
Một giải pháp nhanh chóng
Một giải pháp nhanh chóng cho vấn đề này là sử dụng toán tử khẳng định không null và loại bỏ undefined
khỏi kiểu ngữ cảnh.
Điều này hoạt động tốt vì việc sử dụng mã không cần undefined
kiểm tra. Tuy nhiên, chúng ta vẫn đang truyền một giá trị mặc định.
Tạo một wrapper để tạo ngữ cảnh
Một giải pháp là tạo một lớp bao bọc xung quanh createContext
để xử lý giá trị mặc định và giá trị undefined
kiểm tra:
Hàm này trước tiên tạo ngữ cảnh với kiểu chung được truyền vào với undefined
giá trị mặc định.
Sau đó, một hàm lồng nhau được định nghĩa, hàm này sẽ bao bọc useContext
hook. Một biến c
được gán cho giá trị trả về của useContext
hook, là kiểu chung được truyền vào or undefined
:
Sau đó chúng ta sẽ ném lỗi nếu c
là falsy, lỗi này sẽ xử lý việc undefined
kiểm tra. Điều này có nghĩa là khi c
được trả về từ hàm lồng nhau, nó không thể undefined
và chỉ là kiểu chung mà chúng ta đã truyền vào:
Lưu ý chúng ta cũng sử dụng khẳng định const ( as const
) ở dòng cuối cùng để đảm bảo TypeScript suy ra kiểu tuple chứ không phải mảng các kiểu hợp nhất.
Tạo bối cảnh
Bây giờ chúng ta có thể sử dụng createCtx
hàm của mình để tạo ngữ cảnh thay vì hàm của React createContext
:
Tạo nhà cung cấp
Hàm của chúng tôi createCtx
trả về một tuple, chứa một thành phần nhà cung cấp trong phần tử thứ hai ( CtxProvider
). Chúng tôi có thể tạo thành phần nhà cung cấp cụ thể chứa trạng thái bắt buộc của mình:
Sau đó có thể đặt nó vào vị trí thích hợp trong cây thành phần:
Tiêu thụ bối cảnh
Our createCtx
cũng trả về một hook ( useTheme
) trong phần tử đầu tiên của tuple. Chúng ta có thể sử dụng mà không cần phải thực hiện bất kỳ undefined
kiểm tra nào:
Gọn gàng!
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.
Last updated
Was this helpful?