React là thư viện để mô tả UI theo state. Component không “chỉnh DOM từng bước”; nó trả về mô tả giao diện cho state hiện tại, React reconcile và commit thay đổi cần thiết.
Component là phép biến đổi từ input sang UI
1 | function Welcome({ name }) { |
Props là input từ parent. Giữ render pure: cùng props/state nên tạo cùng output, không gọi API hoặc mutate dữ liệu trong render.
Render root hiện đại
1 | import { createRoot } from 'react-dom/client'; |
ReactDOM.render thuộc API legacy. React vẫn có lịch sử, nhưng bài mới không cần cosplay năm 2020.
State là snapshot
1 | import { useState } from 'react'; |
State update được queue/batch; biến count trong một render là snapshot. Khi next state phụ thuộc previous state, dùng updater function.
Không mutate object/array state:
1 | setUser(current => ({ ...current, name: 'Hudson' })); |
Effects dùng để đồng bộ với hệ thống bên ngoài
1 | import { useEffect, useState } from 'react'; |
Effect không phải chỗ mặc định cho mọi logic. Giá trị có thể tính từ props/state nên tính trong render; event-specific logic nên nằm trong event handler.
Keys và identity
1 | items.map(item => <Row key={item.id} item={item} />) |
Key giúp React giữ identity giữa các render. Tránh dùng array index khi item có thể reorder/insert/delete, nếu không state component có thể đi theo vị trí thay vì item—một màn hoán đổi danh tính khá khó debug.
State ownership
Đặt state ở component thấp nhất nhưng đủ chung cho những nơi cần nó. Không đưa mọi thứ lên global store. Context và Redux giải quyết coordination, không chữa thói quen không biết data thuộc về ai.
Mental model
- Render phải pure.
- State là snapshot.
- Event handler thay đổi state.
- Effect đồng bộ với external system.
- Cleanup effect khi subscription/request không còn cần.
- Identity nằm ở type, position và key.