0
0
Lập trình
NM

Giải thích useMemo và useCallback trong React

Đăng vào 6 tháng trước

• 4 phút đọc

Chủ đề:

KungFuTech

Giới thiệu

Trong phát triển ứng dụng React, việc tối ưu hóa hiệu suất là rất quan trọng, đặc biệt khi làm việc với các component phức tạp. Hai hook quan trọng giúp cải thiện hiệu suất của ứng dụng là useMemouseCallback. Bài viết này sẽ giải thích chi tiết về cách sử dụng và sự khác biệt giữa hai hook này, đồng thời cung cấp các ví dụ thực tế, mẹo tối ưu hóa và những cạm bẫy phổ biến.

Mục lục

  1. Khái niệm về useMemo
  2. Khái niệm về useCallback
  3. Sự khác biệt giữa useMemo và useCallback
  4. Tình huống thực tế
  5. Thực hành tốt nhất
  6. Cạm bẫy phổ biến
  7. Mẹo hiệu suất
  8. Giải quyết vấn đề
  9. Kết luận

Khái niệm về useMemo

useMemo là một hook trong React cho phép bạn ghi nhớ (memoize) giá trị của một biểu thức. Hook này sẽ chỉ chạy lại hàm tạo ra giá trị khi các phụ thuộc (dependencies) thay đổi. Điều này giúp ngăn chặn việc tính toán lại các giá trị không cần thiết, từ đó cải thiện hiệu suất ứng dụng.

Cú pháp

javascript Copy
const sum = useMemo(() => a + b, [a, b]);

Ví dụ thực tế

Giả sử bạn có một component cần tính tổng của hai số, nhưng việc tính toán lại có thể tốn kém về hiệu suất. Bạn có thể sử dụng useMemo như sau:

javascript Copy
import React, { useMemo, useState } from 'react';

function Calculator() {
  const [a, setA] = useState(0);
  const [b, setB] = useState(0);
  
  const sum = useMemo(() => a + b, [a, b]);

  return (
    <div>
      <input type='number' value={a} onChange={e => setA(Number(e.target.value))} />
      <input type='number' value={b} onChange={e => setB(Number(e.target.value))} />
      <p>Tổng: {sum}</p>
    </div>
  );
}

Mẹo sử dụng

  • Chỉ sử dụng useMemo cho các phép tính phức tạp hoặc tốn kém thời gian.
  • Đảm bảo rằng các phụ thuộc được định nghĩa chính xác để tránh lỗi.

Khái niệm về useCallback

useCallback là một hook tương tự như useMemo, nhưng thay vì ghi nhớ giá trị, nó ghi nhớ một hàm. Điều này rất hữu ích khi bạn cần truyền các callback cho các component con hoặc hooks.

Cú pháp

javascript Copy
const handleClick = useCallback(() => {
  console.log("Clicked!");
}, []);

Ví dụ thực tế

Khi bạn cần truyền một hàm xử lý sự kiện đến component con:

javascript Copy
import React, { useCallback, useState } from 'react';

function Button({ onClick }) {
  return <button onClick={onClick}>Click me</button>;
}

function Parent() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    setCount(count + 1);
    console.log('Button clicked!');
  }, [count]);

  return <Button onClick={handleClick} />;
}

Sự khác biệt giữa useMemo và useCallback

  • useMemo: ghi nhớ kết quả của hàm.
  • useCallback: ghi nhớ chính hàm.

Phân tích

  • Sử dụng useMemo khi bạn cần tối ưu hóa phép tính và muốn lưu trữ kết quả của một biểu thức phức tạp.
  • Sử dụng useCallback khi bạn cần tối ưu hóa việc truyền hàm callback cho các component con.

Tình huống thực tế

Ví dụ 1: Tối ưu hóa danh sách

Khi bạn có một danh sách lớn và thực hiện các phép toán trên các mục trong danh sách, việc sử dụng useMemo có thể giúp cải thiện hiệu suất:

javascript Copy
const filteredItems = useMemo(() => {
  return items.filter(item => item.active);
}, [items]);

Ví dụ 2: Ghi nhớ hàm callback

Khi bạn có nhiều component con và mỗi component đều nhận một hàm callback từ component cha:

javascript Copy
const handleDelete = useCallback((id) => {
  setItems(prevItems => prevItems.filter(item => item.id !== id));
}, []);

Thực hành tốt nhất

  • Sử dụng useMemouseCallback hợp lý: Không nên lạm dụng hai hook này cho mọi trường hợp, chỉ khi cần thiết để tối ưu hóa hiệu suất.
  • Kiểm tra hiệu suất: Sử dụng React DevTools để kiểm tra xem component có đang render lại không cần thiết hay không.

Cạm bẫy phổ biến

  • Quên cập nhật phụ thuộc: Khi sử dụng useMemouseCallback, nếu không cập nhật phụ thuộc đúng cách, điều này có thể dẫn đến lỗi không mong muốn.
  • Lạm dụng: Sử dụng hai hook này cho mọi trường hợp có thể làm cho mã trở nên khó hiểu và không cần thiết.

Mẹo hiệu suất

  • Sử dụng React.memo: Kết hợp useMemo, useCallback với React.memo để tối ưu hóa cả component cha và con.
  • Sử dụng Profiler: Đo lường hiệu suất của component để biết khi nào cần tối ưu hóa.

Giải quyết vấn đề

Nếu bạn gặp phải vấn đề với useMemo hoặc useCallback, hãy kiểm tra:

  • Các phụ thuộc có được xác định chính xác hay không.
  • Có cần thiết phải sử dụng hook này hay không.

Kết luận

useMemouseCallback là hai hook mạnh mẽ giúp tối ưu hóa hiệu suất trong ứng dụng React. Bằng cách sử dụng chúng đúng cách, bạn có thể cải thiện khả năng phản hồi và hiệu suất của ứng dụng. Hãy thử áp dụng các mẹo và thực hành tốt nhất mà chúng tôi đã đề cập trong bài viết này để phát triển các ứng dụng React hiệu quả hơn.

Câu hỏi thường gặp

1. Khi nào nên sử dụng useMemo?
Sử dụng useMemo khi bạn có phép tính tốn kém và muốn tránh việc tính toán lại.

2. useCallback có cần thiết không?
Có, nếu bạn cần truyền callback cho component con, useCallback sẽ giúp ghi nhớ hàm và tránh việc render lại không cần thiết.

3. Có cách nào khác để tối ưu hóa hiệu suất không?
Có, bạn có thể sử dụng React.memo, lazy loading, và code splitting để tối ưu hóa thêm cho ứng dụng của mình.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào