diff --git a/README.de.md b/README.de.md index 26bde71..26111cb 100644 --- a/README.de.md +++ b/README.de.md @@ -1,6 +1,6 @@ **Read in other languages: [English 🇺🇸](README.en.md), [Polska 🇵🇱](README.pl.md), [German 🇩🇪](README.de.md), [French 🇫🇷](README.fr.md), -[Spanish 🇪🇸](README.es.md), [Українська 🇺🇦](README.md).** +[Spanish 🇪🇸](README.es.md), [Українська 🇺🇦](README.md), [Tiếng Việt 🇻🇳](README.vi.md).**
`.
+
+#### Tầm quan trọng của key (prop `key`) cho danh sách:
+
+Key giúp React xác định đúng các thay đổi trong danh sách. Ví dụ:
+
+```jsx
+
+ {items.map(item => (
+ {item.text}
+ ))}
+
+```
+
+Không có key duy nhất, React sẽ không thể xác định chính xác phần tử danh sách nào đã thay đổi.
+
+#### Ưu điểm của reconciliation:
+
+- Giảm số lượng thao tác DOM.
+- Cải thiện hiệu suất ứng dụng.
+- Cung cấp cập nhật giao diện mượt mà.
+
+
+
+ You have admin privileges Seconds: {seconds} Count: {count} Loading... Error: {error}21. Làm thế nào để cập nhật trạng thái của component?
+
+#### React
+
+Trong React, trạng thái component được cập nhật bằng phương thức `setState` trong class component hoặc `useState` trong functional component.
+
+#### Class component:
+
+Trạng thái được cập nhật qua `this.setState()`.
+
+#### Ví dụ:
+
+```jsx
+class Counter extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = { count: 0 };
+ }
+
+ increment = () => {
+ this.setState({ count: this.state.count + 1 });
+ };
+
+ render() {
+ return (
+
+ Count: {this.state.count}
+ Increment
+
+ );
+ }
+}
+```
+
+#### Functional component:
+
+Trạng thái được cập nhật qua hàm trả về bởi `useState`.
+
+#### Ví dụ:
+
+```jsx
+import React, { useState } from 'react';
+
+function Counter() {
+ const [count, setCount] = useState(0);
+
+ const increment = () => {
+ setCount(count + 1);
+ };
+
+ return (
+
+ Count: {count}
+ Increment
+
+ );
+}
+```
+
+#### Lưu ý:
+
+1. **Bất đồng bộ:** `setState` và `useState` hoạt động bất đồng bộ. Để cập nhật trạng thái dựa trên giá trị trước đó, dùng cách tiếp cận hàm:
+
+```jsx
+this.setState(prevState => ({ count: prevState.count + 1 }));
+setCount(prevCount => prevCount + 1);
+```
+
+2. **Không cập nhật trạng thái trực tiếp:** Sửa đổi trạng thái mà không dùng `setState` hoặc `useState` không kích hoạt render lại.
+
+22. Inline conditional expression là gì?
+
+#### React
+
+**Inline conditional expression** trong JavaScript (bao gồm React) là các cơ chế cho phép nhúng điều kiện trực tiếp vào JSX để render có điều kiện các phần tử hoặc component. Điều này làm cho code ngắn gọn và dễ hiểu hơn.
+
+#### Các phương pháp chính:
+
+1. **Toán tử điều kiện (toán tử ternary):** Đây là một trong những cách phổ biến nhất để render có điều kiện trong JSX.
+
+```jsx
+condition ? expression_if_true : expression_if_false;
+```
+
+**Ví dụ:**
+
+```jsx
+const isLoggedIn = true;
+
+function App() {
+ return {isLoggedIn ? 'Welcome, User!' : 'Please log in'};
+}
+```
+
+2. **Toán tử AND logic (`&&`):** Phương pháp này cho phép hiển thị component hoặc phần tử chỉ khi điều kiện là `true`. Nếu điều kiện không thỏa, không có gì được render.
+
+**Ví dụ:**
+
+```jsx
+const isUserAdmin = true;
+
+function App() {
+ return {isUserAdmin && You have admin privileges};
+}
+```
+
+Trong trường hợp này, `23. Sự khác biệt giữa xử lý sự kiện trong HTML và React là gì?
+
+#### React
+
+#### Sự khác biệt giữa xử lý sự kiện trong HTML và React:
+
+| Tiêu chí | HTML | React |
+| -------------------------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------- |
+| **Gắn sự kiện** | Được chỉ định là thuộc tính: `24. Synthetic event trong React là gì?
+
+#### React
+
+**Synthetic event** trong React là wrapper bao quanh các sự kiện DOM native cung cấp giao diện nhất quán để xử lý sự kiện trên các browser khác nhau. React tạo ra `SyntheticEvent` cho mỗi sự kiện, cho phép xử lý sự kiện theo cách thống nhất, đảm bảo tương thích cross-browser và cải thiện hiệu suất.
+
+#### Đặc điểm chính:
+
+1. **Tương thích cross-browser:** `SyntheticEvent` trừu tượng hóa hành vi sự kiện đặc thù của browser và cung cấp hành vi nhất quán.
+
+2. **Tối ưu hóa:** `SyntheticEvent` dùng object pooling giúp giảm chi phí tạo đối tượng sự kiện mới.
+
+3. **Dùng một lần:** Sau khi sự kiện được xử lý, đối tượng `SyntheticEvent` được "trả lại" pool và không thể dùng sau đó. Đối với thao tác bất đồng bộ, sự kiện nên được lưu vào biến riêng.
+
+4. **Giao diện:** `SyntheticEvent` có cùng phương thức với sự kiện native tiêu chuẩn (ví dụ: `preventDefault()` và `stopPropagation()`).
+
+#### Ví dụ:
+
+```jsx
+function handleClick(event) {
+ // SyntheticEvent cung cấp quyền truy cập phương thức preventDefault()
+ event.preventDefault();
+ console.log('Button clicked!');
+}
+
+function App() {
+ return Click me;
+}
+```
+
+Trong ví dụ này, `event` là `SyntheticEvent` hoạt động tương tự sự kiện native nhưng với khả năng cải tiến.
+
+25. Làm thế nào để xử lý sự kiện trong React?
+
+#### React
+
+Trong React, xử lý sự kiện hoạt động tương tự JavaScript tiêu chuẩn, nhưng có một số điểm khác biệt. Các sự kiện trong React là synthetic, nghĩa là chúng cung cấp abstraction trên các sự kiện browser thực và đảm bảo tương thích cross-browser.
+
+#### Nguyên tắc chính xử lý sự kiện trong React:
+
+1. **Synthetic event:** Tất cả sự kiện trong React được bọc trong đối tượng **SyntheticEvent**, là implementation cross-browser của các sự kiện DOM tiêu chuẩn.
+
+2. **Dùng camelCase cho sự kiện:** Trong React, sự kiện được viết theo camelCase thay vì chữ thường (ví dụ: `onClick` thay vì `onclick`).
+
+3. **Truyền hàm làm event handler:** Sự kiện trong React được xử lý bằng hàm truyền qua thuộc tính component.
+
+#### Ví dụ xử lý sự kiện `click`:
+
+```jsx
+import React, { Component } from 'react';
+
+class MyButton extends Component {
+ handleClick = () => {
+ alert('Button clicked!');
+ };
+
+ render() {
+ return Click Me;
+ }
+}
+
+export default MyButton;
+```
+
+#### Ví dụ với functional component:
+
+```jsx
+import React, { useState } from 'react';
+
+function MyButton() {
+ const [count, setCount] = useState(0);
+
+ const handleClick = () => {
+ setCount(count + 1);
+ };
+
+ return Clicked {count} times;
+}
+
+export default MyButton;
+```
+
+#### Đặc điểm xử lý sự kiện:
+
+1. **Không cần dùng `addEventListener`:** Trong React, không cần thêm hoặc xóa event handler thủ công. Điều này được quản lý tự động bởi thư viện React.
+
+2. **Bảo toàn context trong phương thức class component:** Nếu phương thức class component được dùng làm event handler, context `this` phải được bind bằng arrow function hoặc thủ công trong constructor.
+
+```jsx
+class MyComponent extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = { count: 0 };
+ // Binding phương thức
+ this.handleClick = this.handleClick.bind(this);
+ }
+
+ handleClick() {
+ this.setState({ count: this.state.count + 1 });
+ }
+
+ render() {
+ return (
+
+ Clicked {this.state.count} times
+
+ );
+ }
+}
+```
+
+3. **Truyền tham số cho hàm handler:** Nếu cần truyền thêm đối số cho event handler, bạn có thể dùng arrow function hoặc hàm có tham số.
+
+```jsx
+function MyButton({ label }) {
+ const handleClick = (event, label) => {
+ console.log(label);
+ };
+
+ return 26. Pointer Event là gì?
+
+#### React
+
+#### Pointer Event trong React
+
+**Pointer Event** là API thống nhất các sự kiện chuột, cảm ứng và bút stylus thành một hệ thống xử lý sự kiện duy nhất.
+
+#### Các Pointer Event chính
+
+| **Sự kiện** | **Mô tả** |
+| ------------------- | ------------------------------------------------------------------------ |
+| **onPointerDown** | Kích hoạt khi nhấn bằng ngón tay, chuột hoặc bút stylus. |
+| **onPointerUp** | Kích hoạt khi thả nút chuột, ngón tay hoặc bút stylus. |
+| **onPointerMove** | Kích hoạt khi con trỏ di chuyển trên phần tử. |
+| **onPointerEnter** | Kích hoạt khi con trỏ vào trong phạm vi phần tử. |
+| **onPointerLeave** | Kích hoạt khi con trỏ rời khỏi phạm vi phần tử. |
+| **onPointerCancel** | Kích hoạt khi browser hủy sự kiện (ví dụ: khi thay đổi focus). |
+
+#### Ví dụ trong React
+
+```jsx
+const PointerExample = () => {
+ const handlePointerDown = () => console.log('Pointer pressed');
+
+ return (
+
+ Click here
+
+ );
+};
+```
+
+Code này sẽ log `"Pointer pressed"` vào console khi nhấn bằng bất kỳ thiết bị nào (chuột, cảm ứng hoặc bút stylus).
+
+27. Khi nào nên dùng class component thay vì functional component?
+
+#### React
+
+Class component từng được dùng khi cần một hoặc nhiều tính năng sau:
+
+1. **Làm việc với state:** Trước đây, functional component không hỗ trợ local state, nên class được dùng cho mục đích này. Ngày nay, hook (`useState`, `useReducer`) cho phép functional component làm việc với state.
+
+2. **Lifecycle method:** Class cung cấp quyền truy cập các phương thức như `componentDidMount`, `componentDidUpdate` và `componentWillUnmount` để quản lý component ở các giai đoạn khác nhau. Ngày nay, điều này được xử lý bởi hook `useEffect`.
+
+3. **Xử lý logic phức tạp:** Nếu logic cần nhiều phương thức và truy cập thuộc tính qua `this`, class có vẻ là lựa chọn logic. Cách tiếp cận hiện đại là hook, cho phép đóng gói logic.
+
+#### Khi class không còn cần thiết:
+
+Bắt đầu từ React 16.8, functional component với hook thay thế nhu cầu cho class component. Vì vậy, trong các dự án mới, nên ưu tiên functional component. Class chủ yếu được dùng để duy trì legacy code.
+
+28. Stateless component là gì?
+
+#### React
+
+Stateless component là các component không lưu trữ hoặc quản lý bất kỳ internal state nào. Chúng chỉ nhận dữ liệu qua props và hiển thị nó dưới dạng giao diện. Thường thì các component này là functional.
+
+#### Đặc điểm:
+
+1. **Không có state:** Chúng không dùng `this.state` và không thay đổi internal state.
+
+2. **Chỉ render:** Chúng đơn giản nhận props và hiển thị chúng dưới dạng UI element.
+
+3. **Đơn giản và dễ dự đoán:** Dễ kiểm thử và bảo trì hơn vì không cần theo dõi thay đổi trạng thái.
+
+#### Ví dụ:
+
+```jsx
+// Stateless component
+function Greeting(props) {
+ return Hello, {props.name}!;
+}
+
+// Cách dùng:
+;
+```
+
+#### Ưu điểm:
+
+- **Đơn giản:** Dễ hiểu và bảo trì.
+
+- **Tối ưu hiệu suất:** Vì các component này không có state, React có thể cập nhật chúng hiệu quả hơn.
+
+#### Khi nào nên dùng:
+
+- Khi component đơn giản chỉ hiển thị dữ liệu và không cần thay đổi.
+
+29. Stateful component là gì?
+
+#### React
+
+**Stateful component** là các component lưu trữ và quản lý internal state. Chúng dùng state để lưu dữ liệu có thể thay đổi theo thời gian, và những thay đổi này ảnh hưởng đến việc render component.
+
+#### Đặc điểm:
+
+1. **State:** Chúng dùng `this.state` để lưu và quản lý dữ liệu có thể thay đổi.
+
+2. **Phương thức cập nhật state:** Chúng dùng phương thức `this.setState()` để cập nhật state.
+
+3. **Lifecycle:** Chúng có quyền truy cập các lifecycle method như `componentDidMount()`, `shouldComponentUpdate()`, `componentDidUpdate()`, v.v.
+
+#### Ví dụ:
+
+```jsx
+// Stateful component
+class Counter extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ count: 0,
+ };
+ }
+
+ increment = () => {
+ this.setState({ count: this.state.count + 1 });
+ };
+
+ render() {
+ return (
+
+ {this.state.count}
+ Increment
+
+ );
+ }
+}
+```
+
+#### Ưu điểm:
+
+- **Component động:** Chúng có thể thay đổi nội dung và giao diện dựa trên thay đổi trạng thái.
+
+- **Tương tác:** Phù hợp để xây dựng giao diện tương tác nơi state cần được cập nhật để phản hồi tương tác người dùng.
+
+#### Khi nào nên dùng:
+
+Khi component cần quản lý internal state, ví dụ để lưu đầu vào form, bộ đếm, lựa chọn, v.v.
+
+30. Pure Component là gì?
+
+#### React
+
+**Pure Component** là các React class component đặc biệt tự động tối ưu hóa render. Chúng thực hiện so sánh shallow của props và state để ngăn các cập nhật không cần thiết nếu giá trị props hoặc state không thay đổi.
+
+#### Làm thế nào để tạo Pure Component?
+
+Pure Component được tạo bằng cách extends `React.PureComponent`.
+
+```jsx
+import React, { PureComponent } from 'react';
+
+class MyComponent extends PureComponent {
+ render() {
+ return Hello, {this.props.name}!;
+ }
+}
+
+// Cách dùng:
+;
+```
+
+#### `PureComponent` hoạt động như thế nào?
+
+- Nó thực hiện so sánh shallow của props và state trong phương thức `shouldComponentUpdate`.
+
+- Nếu props và state không thay đổi, component không render lại.
+
+#### Khi nào nên dùng `PureComponent`?
+
+- Khi props và state là các cấu trúc đơn giản (giá trị primitive hoặc đối tượng shallow).
+
+- Để cải thiện hiệu suất trong các component cập nhật thường xuyên.
+
+#### Hạn chế:
+
+1. **So sánh sâu:** `PureComponent` không tính đến thay đổi bên trong đối tượng hoặc mảng lồng nhau. Ví dụ, nếu bạn cập nhật đối tượng nhưng tham chiếu vẫn không thay đổi, component sẽ không cập nhật.
+
+```jsx
+this.setState({ data: { ...this.state.data, key: 'new value' } }); // Cách giải quyết
+```
+
+2. **Không hoạt động với functional component:** Thay thế là dùng `React.memo` để tối ưu functional component.
+
+```jsx
+const MyComponent = React.memo(function MyComponent(props) {
+ return Hello, {props.name}!;
+});
+```
+
+31. Higher-Order Component (HOC) là gì?
+
+#### React
+
+**Higher-Order Component** là một hàm nhận component làm đối số đầu vào và trả về component mới, mở rộng chức năng của nó.
+
+#### Cú pháp HOC:
+
+```jsx
+const EnhancedComponent = higherOrderComponent(WrappedComponent);
+```
+
+#### Đặc điểm HOC:
+
+1. **Nhận component làm đối số.**
+2. **Trả về component mới với props hoặc hành vi bổ sung.**
+3. **Cho phép tái sử dụng logic trong các component khác nhau.**
+
+#### Ví dụ:
+
+HOC để thêm state vào component:
+
+```jsx
+import React, { useState } from 'react';
+
+// HOC: thêm logic state
+function withCounter(WrappedComponent) {
+ return function EnhancedComponent(props) {
+ const [count, setCount] = useState(0);
+
+ const increment = () => setCount(count + 1);
+
+ return ;
+ };
+}
+
+// Component được nâng cấp
+function Button({ count, increment }) {
+ return Clicked {count} times;
+}
+
+// Cách dùng HOC
+const EnhancedButton = withCounter(Button);
+
+export default EnhancedButton;
+```
+
+#### Các trường hợp dùng HOC thực tế:
+
+1. **Xác thực:** Bọc component để kiểm tra quyền truy cập.
+
+2. **Xử lý dữ liệu:** Kết nối với API hoặc xử lý state.
+
+3. **Logging:** Thêm logging cho các hành động component.
+
+#### Hạn chế của HOC:
+
+- Có thể tạo nesting sâu trong cây component nếu dùng quá nhiều HOC.
+
+- Có thể giảm khả năng đọc vì wrapper component thêm vào.
+
+HOC là công cụ mạnh để tái sử dụng logic, nhưng trong ứng dụng hiện đại thường được thay thế bởi React Hooks.
+
+32. Prop `children` là gì?
+
+#### React
+
+#### Prop `children` là gì?
+
+`children` là prop đặc biệt trong React được dùng để truyền các phần tử hoặc component lồng nhau vào component wrapper.
+
+#### Cách hoạt động?
+
+Khi bạn truyền nội dung con giữa thẻ mở và đóng của component, nội dung đó tự động được truyền dưới dạng `props.children`.
+
+#### Ví dụ:
+
+- **Component wrapper:**
+
+```jsx
+function Wrapper({ children }) {
+ return { children };
+}
+```
+
+- **Cách dùng:**
+
+```jsx
+function App() {
+ return (
+
+ Hello, World!
+ This is a paragraph inside the wrapper.
+
+ );
+}
+```
+
+- **Kết quả:**
+
+```html
+Hello, World! This is a paragraph inside the wrapper.
+```
+
+#### Các tính năng chính của `children`:
+
+1. **Linh hoạt:** Bạn có thể truyền bất kỳ loại dữ liệu nào: văn bản, JSX, component hoặc mảng phần tử.
+
+2. **Tái sử dụng:** Component wrapper có thể render động các nội dung khác nhau.
+
+3. **Composition có cấu trúc:** Giúp tạo component với cấu trúc lồng nhau.
+
+#### Dùng `children` với function prop:
+
+Đôi khi `children` được dùng như một hàm để truyền dữ liệu động:
+
+```jsx
+function List({ items, children }) {
+ return {items.map(item => children(item))};
+}
+
+function App() {
+ return (
+
+ {item => {item}}
+
+ );
+}
+```
+
+#### Kết quả:
+
+```html
+Apple Banana Cherry
+```
+
+`children` là công cụ mạnh để tạo component toàn dụng và tái sử dụng trong React.
+
+
33. Portal là gì?
+
+#### React
+
+**Portal** trong React là cách render các phần tử con vào DOM node tồn tại bên ngoài phân cấp DOM của component cha.
+
+#### Cách hoạt động:
+
+React cung cấp portal qua phương thức `ReactDOM.createPortal`, nhận hai đối số:
+
+1. **React element** để render.
+
+2. **DOM node đích** nơi phần tử sẽ được chèn vào.
+
+#### Cú pháp:
+
+```jsx
+ReactDOM.createPortal(child, container);
+```
+
+- **`child`** là React element để render.
+
+- **`container`** là DOM node nơi phần tử sẽ được chèn.
+
+#### Ví dụ:
+
+```jsx
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+function Modal({ children }) {
+ return ReactDOM.createPortal(
+ {children},
+ document.getElementById('modal-root') // Node đích
+ );
+}
+
+function App() {
+ return (
+
+ Main content
+
+ This is modal content
+
+
+
+ );
+}
+```
+
+#### Nơi portal được dùng:
+
+- Modal.
+
+- Tooltip.
+
+- Context menu.
+
+#### Đặc điểm:
+
+1. **Phân cấp sự kiện:** Mặc dù phần tử được render bên ngoài phân cấp DOM, xử lý sự kiện vẫn theo phân cấp React component. Ví dụ, sự kiện `onClick` sẽ bubble lên component React cha.
+
+2. **Linh hoạt:** Portal cho phép chèn phần tử vào những nơi không phù hợp với cấu trúc DOM hiện tại.
+
+#### Ưu điểm:
+
+- Quản lý dễ các phần tử "nổi".
+- Bảo toàn React context kể cả bên ngoài phân cấp DOM chính.
+
+34. Portal hoạt động như thế nào trong React và ưu điểm, trường hợp dùng UI chính là gì?
+
+#### React
+
+**Portal** trong React cho phép render các phần tử con vào một phần khác của DOM thay vì vị trí render mặc định của component. Điều này hữu ích để đặt các phần tử nên tồn tại bên ngoài phân cấp DOM thông thường, như modal, tooltip hoặc phần tử nổi.
+
+#### Ưu điểm chính của portal:
+
+- Cho phép render phần tử ở nơi khác trong DOM mà không làm hỏng cấu trúc React component.
+
+- Hữu ích khi phần tử cần được render phủ lên nội dung khác (ví dụ modal hoặc menu pop-up).
+
+#### Cách portal hoạt động:
+
+- Portal cho phép gửi nội dung đến bất kỳ nơi nào trong DOM, kể cả bên ngoài React container gốc.
+
+#### Ví dụ portal:
+
+```jsx
+import ReactDOM from 'react-dom';
+
+const Modal = () => {
+ return ReactDOM.createPortal(
+ This is a modal window
+ Main page
+ 35. Các lifecycle method của component trong React là gì?
+
+#### React
+
+Các lifecycle method của component trong React được dùng để quản lý các giai đoạn khác nhau của vòng đời component: tạo, cập nhật và xóa.
+
+#### Các giai đoạn lifecycle chính:
+
+1. **Mounting:** Khi component được thêm vào DOM.
+
+`constructor()`: Khởi tạo state và bind phương thức.
+
+`static getDerivedStateFromProps(props, state)`: Cập nhật state trước render (ít dùng).
+
+`render()`: Render JSX vào virtual DOM.
+
+`componentDidMount()`: Gọi ngay sau khi component được thêm vào DOM. Dùng cho API request và khởi tạo thư viện.
+
+2. **Updating:** Khi props hoặc state thay đổi.
+
+`static getDerivedStateFromProps(props, state)`: Gọi trước mỗi lần render.
+
+`shouldComponentUpdate(nextProps, nextState)`: Kiểm soát liệu component có nên render lại hay không. Mặc định trả về `true`.
+
+`render()`: Chạy để cập nhật virtual DOM.
+
+`getSnapshotBeforeUpdate(prevProps, prevState)`: Lấy snapshot trước thay đổi (ví dụ: vị trí scroll).
+
+`componentDidUpdate(prevProps, prevState, snapshot)`: Gọi sau khi cập nhật. Dùng cho request lặp lại hoặc làm việc với DOM.
+
+3. **Unmounting:** Khi component bị xóa khỏi DOM.
+
+`componentWillUnmount()`: Dùng để dọn dẹp tài nguyên (ví dụ: timer hoặc subscription).
+
+4. **Xử lý lỗi:** Khi component throw lỗi.
+
+`static getDerivedStateFromError(error)`: Cho phép cập nhật state sau lỗi.
+
+`componentDidCatch(error, info)`: Log lỗi.
+
+36. useEffect hook là gì và cách dùng?
+
+#### React
+
+`useEffect` là hook React cho phép thực hiện side effect trong functional component. Side effect bao gồm các thao tác như fetch dữ liệu, đăng ký subscription, đặt timer, thay đổi DOM trực tiếp, v.v.
+
+#### Cú pháp:
+
+```jsx
+useEffect(() => {
+ // Code side effect
+ return () => {
+ // Cleanup (tùy chọn)
+ };
+}, [dependencies]);
+```
+
+#### Ví dụ cơ bản:
+
+```jsx
+import React, { useState, useEffect } from 'react';
+
+function Timer() {
+ const [seconds, setSeconds] = useState(0);
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setSeconds(prev => prev + 1);
+ }, 1000);
+
+ return () => clearInterval(interval); // Cleanup
+ }, []); // Mảng dependency rỗng = chạy một lần khi mount
+
+ return 37. useState hook là gì?
+
+#### React
+
+`useState` là hook cơ bản trong React cho phép thêm local state vào functional component.
+
+#### Cú pháp:
+
+```jsx
+const [state, setState] = useState(initialValue);
+```
+
+- `state` — Giá trị trạng thái hiện tại.
+- `setState` — Hàm để cập nhật trạng thái.
+- `initialValue` — Giá trị ban đầu của trạng thái.
+
+#### Ví dụ:
+
+```jsx
+import React, { useState } from 'react';
+
+function Counter() {
+ const [count, setCount] = useState(0);
+
+ return (
+ 38. useCallback hook là gì?
+
+#### React
+
+`useCallback` là hook trả về phiên bản được memoize của hàm callback. Nó chỉ tạo lại hàm khi các dependency thay đổi.
+
+#### Cú pháp:
+
+```jsx
+const memoizedCallback = useCallback(() => {
+ doSomething(a, b);
+}, [a, b]);
+```
+
+#### Khi nào dùng:
+
+- Khi truyền callback xuống component con được tối ưu (dùng `React.memo`).
+- Khi hàm được dùng làm dependency trong `useEffect`.
+
+#### Ví dụ:
+
+```jsx
+import React, { useState, useCallback } from 'react';
+
+function Parent() {
+ const [count, setCount] = useState(0);
+
+ const handleClick = useCallback(() => {
+ setCount(prev => prev + 1);
+ }, []); // Hàm được tạo một lần
+
+ return 39. useMemo hook là gì?
+
+#### React
+
+`useMemo` là hook trả về giá trị được memoize từ một tính toán tốn kém. Nó chỉ tính toán lại khi dependency thay đổi.
+
+#### Cú pháp:
+
+```jsx
+const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
+```
+
+#### Ví dụ:
+
+```jsx
+import React, { useState, useMemo } from 'react';
+
+function ExpensiveComponent({ list }) {
+ const [filter, setFilter] = useState('');
+
+ const filteredList = useMemo(() => {
+ return list.filter(item => item.includes(filter));
+ }, [list, filter]); // Chỉ tính lại khi list hoặc filter thay đổi
+
+ return (
+ {filteredList.map(item =>
+ 40. useRef hook là gì?
+
+#### React
+
+`useRef` là hook trả về đối tượng ref có thể thay đổi với thuộc tính `.current`. Không giống state, thay đổi ref **không** kích hoạt render lại.
+
+#### Cú pháp:
+
+```jsx
+const refContainer = useRef(initialValue);
+```
+
+#### Hai cách dùng chính:
+
+1. **Truy cập DOM element:**
+
+```jsx
+function TextInput() {
+ const inputRef = useRef(null);
+
+ const focusInput = () => {
+ inputRef.current.focus();
+ };
+
+ return (
+ <>
+
+ 41. useContext hook là gì?
+
+#### React
+
+`useContext` là hook cho phép functional component đăng ký vào React context mà không cần bọc bằng Consumer component.
+
+#### Cú pháp:
+
+```jsx
+const value = useContext(MyContext);
+```
+
+#### Ví dụ:
+
+```jsx
+import React, { createContext, useContext } from 'react';
+
+// Tạo context
+const ThemeContext = createContext('light');
+
+function ThemedButton() {
+ const theme = useContext(ThemeContext);
+ return 42. Context API là gì?
+
+#### React
+
+**Context API** là cơ chế tích hợp trong React cho phép chia sẻ dữ liệu giữa các component mà không cần truyền props qua từng cấp trong cây component (tránh "prop drilling").
+
+#### Các thành phần chính:
+
+1. **`React.createContext()`** — Tạo context object.
+2. **`Context.Provider`** — Cung cấp giá trị cho cây component con.
+3. **`useContext()`** — Hook để đọc giá trị context trong functional component.
+
+#### Ví dụ:
+
+```jsx
+import React, { createContext, useContext, useState } from 'react';
+
+const UserContext = createContext(null);
+
+function App() {
+ const [user, setUser] = useState({ name: 'Alice' });
+
+ return (
+ Hello, {user.name}!
;
+}
+```
+
+#### Khi nào dùng Context vs. Redux:
+
+- **Context API** — Phù hợp cho dữ liệu đơn giản, ít thay đổi (theme, locale, user).
+- **Redux/Zustand** — Phù hợp cho state phức tạp, nhiều thao tác, cần middleware.
+
+43. Custom Hook là gì?
+
+#### React
+
+**Custom Hook** là hàm JavaScript bắt đầu bằng `use` và có thể gọi các hook khác. Chúng cho phép trích xuất và tái sử dụng logic stateful giữa các component.
+
+#### Ví dụ:
+
+```jsx
+import { useState, useEffect } from 'react';
+
+// Custom Hook để fetch dữ liệu
+function useFetch(url) {
+ const [data, setData] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ fetch(url)
+ .then(res => res.json())
+ .then(data => {
+ setData(data);
+ setLoading(false);
+ })
+ .catch(err => {
+ setError(err.message);
+ setLoading(false);
+ });
+ }, [url]);
+
+ return { data, loading, error };
+}
+
+// Cách dùng
+function UserList() {
+ const { data, loading, error } = useFetch('/api/users');
+
+ if (loading) return {data.map(user =>
;
+}
+```
+
+#### Quy tắc:
+
+- Tên phải bắt đầu bằng `use`.
+- Chỉ gọi hook ở cấp cao nhất (không trong vòng lặp, điều kiện).
+- Chỉ gọi hook từ React function component hoặc custom hook khác.
+
+44. Redux là gì?
+
+#### React
+
+**Redux** là thư viện quản lý state có thể dự đoán được cho ứng dụng JavaScript. Thường dùng với React để quản lý trạng thái ứng dụng toàn cục.
+
+#### Các khái niệm cốt lõi:
+
+1. **Store** — Chứa toàn bộ trạng thái ứng dụng.
+2. **Action** — Object mô tả điều gì đã xảy ra (`{ type: 'INCREMENT' }`).
+3. **Reducer** — Hàm thuần túy nhận state + action, trả về state mới.
+4. **Dispatch** — Gửi action đến store.
+5. **Selector** — Hàm đọc state từ store.
+
+#### Luồng dữ liệu:
+
+```
+UI → dispatch(action) → reducer(state, action) → new state → UI update
+```
+
+#### Ví dụ cơ bản:
+
+```jsx
+import { createStore } from 'redux';
+
+// Reducer
+function counterReducer(state = { count: 0 }, action) {
+ switch (action.type) {
+ case 'INCREMENT':
+ return { count: state.count + 1 };
+ case 'DECREMENT':
+ return { count: state.count - 1 };
+ default:
+ return state;
+ }
+}
+
+// Store
+const store = createStore(counterReducer);
+
+store.dispatch({ type: 'INCREMENT' });
+console.log(store.getState()); // { count: 1 }
+```
+
+#### Khi nào dùng Redux:
+
+- Ứng dụng lớn với nhiều component cần cùng truy cập state.
+- State phức tạp với nhiều thao tác.
+- Cần debuggability tốt (Redux DevTools).
+
+45. React.memo là gì?
+
+#### React
+
+`React.memo` là Higher-Order Component (HOC) memoize functional component, ngăn render lại nếu props không thay đổi.
+
+#### Cú pháp:
+
+```jsx
+const MemoizedComponent = React.memo(MyComponent);
+```
+
+#### Ví dụ:
+
+```jsx
+import React from 'react';
+
+const ExpensiveChild = React.memo(({ name, count }) => {
+ console.log('Child rendered');
+ return 46. Lazy loading trong React là gì?
+
+#### React
+
+**Lazy loading** là kỹ thuật tải component chỉ khi cần thiết, thay vì tải tất cả khi ứng dụng khởi động. Điều này giảm kích thước bundle ban đầu và cải thiện thời gian tải trang.
+
+#### Sử dụng `React.lazy` và `Suspense`:
+
+```jsx
+import React, { Suspense } from 'react';
+
+// Component được tải lazily
+const LazyComponent = React.lazy(() => import('./LazyComponent'));
+
+function App() {
+ return (
+
Age: {age}
+ {isAdmin &&Admin Access
} +This is HTML content.
'; + + return ; +}; +``` + +#### Khi nào dùng: + +- Nếu bạn chắc chắn dữ liệu an toàn (ví dụ: từ server của chính bạn). +- Khi cần nhúng nội dung HTML động, như bài viết có markup HTML. + +**Cảnh báo bảo mật:** Không bao giờ dùng `dangerouslySetInnerHTML` để chèn dữ liệu nhận từ người dùng hoặc nguồn ngoài mà không làm sạch trước. Dùng thư viện như DOMPurify để tránh tấn công XSS. + +```jsx +import DOMPurify from 'dompurify'; + +const MyComponent = () => { + const dirtyHtml = "Giá trị đã nhập: {value}
+Mô tả
>; +``` + +4. **`null` (không render gì):** +```jsx +return null; +``` + +5. **Giá trị boolean (bị bỏ qua):** +```jsx +return false; // Không có gì được hiển thị +``` + +6. **Giá trị text:** +```jsx +return "Hello, World!"; +``` + +7. **Portal:** +```jsx +return createPortal(Tuổi: {age}
+{isActive ? 'Hoạt động' : 'Không hoạt động'}
+Tuổi: {age}
+{isActive ? 'Hoạt động' : 'Không hoạt động'}
+Bộ đếm: {count}
+Đây là HTML code
"; + + return ; +} +``` + +Nếu làm việc với dữ liệu động, hãy làm sạch dữ liệu trước khi chèn vào. + +Đếm: {state.count}
+