0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Khám Phá React Hooks: useEffect, useReducer và Custom Hooks

Đăng vào 2 ngày trước

• 4 phút đọc

Giới thiệu

React Hooks là một trong những tính năng mạnh mẽ nhất mà React cung cấp, giúp bạn xây dựng các ứng dụng mở rộng và dễ bảo trì. Trong bài viết này, chúng ta sẽ tìm hiểu các hook phổ biến nhất như useEffect, useReducer và cách tạo các custom hooks để tái sử dụng mã nguồn, đặc biệt là khi sử dụng TypeScript.

Mục lục

  1. React Hooks là gì?
  2. Sử dụng useEffect
  3. Sử dụng useReducer
  4. Tạo Custom Hooks
  5. Thực hành và Ví dụ thực tế
  6. Mẹo và Thực tiễn tốt nhất
  7. Lỗi thường gặp và Cách khắc phục
  8. Kết luận

React Hooks là gì?

React Hooks là các hàm cho phép bạn sử dụng state và các tính năng khác của React mà không cần phải viết class. Chúng giúp mã nguồn trở nên dễ đọc và bảo trì hơn, đồng thời cho phép bạn chia sẻ logic giữa các component một cách dễ dàng hơn.

Các Hooks chính

  • useState: Quản lý trạng thái trong component.
  • useEffect: Thực thi các hiệu ứng bên ngoài.
  • useReducer: Quản lý trạng thái phức tạp hơn.
  • Custom Hooks: Tạo các hook riêng để tái sử dụng logic.

Sử dụng useEffect

useEffect là một hook cho phép bạn thực hiện các hiệu ứng bên ngoài trong component, chẳng hạn như gọi API hoặc thay đổi DOM. Cú pháp cơ bản như sau:

javascript Copy
useEffect(() => {
  // Code thực hiện hiệu ứng
}, [dependencies]);

Ví dụ sử dụng useEffect

Dưới đây là một ví dụ đơn giản về việc sử dụng useEffect để gọi API:

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

const DataFetchingComponent = () => {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => {
        setData(data);
        setLoading(false);
      });
  }, []); // Chạy một lần khi component mount

  if (loading) return <div>Loading...</div>;
  return <div>{JSON.stringify(data)}</div>;
};

Sử dụng useReducer

useReducer là hook giúp quản lý trạng thái phức tạp hơn, thường được sử dụng khi bạn có nhiều trạng thái hoặc nhiều hành động cần xử lý. Cú pháp cơ bản như sau:

javascript Copy
const [state, dispatch] = useReducer(reducer, initialState);

Ví dụ sử dụng useReducer

Dưới đây là một ví dụ về việc quản lý trạng thái của một bộ đếm:

javascript Copy
import React, { useReducer } from 'react';

const initialState = { count: 0 };
const reducer = (state, action) => {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      throw new Error();
  }
};

const CounterComponent = () => {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
    </div>
  );
};

Tạo Custom Hooks

Custom Hooks cho phép bạn tổ chức lại logic của component để có thể tái sử dụng.

Ví dụ về Custom Hook

Dưới đây là một ví dụ về cách tạo custom hook để lấy dữ liệu:

javascript Copy
import { useState, useEffect } from 'react';

const useFetch = (url) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch(url)
      .then(response => response.json())
      .then(data => {
        setData(data);
        setLoading(false);
      });
  }, [url]);

  return { data, loading };
};

Thực hành và Ví dụ thực tế

Hãy kết hợp tất cả các hook trên để tạo một ứng dụng đơn giản:

javascript Copy
const App = () => {
  const { data, loading } = useFetch('https://api.example.com/data');
  const [state, dispatch] = useReducer(reducer, initialState);

  if (loading) return <div>Loading...</div>;
  return (
    <div>
      <h1>Dữ liệu từ API</h1>
      <pre>{JSON.stringify(data, null, 2)}</pre>
      <CounterComponent />
    </div>
  );
};

Mẹo và Thực tiễn tốt nhất

  • Tối ưu hóa hiệu suất: Sử dụng dependency array trong useEffect để tránh các lần gọi không cần thiết.
  • Tránh lạm dụng useEffect: Chỉ sử dụng khi cần thiết, nếu không có thể dẫn đến mã nguồn phức tạp.
  • Tái sử dụng logic: Tạo các custom hooks để tái sử dụng logic thay vì sao chép mã.

Lỗi thường gặp và Cách khắc phục

  • Lỗi vòng lặp vô hạn: Nếu bạn không sử dụng dependency array trong useEffect, có thể dẫn đến vòng lặp vô hạn.
  • Lỗi không cập nhật state: Đảm bảo rằng bạn đang sử dụng đúng cú pháp để cập nhật state trong useReducer.

Kết luận

React Hooks là một công cụ mạnh mẽ giúp bạn xây dựng ứng dụng React một cách tối ưu hơn. Hãy thử nghiệm với useEffect, useReducer và các custom hooks để tạo ra các ứng dụng mạnh mẽ và dễ bảo trì.

Hãy bắt đầu ngay hôm nay!

Khám phá thêm về React và các tính năng mới bằng cách tham gia vào cộng đồng phát triển và thực hành với các dự án thực tế.

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