- vừa được xem lúc

Làm chủ Bộ hẹn giờ (Timers) trong React: Hướng dẫn toàn diện cho lập trình viên

0 0 1

Người đăng: Thái Thịnh

Theo Viblo Asia

Bộ hẹn giờ trong React có thể gây khó khăn nếu bạn không chú ý đến các chi tiết quan trọng. Hãy cùng khám phá cách sử dụng timers đúng cách, tránh rò rỉ bộ nhớ và vấn đề closure, đồng thời tìm hiểu các phương pháp tối ưu nhất.

Nguyên tắc chính khi làm việc với Timers

Khi sử dụng timers trong React, bạn cần lưu ý:

  • Dọn dẹp tài nguyên khi một component bị unmount.
  • Xử lý closures đúng cách.
  • Quản lý sự thay đổi trạng thái của component.

Tại sao useEffectuseRef quan trọng đối với Timers?

Sự kết hợp giữa useEffectuseRef giúp giải quyết các vấn đề quan trọng trong việc triển khai timers một cách đơn giản.

Vai trò của useEffect

useEffect quản lý vòng đời của timer bằng cách:

  • Tạo một setInterval mới khi component được mount hoặc khi dependencies thay đổi.
  • Đảm bảo rằng interval được xóa khi dependencies thay đổi hoặc component bị unmount, tránh tạo ra nhiều timers trùng lặp.

Sức mạnh của useRef

useRef có hai chức năng quan trọng:

  • Lưu trữ ID của interval để có thể xóa nó sau này.
  • Đảm bảo callback luôn tham chiếu đến phiên bản mới nhất, tránh lỗi liên quan đến closure.

Triển khai hook useInterval tùy chỉnh

Dưới đây là một hook useInterval hỗ trợ tạm dừng và tiếp tục interval:

import { useEffect, useRef, useState } from 'react'; export const useInterval = (callback: () => void, interval = 1000) => { const [active, setActive] = useState(true); const intervalIdRef = useRef<ReturnType<typeof setInterval>>(); const callbackRef = useRef(callback); // Update the reference to the latest callback useEffect(() => { callbackRef.current = callback; }, [callback]); useEffect(() => { if (!active) return; intervalIdRef.current = setInterval(() => callbackRef.current(), interval); return () => clearInterval(intervalIdRef.current); }, [active, interval]); return { active, pause: () => setActive(false), resume: () => setActive(true), toggle: () => setActive(prev => !prev) };
};

Phân tích mã nguồn

  • Giữ callback luôn cập nhật: useRef giúp lưu trữ hàm callback, tránh lỗi closure.
  • Kiểm soát trạng thái của timer: Biến active quản lý trạng thái đang chạy hay dừng của interval.
  • Dọn dẹp interval: useEffect đảm bảo gọi clearInterval(intervalIdRef.current); để tránh rò rỉ bộ nhớ.

Các cách triển khai timers khác

Timer một lần duy nhất với useTimeout

Nếu bạn muốn thực thi timer chỉ một lần, hãy sử dụng useTimeout:

import { useEffect, useRef } from 'react'; export const useTimeout = (callback: () => void, delay: number) => { const callbackRef = useRef(callback); useEffect(() => { callbackRef.current = callback; }, [callback]); useEffect(() => { const timer = setTimeout(() => callbackRef.current(), delay); return () => clearTimeout(timer); }, [delay]);
};

Kết luận

Timers trong React yêu cầu cách tiếp cận cẩn thận: quản lý vòng đời, xử lý closures và ngăn chặn rò rỉ bộ nhớ. Hãy sử dụng useRefuseEffect để có một giải pháp timers tối ưu. Đối với các trường hợp phức tạp hơn, bạn có thể cân nhắc sử dụng các thư viện chuyên dụng giúp quản lý timers hiệu quả hơn.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tìm hiểu về Redux Thunk

Chào mọi người, nếu bạn là người đã biết về React và đang làm quen với Redux chắc hẳn bạn đang rất mơ hồ về các khái niệm cơ bản của Redux như dispatch, store, action creator,... bạn còn đang vật lộn với đống document của Redux để hiểu những khái niệm đó và bạn nghe ai đó trong team nói về Redux Thu

0 0 401

- vừa được xem lúc

[React] Giới thiệu tổng quát về Redux Toolkit

1. Redux Toolkit (RTK) là gì và tại sao lại có nó. . .

0 0 6.6k

- vừa được xem lúc

Uống Pepsi code Vue đi - Uống Cocacola code React nha ;)

. (Nguồn ảnh: Internet). Chào các bạn, chào các bạn. Let's go . 1.

0 0 149

- vừa được xem lúc

Cài đặt taillwind css cho dự án React

Trong bài viết cùng mình tìm hiểu cách cài đặt tailwind css cho một dự án React sẵn có. .

0 0 148

- vừa được xem lúc

Formik vs React Hook Form (Phần 1)

Các lập trình viên Front End đều làm việc rất nhiều với form cùng sự phức tạp của ứng dụng. Do vậy chúng ta cần những thư viện form mạnh mẽ hỗ trợ quản lý các form state, form validation... Thành phần module. Formik bao gồm có 9 dependencies khác. . React Hook Form thì không có.

0 0 373

- vừa được xem lúc

Hướng dẫn React Redux cho người mới bắt đầu - Phần 1

Lời mởi đầu. Chào các bạn, ở thời điểm thực hiện bài viết này mình cũng là một người đang bắt đầu tìm hiểu và học với ReactJs và Redux, trong quá trình tìm hiểu đọc các tài liệu về thư viện này mình có tìm được một bài hướng dẫn khá hay nên đã quyết định chia sẻ với mọi người .

0 0 283