Thế giới của React Hooks và sự cô lập và khả năng tái sử dụng hooks-logic tùy chỉnh

Tram Ho

Giới thiệu:

React Hooks là một tính năng mới được thêm vào trong React 16.8 cho phép bạn sử dụng các tính năng của React như trạng thái mà không cần viết một lớp.

Trước React Hooks, có một vấn đề là việc sử dụng lại logic phụ thuộc vào thành phần và rất khó để mô đun hóa logic một mình.

Tuy nhiên, bằng cách sử dụng hook tùy chỉnh của React Hooks, đây là một hàm để tạo hook của riêng bạn, bạn chỉ có thể sử dụng lại logic mà không phụ thuộc vào View.

Trong bài viết này, tôi sẽ chỉ cho bạn cách sử dụng React Hooks bằng cách xem cách nó cải thiện từ v1 đến v6.

Trong ví dụ sau, số lượng mã trong thành phần được giảm đi như sau.

Giới thiệu Ví dụ:

Tạo một hook tùy chỉnh useLocalHistory thực hiện phân trang giữa các thành phần.

Nó giống như API lịch sử của trình duyệt của bạn.

https://oh7c3.csb.app/

v1 móc tùy chỉnh không được sử dụng:

Thành phần này có sự kết hợp giữa View và logic, điều này làm cho mã khó đọc và kiểm tra logic.

  • Trang.tsx

https://codesandbox.io/s/custom-hook-v1-tv2un

v2 Móc tùy chỉnh:

Tách logic khỏi thành phần thành các móc tùy chỉnh.

Lịch sử bị ẩn trong móc tùy chỉnh vì thông tin duy nhất mà thành phần cần là:

Giá trị là hiện tại

Các thao tác là Lên trên, Tiếp theo, Quay lại, Cuối cùng, Đặt lại

  • Trang.tsx

  • useLocalHistory.ts

https://codesandbox.io/s/custom-hook-v2-phjz4

Thành phần Trang rất dễ đọc, tập trung vào Xem các triển khai liên quan.

Định nghĩa giao diện v3

Xác định giao diện LocalHistory trong useLocalHistory.ts cung cấp chức năng lịch sử.

Thành phần Trang hoạt động thông qua giao diện LocalHistory.

  • Trang.tsx

  • useLocalHistory.ts

https://codesandbox.io/s/custom-hook-v3-cb016

Bằng cách xác định giao diện LocalHistory, sự liên quan của một loạt các hoạt động trở nên rõ ràng.

Nó cũng giúp bạn dễ dàng chuyển một loạt các thao tác cho các thành phần khác.

Tách cấu trúc dữ liệu v4 thành các móc tùy chỉnh riêng biệt:

Lịch sử địa phương được hiện thực hóa bằng cấu trúc dữ liệu của Ngăn xếp (LIFO).

Cắt nó ra như một móc tùy chỉnh useStack.

Vì hook tùy chỉnh có thể được định cấu hình trong nhiều giai đoạn, useStack cắt ra khỏi useLocalHistory sẽ được thực thi.

Thành phần Trang vẫn giữ nguyên và sẽ bị bỏ qua.

  • useLocalHistory.ts

  • useStack.ts

https://codesandbox.io/s/custom-hook-v4-mn2ub

Do đó, useLocalHistory chỉ có quyền điều khiển chuyển đổi màn hình dưới dạng logic mà không nhận thức được chi tiết triển khai của Stack.

Ngoài ra, mặc dù không được giải thích chi tiết nhưng setState cũng có cách nhận và cập nhật trạng thái trước đó.

https://codesandbox.io/s/custom-hook-v41-hokuq

v5 Sử dụng useReducer thay vì useState

v4 useStack yêu cầu bạn biết trạng thái hiện tại để thêm hoặc xóa khỏi mảng.

Đây không phải là vấn đề, nhưng nếu bạn muốn thực hiện xử lý cập nhật phụ thuộc vào trạng thái trước đó, chẳng hạn như khi vận hành một phần của mảng hoặc đối tượng, hãy sử dụng useReducer thay vì useState để mô tả nó ngắn gọn hơn. Bạn sẽ có thể.

Trong v4, hàm useStack là mã thủ tục sử dụng trạng thái trước đó của ngăn xếp, nhưng trong v5, như ACTIONS_POP, bây giờ nó đủ để kích hoạt một sự kiện mà không cần biết trạng thái trước đó. Ngoài ra, bộ giảm thiểu không cần phải viết mã thủ tục và có thể đạt được mục đích đơn giản bằng cách trả về một trạng thái mới.

Phương pháp viết này có thể quen thuộc với những người đã viết Redux, nhưng về cơ bản sử dụng useState như được mô tả trong tài liệu chính thức. Chúng tôi khuyên bạn chỉ nên sử dụng useReducer nếu bạn có logic trạng thái phức tạp liên quan đến nhiều giá trị hoặc nếu trạng thái tiếp theo phụ thuộc vào trạng thái trước đó.

https://codesandbox.io/s/custom-hook-v5-38z1m

Tách thành phần Container v6 và thành phần Thuyết trình

Tách các lớp gây ra tác dụng phụ.

Trong Redux, khuôn khổ buộc các lớp thực hiện kết nối phải được tách biệt, đó là cùng một chính sách thiết kế.

useLocalHistoryuseStack tương tự nhau nên chúng bị bỏ qua.

https://codesandbox.io/s/custom-hook-v6-yqrx4

Điều này làm cho thành phần Trang trở thành một hàm thuần túy nhận đối số và trả về giá trị trả về.

Thật tuyệt khi View trở thành một chức năng thuần túy, điều không thể tưởng tượng được trong quá trình phát triển GUI cũ.

Tuy nhiên, không phải lúc nào cũng cần áp dụng điều này. Hãy đưa ra quyết định phù hợp khi quyết định thuê.

Tóm lược

Các cải tiến sau đã được thực hiện từ v1 đến v6.

Tách miền trình bày

Ủy quyền các cấu trúc dữ liệu chung từ logic

lịch sử Lịch sử không chuyển đến thành phần Trang Ẩn thông tin (đóng gói)

Định nghĩa giao diện Nguyên tắc đóng mở (OCP)

Chức năng hóa của thành phần Trang Nhận các tác dụng phụ dưới dạng đối số mà không nhận chúng trong nội bộ

Làm rõ ý định thiết kế cho từng mô-đun Nguyên tắc trách nhiệm đơn lẻ (SRP)

Chúng tách biệt chế độ xem khỏi logic, cải thiện khả năng tái sử dụng, khả năng đọc và khả năng kiểm tra.

Với sự ra đời của các hook tùy chỉnh trong React Hooks, bạn có thể đóng gói các chi tiết về trạng thái và triển khai, chỉ hiển thị các giá trị và giao diện bạn cần cho các thành phần của mình.

Cũng như với PDS, các nguyên tắc ủy quyền, đóng gói và SOLID (OCP, SRP), các khả năng thiết kế phổ quát không khác gì thiết kế hướng đối tượng đã được phát triển cho đến nay là bắt buộc. Nó không yêu cầu các khả năng thiết kế dành riêng cho React Hooks.

Nếu bạn thực sự so sánh hook tùy chỉnh và class như sau, bạn có thể thấy rằng chúng tương tự nhau.

  • lớp học
  1. Trạng thái: Trường thành viên
  2. Hoạt động: Phương pháp
  3. Khởi tạo: Constructor
  • Móc tùy chỉnh
  1. Trạng thái: useState
  2. Hoạt động: Chức năng
  3. Khởi tạo: Đối số móc

Ngay cả khi bạn so sánh mã được triển khai, không có sự khác biệt lớn trong biểu thức cơ bản.

Thế giới được hiện thực hóa bởi React Hooks

Cho đến nay, logic của React phụ thuộc vào vòng đời của các thành phần React, và có một vấn đề là rất khó để mô đun hóa logic một mình và nó không thể sử dụng lại được. Nhưng với sự ra đời của React Hooks, nó đã được cải thiện.

Do đó, useStack và useLocalHistory được phát triển lần này không phụ thuộc vào View nên có thể tùy theo trường hợp sử dụng của bạn.

Bằng cách này, nó đã trở thành một thế giới mà logic React có thể dễ dàng được chia sẻ dưới dạng OSS.

Đây là ưu điểm lớn nhất của việc có thể thiết kế code gọn gàng.

OSS

Từ bây giờ, bạn nên xem qua React Hooks của OSS trước khi viết xử lý dựa trên trạng thái của riêng bạn.

Có thể bạn sẽ tìm thấy một cách triển khai tốt hơn dưới dạng PMNM phức tạp hơn so với cách bạn đã nghĩ ra.

Nó cũng sẽ rất hữu ích nếu bạn tự mình thực hiện.

https://github.com/streamich/react-use/

https://nikgraf.github.io/react-hooks/

https://usehooks.com/

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo