Hooks là một tính năng được giới thiệu trong React 16.8, cho phép lập trình viên sử dụng các tính năng như state và lifecycle trong functional components mà không cần viết class components. Hooks giúp mã nguồn trở nên ngắn gọn, dễ đọc và dễ bảo trì. Bài viết này sẽ giải thích Hooks là gì, các Hooks phổ biến, cách sử dụng chúng trong ReactJS, và cách tối ưu SEO, đảm bảo nội dung dễ hiểu và từ khóa được tối ưu.
Tìm hiểu về Hooks trong ReactJS
Tìm hiểu về Hooks trong ReactJS

Hooks là gì?

Hooks là các hàm đặc biệt trong React, cho phép bạn “kết nối” (hook into) các tính năng của React như state, lifecycle, và context từ functional components. Trước khi có Hooks, các tính năng này chỉ khả dụng trong class components, dẫn đến mã phức tạp và khó tái sử dụng.

Đặc điểm chính của Hooks

  • Chỉ dùng trong functional components: Hooks không hoạt động trong class components.
  • Tái sử dụng logic: Hooks giúp chia sẻ logic giữa các components mà không cần các kỹ thuật phức tạp như HOC (Higher-Order Components) hay Render Props.
  • Cú pháp ngắn gọn: Loại bỏ sự phức tạp của this trong class components.
  • Quy tắc sử dụng Hooks:
    • Chỉ gọi Hooks ở cấp cao nhất (top level) của component, không trong vòng lặp, điều kiện, hay hàm lồng nhau.
    • Chỉ gọi Hooks trong functional components hoặc custom Hooks.

Các Hooks phổ biến trong ReactJS

React cung cấp một số Hooks tích hợp sẵn (built-in Hooks) và cho phép tạo custom Hooks. Dưới đây là các Hooks phổ biến và cách áp dụng chúng.

useState

  • Mô tả: Quản lý trạng thái (state) trong functional components.
  • Cách dùng: Trả về một cặp giá trị [state, setState] để lưu trữ và cập nhật trạng thái.

Ví dụ:

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

export default Counter;
  • useState(0): Khởi tạo state count với giá trị ban đầu là 0.
  • setCount: Hàm cập nhật giá trị của count.

useEffect

  • Mô tả: Xử lý các side effects (như gọi API, cập nhật DOM, hoặc đăng ký sự kiện) tương tự lifecycle trong class components.
  • Cách dùng: Chấp nhận một callback và một mảng phụ thuộc (dependency array).

Ví dụ:

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

const DataFetcher = () => {
  const [data, setData] = useState(null);

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

  return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>;
};

export default DataFetcher;
  • useEffect chạy sau khi component render.
  • Mảng phụ thuộc [] đảm bảo effect chỉ chạy một lần khi component được mount.

useContext

  • Mô tả: Truy cập React Context để chia sẻ dữ liệu giữa các components mà không cần truyền props qua nhiều cấp.
  • Cách dùng: Sử dụng với một Context object được tạo bởi React.createContext.

Ví dụ:

import React, { useContext, createContext } from 'react';

const ThemeContext = createContext();

const App = () => {
  return (
    <ThemeContext.Provider value="dark">
      <ThemedComponent />
    </ThemeContext.Provider>
  );
};

const ThemedComponent = () => {
  const theme = useContext(ThemeContext);
  return <p>Current theme: {theme}</p>;
};

export default App;

useReducer

  • Mô tả: Quản lý state phức tạp hơn so với useState, phù hợp khi state có nhiều hành động hoặc logic phức tạp.
  • Cách dùng: Tương tự Redux, sử dụng reducer function và dispatch actions.

Ví dụ:

import React, { useReducer } from 'react';

const initialState = { count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      return state;
  }
}

const Counter = () => {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
    </div>
  );
};

export default Counter;

useRef

  • Mô tả: Tạo một tham chiếu (reference) để lưu trữ giá trị không gây re-render hoặc truy cập DOM.
  • Cách dùng: Thường dùng để quản lý focus, lưu giá trị tạm thời, hoặc truy cập phần tử DOM.

Ví dụ:

import React, { useRef } from 'react';

const InputFocus = () => {
  const inputRef = useRef(null);

  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} type="text" />
      <button onClick={focusInput}>Focus Input</button>
    </div>
  );
};

export default InputFocus;

Custom Hooks

  • Mô tả: Tự tạo Hooks để tái sử dụng logic giữa các components.
  • Cách dùng: Tên custom Hook bắt đầu bằng use và gọi các Hooks khác bên trong.

Ví dụ:

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 };
};

const App = () => {
  const { data, loading } = useFetch('https://api.example.com/data');

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

export default App;

Lợi ích của Hooks trong ReactJS

  • Mã ngắn gọn: Functional components với Hooks thay thế class components dài dòng.
  • Tái sử dụng logic: Custom Hooks giúp chia sẻ logic mà không cần HOC hay Render Props.
  • Dễ bảo trì: Loại bỏ sự phức tạp của this và lifecycle methods trong class components.
  • Hiệu suất tốt: Hooks tối ưu hóa render bằng cách giảm các re-render không cần thiết.
  • Tích hợp với ES6+: Hooks tận dụng các tính năng như arrow functions, destructuring, và async/await.

Tối ưu SEO khi sử dụng Hooks

React thường được dùng cho SPA, có thể gặp thách thức về SEO do nội dung tải động. Khi sử dụng Hooks, bạn có thể tối ưu SEO bằng cách:

  • Kết hợp với Next.js: Sử dụng useEffect hoặc custom Hooks để gọi API và kết hợp Server-Side Rendering (SSR) hoặc Static Site Generation (SSG).
import { useEffect, useState } from 'react';
import { Helmet } from 'react-helmet';

const HomePage = () => {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then((response) => response.json())
      .then(setData);
  }, []);

  return (
    <>
      <Helmet>
        <title>{data ? data.title : 'My App'}</title>
        <meta name="description" content="Dynamic SEO with React Hooks" />
      </Helmet>
      <h1>{data ? data.title : 'Loading...'}</h1>
    </>
  );
};

Tối ưu tốc độ tải: Sử dụng useMemo và useCallback để tránh re-render không cần thiết:

import React, { useMemo } from 'react';

const ExpensiveComponent = ({ items }) => {
  const sortedItems = useMemo(() => {
    return items.sort((a, b) => a - b);
  }, [items]);

  return <ul>{sortedItems.map((item) => <li key={item}>{item}</li>)}</ul>;
};

Lazy loading: Kết hợp React.lazy và Suspense để tải chậm component:

import React, { lazy, Suspense } from 'react';

const LazyComponent = lazy(() => import('./LazyComponent'));

const App = () => (
  <Suspense fallback={<div>Loading...</div>}>
    <LazyComponent />
  </Suspense>
);

Làm thế nào để học Hooks hiệu quả?

Học cơ bản:

  • Tìm hiểu useState, useEffect, và useContext qua tài liệu chính thức tại react.dev.
  • Thực hành với các ví dụ đơn giản như counter, form, hoặc gọi API.

Tạo custom Hooks:

  • Xây dựng custom Hooks như useFetch, useForm, hoặc useWindowSize.

Dự án thực tế:

  • Tạo một ứng dụng như todo list, blog, hoặc ứng dụng thời tiết sử dụng Hooks.

Khóa học online:

  • Các khóa học trên Udemy, Pluralsight, hoặc freeCodeCamp về Hooks và React.

Tham gia cộng đồng:

  • Tham gia Stack Overflow, Reddit, hoặc các nhóm ReactJS để trao đổi kinh nghiệm.

Kết luận

Hooks đã thay đổi cách lập trình viên phát triển ứng dụng với ReactJS, mang lại cú pháp ngắn gọn, tái sử dụng logic dễ dàng, và hiệu suất cao. Các Hooks như useState, useEffect, useContext, và custom Hooks giúp xây dựng các functional components mạnh mẽ, thay thế class components. Để tối ưu SEO, hãy kết hợp Hooks với Next.js và các kỹ thuật như SSR, lazy loading. Việc nắm vững Hooks là bước quan trọng để trở thành một lập trình viên ReactJS chuyên nghiệp.

Bài viết này được đăng trong Developer và được gắn thẻ .

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *