Như đã nói trong docs , useCallback Trả về một cuộc gọi lại được ghi nhớ.
Vượt qua một cuộc gọi lại nội tuyến và một loạt các đầu vào. useCallback sẽ trả về một phiên bản ghi nhớ của cuộc gọi lại chỉ thay đổi nếu một trong những đầu vào đã thay đổi. Điều này hữu ích khi chuyển các cuộc gọi lại đến các thành phần con được tối ưu hóa dựa trên sự bình đẳng tham chiếu để ngăn chặn các kết xuất không cần thiết (ví dụ: ShouldComponentUpdate).
Giả sử <Button> được triển khai dưới dạng PureComponent, cách đầu tiên sẽ khiến <Button> hiển thị lại mỗi lần <Foo> tái hiện lại bởi vì một chức năng mới được tạo trong mỗi cuộc gọi render() . Theo cách thứ hai, phương thức handleClick chỉ được tạo một lần trong hàm tạo của <Foo> và được sử dụng lại qua các kết xuất.
Nếu chúng ta dịch cả hai cách tiếp cận thành phần chức năng bằng cách sử dụng hook, thì đây là các cách tương đương (sắp xếp):
1. Chức năng mũi tên trong kết xuất -> gọi lại không ghi nhớ
2. Ràng buộc trong Trình xây dựng (ES2015) -> Cuộc gọi lại được ghi nhớ
functionFoo() {constmemoizedHandleClick=useCallback( () =>console.log('Click happened'), [], ); // Tells React to memoize regardless of arguments.return <ButtononClick={memoizedHandleClick}>Click Me</Button>;}
Cách thứ nhất tạo ra cuộc gọi lại trên mỗi cuộc gọi của thành phần chức năng nhưng theo cách thứ hai, React ghi nhớ chức năng gọi lại cho bạn và cuộc gọi lại không được tạo nhiều lần.
Trong hầu hết các trường hợp, làm theo cách đầu tiên là tốt. Là trạng thái React docs:
Có thể sử dụng các hàm mũi tên trong phương thức kết xuất không? Nói chung, vâng, nó ổn, và nó thường là cách dễ nhất để truyền tham số cho các hàm gọi lại.
Nếu bạn có vấn đề về hiệu suất, bằng mọi cách, hãy tối ưu hóa!