Móc là một bổ sung mới trong React 16. 8. Chúng cho phép bạn sử dụng trạng thái và các tính năng khác của React mà không cần viết lớp
Móc là. Trang này cung cấp tổng quan về Hook cho người dùng React có kinh nghiệm. Đây là một cái nhìn tổng quan có nhịp độ nhanh. Nếu bạn bối rối, hãy tìm một hộp màu vàng như thế này
Giải thích chi tiết
Đọc để tìm hiểu lý do tại sao chúng tôi giới thiệu Hooks to React
↑↑↑ Mỗi phần kết thúc bằng một ô màu vàng như thế này. Họ liên kết đến giải thích chi tiết
📌 Móc trạng thái
Ví dụ này hiển thị một bộ đếm. Khi bạn nhấp vào nút, nó sẽ tăng giá trị
import React, { useState } from 'react';
function Example[] {
// Declare a new state variable, which we'll call "count" const [count, setCount] = useState[0];
return [
You clicked {count} times
setCount[count + 1]}>
Click me
];
}
Ở đây,
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0 là một cái móc [chúng ta sẽ nói về ý nghĩa của điều này trong giây lát]. Chúng tôi gọi nó bên trong một thành phần chức năng để thêm một số trạng thái cục bộ vào nó. React sẽ duy trì trạng thái này giữa các lần kết xuất lại. function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0 trả về một cặp. giá trị trạng thái hiện tại và chức năng cho phép bạn cập nhật nó. Bạn có thể gọi chức năng này từ trình xử lý sự kiện hoặc ở nơi khác. Nó tương tự như function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
2 trong một lớp, ngoại trừ nó không hợp nhất trạng thái cũ và mới với nhau. [Chúng tôi sẽ đưa ra một ví dụ so sánh function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0 với function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
4 trong Sử dụng State Hook. ]Đối số duy nhất của
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0 là trạng thái ban đầu. Trong ví dụ trên, nó là function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
6 vì bộ đếm của chúng ta bắt đầu từ số không. Lưu ý rằng không giống như function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
4, trạng thái ở đây không nhất thiết phải là một đối tượng — mặc dù nó có thể là đối tượng nếu bạn muốn. Đối số trạng thái ban đầu chỉ được sử dụng trong lần kết xuất đầu tiênKhai báo nhiều biến trạng thái
Bạn có thể sử dụng State Hook nhiều lần trong một thành phần
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
Cú pháp cho phép chúng ta đặt các tên khác nhau cho các biến trạng thái mà chúng ta đã khai báo bằng cách gọi
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0. Những tên này không phải là một phần của API function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0. Thay vào đó, React giả định rằng nếu bạn gọi function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0 nhiều lần, thì bạn sẽ thực hiện theo cùng một thứ tự trong mỗi lần kết xuất. Chúng tôi sẽ quay lại lý do tại sao điều này hoạt động và khi điều này hữu ích sauNhưng Hook là gì?
Móc là các chức năng cho phép bạn “kết nối” với các tính năng trạng thái và vòng đời của React từ các thành phần chức năng. Móc không hoạt động bên trong lớp — chúng cho phép bạn sử dụng React mà không cần lớp. [Chúng tôi viết lại các thành phần hiện có của bạn qua đêm nhưng bạn có thể bắt đầu sử dụng Móc trong các thành phần mới nếu muốn. ]
React cung cấp một số Hook tích hợp như
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0. Bạn cũng có thể tạo Móc của riêng mình để sử dụng lại hành vi trạng thái giữa các thành phần khác nhau. Trước tiên, chúng ta sẽ xem xét các Móc tích hợpGiải thích chi tiết
Bạn có thể tìm hiểu thêm về State Hook trên một trang chuyên dụng. Sử dụng State Hook
⚡️ Móc hiệu ứng
Bạn có thể đã thực hiện tìm nạp dữ liệu, đăng ký hoặc thay đổi thủ công DOM từ các thành phần React trước đây. Chúng tôi gọi các thao tác này là “tác dụng phụ” [hay gọi tắt là “hiệu ứng”] vì chúng có thể ảnh hưởng đến các thành phần khác và không thể thực hiện được trong quá trình kết xuất
Móc hiệu ứng,
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
42, bổ sung khả năng thực hiện các tác dụng phụ từ một thành phần chức năng. Nó phục vụ cùng mục đích như function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
43, function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
44 và function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
45 trong các lớp React, nhưng hợp nhất thành một API duy nhất. [Chúng tôi sẽ đưa ra các ví dụ so sánh function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
42 với các phương pháp này trong Sử dụng Móc hiệu ứng. ]Ví dụ: thành phần này đặt tiêu đề tài liệu sau khi React cập nhật DOM
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
4Khi bạn gọi
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
42, bạn đang yêu cầu React chạy chức năng “hiệu ứng” của mình sau khi xóa các thay đổi đối với DOM. Các hiệu ứng được khai báo bên trong thành phần để chúng có quyền truy cập vào các đạo cụ và trạng thái của nó. Theo mặc định, React chạy các hiệu ứng sau mỗi lần kết xuất — kể cả lần kết xuất đầu tiên. [Chúng ta sẽ nói nhiều hơn về cách điều này so sánh với vòng đời của lớp trong phần Sử dụng Móc hiệu ứng. ]Các hiệu ứng cũng có thể tùy chọn chỉ định cách “dọn dẹp” sau chúng bằng cách trả về một chức năng. Ví dụ: thành phần này sử dụng hiệu ứng để đăng ký trạng thái trực tuyến của một người bạn và dọn sạch bằng cách hủy đăng ký trạng thái đó
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
1Trong ví dụ này, React sẽ hủy đăng ký khỏi
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
48 của chúng ta khi thành phần ngắt kết nối, cũng như trước khi chạy lại hiệu ứng do kết xuất tiếp theo. [Nếu bạn muốn, có một cách để nếu function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
49 chúng ta chuyển sang function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
48 không thay đổi. ]Giống như với
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0, bạn có thể sử dụng nhiều hơn một hiệu ứng trong một thành phầnfunction ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
6Móc cho phép bạn tổ chức các tác dụng phụ trong một thành phần theo những phần có liên quan [chẳng hạn như thêm và xóa đăng ký], thay vì buộc phân chia dựa trên các phương pháp vòng đời
Giải thích chi tiết
Bạn có thể tìm hiểu thêm về
42 trên một trang chuyên dụng. Sử dụng móc hiệu ứngfunction ExampleWithManyStates[] { // Declare multiple state variables! const [age, setAge] = useState[42]; const [fruit, setFruit] = useState['banana']; const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]]; // ... }
✌️ Quy tắc móc
Móc là các hàm JavaScript, nhưng chúng áp đặt hai quy tắc bổ sung
- Chỉ gọi Hook ở cấp cao nhất. Không gọi Hook bên trong các vòng lặp, điều kiện hoặc hàm lồng nhau
- Chỉ gọi Hook từ các thành phần chức năng React. Không gọi Hook từ các hàm JavaScript thông thường. [Chỉ có một nơi hợp lệ khác để gọi Móc - Móc tùy chỉnh của riêng bạn. Chúng ta sẽ tìm hiểu về chúng trong giây lát. ]
Chúng tôi cung cấp một plugin linter để tự động thực thi các quy tắc này. Chúng tôi hiểu rằng những quy tắc này thoạt đầu có vẻ hạn chế hoặc khó hiểu, nhưng chúng rất cần thiết để làm cho Móc hoạt động tốt
Giải thích chi tiết
Bạn có thể tìm hiểu thêm về các quy tắc này trên một trang chuyên dụng. Quy tắc móc
💡 Xây dựng móc của riêng bạn
Đôi khi, chúng tôi muốn sử dụng lại một số logic trạng thái giữa các thành phần. Theo truyền thống, có hai giải pháp phổ biến cho vấn đề này. các thành phần bậc cao hơn và đạo cụ kết xuất. Móc tùy chỉnh cho phép bạn làm điều này nhưng không cần thêm các thành phần khác vào cây của bạn
Trước đó trên trang này, chúng tôi đã giới thiệu thành phần
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
13 gọi Móc nối function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
0 và function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
42 để đăng ký trạng thái trực tuyến của một người bạn. Giả sử chúng ta cũng muốn sử dụng lại logic đăng ký này trong một thành phần khácĐầu tiên, chúng ta sẽ trích xuất logic này thành một Hook tùy chỉnh có tên là
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
16function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
2Nó lấy
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
17 làm đối số và trả về liệu bạn của chúng ta có trực tuyến hay khôngBây giờ chúng ta có thể sử dụng nó từ cả hai thành phần
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
4function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
5Trạng thái của mỗi thành phần là hoàn toàn độc lập. Móc là một cách để sử dụng lại logic trạng thái, không phải chính trạng thái. Trên thực tế, mỗi lệnh gọi Hook có trạng thái hoàn toàn biệt lập — vì vậy bạn thậm chí có thể sử dụng cùng một Hook tùy chỉnh hai lần trong một thành phần
Móc tùy chỉnh là một quy ước hơn là một tính năng. Nếu tên của một chức năng bắt đầu bằng ”______218” và nó gọi các Hook khác, thì chúng tôi nói đó là một Hook tùy chỉnh. Quy ước đặt tên
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
19 là cách plugin kẻ nói dối của chúng tôi có thể tìm lỗi trong mã bằng cách sử dụng MócBạn có thể viết các Móc tùy chỉnh bao gồm nhiều trường hợp sử dụng như xử lý biểu mẫu, hoạt ảnh, đăng ký khai báo, bộ hẹn giờ và có thể nhiều trường hợp khác mà chúng tôi chưa xem xét. Chúng tôi rất vui khi thấy cộng đồng React sẽ đưa ra những Móc tùy chỉnh nào
Giải thích chi tiết
Bạn có thể tìm hiểu thêm về Móc tùy chỉnh trên một trang chuyên dụng. Xây dựng móc của riêng bạn
🔌 Móc khác
Có một số Móc tích hợp ít được sử dụng hơn mà bạn có thể thấy hữu ích. Ví dụ: cho phép bạn đăng ký ngữ cảnh React mà không cần giới thiệu cách lồng
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
8Và cho phép bạn quản lý trạng thái cục bộ của các thành phần phức tạp bằng bộ giảm tốc
function ExampleWithManyStates[] {
// Declare multiple state variables!
const [age, setAge] = useState[42];
const [fruit, setFruit] = useState['banana'];
const [todos, setTodos] = useState[[{ text: 'Learn Hooks' }]];
// ...
}
9Giải thích chi tiết
Bạn có thể tìm hiểu thêm về tất cả các Móc tích hợp trên một trang chuyên dụng. Tham chiếu API móc
Bước tiếp theo
Phew, thật nhanh. Nếu một số điều không hoàn toàn hợp lý hoặc bạn muốn tìm hiểu chi tiết hơn, bạn có thể đọc các trang tiếp theo, bắt đầu với tài liệu State Hook
Bạn cũng có thể xem tài liệu tham khảo API Hooks và Câu hỏi thường gặp về Hooks
Cuối cùng, đừng bỏ lỡ trang giới thiệu giải thích lý do tại sao chúng tôi thêm Móc và cách chúng tôi sẽ bắt đầu sử dụng chúng song song với các lớp — mà không cần viết lại ứng dụng của chúng tôi