Danh sách câu hỏi của đề

Câu hỏi: FER202 Phát triển web Front-End với React – Bộ ôn tập thi lại số 1

50 câu trắc nghiệm kèm lời giải của môn FER202 - Phát triển web Front-End với React, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/50 câuCòn 30
ABy adding js: before it
BBy wrapping it in {}
CBy using () only
DBy using {{}}
Lời giải

Đáp án đúng: "By wrapping it in {}". Trong JSX, cặp ngoặc nhọn là cửa sổ để quay về JavaScript: bất kỳ biểu thức nào đặt trong đó, như một biến, phép tính, lời gọi hàm hay toán tử ba ngôi, đều được tính và chèn kết quả vào giao diện, ví dụ {user.name} hay {count + 1}; ngoặc nhọn dùng được cả trong nội dung thẻ lẫn làm giá trị thuộc tính. "By adding js: before it" sai vì JSX không có tiền tố js nào, viết vậy chỉ ra chữ thường trên màn hình. "By using () only" sai vì ngoặc tròn trong JSX chỉ dùng để nhóm, chẳng hạn bọc khối JSX nhiều dòng sau return, chúng không biến chữ bên trong thành biểu thức JavaScript. "By

Lời giải
using {
  {
  }
}

" sai vì cặp ngoặc đôi không phải cú pháp riêng: ngoặc ngoài là ngoặc nhúng biểu thức, ngoặc trong là một đối tượng JavaScript, như khi viết style={{ color: 'red' }}, nên nó chỉ là một trường hợp của cách dùng {}.

Mở trang câu hỏi này →
2What is React-Bootstrap?4 lựa chọn
AIt combines the flexibility and power of the Bootstrap framework with the dynamic nature of React
BIt is a programming language used for back-end development.
CIt is a database management system for React applications.
DIt is a version control system for React projects.
Lời giải
Đáp án đúng: "It combines the flexibility and power of the Bootstrap framework with the dynamic nature of React". React-Bootstrap là thư viện viết lại các component của Bootstrap thành component React thực thụ như Button, Modal, Navbar, Container, Row, Col: vẫn dùng CSS và hệ lưới của Bootstrap, nhưng hành vi như đóng mở modal được điều khiển bằng props và state của React thay vì jQuery thao tác DOM trực tiếp. "It is a programming language used for back-end development." sai vì React-Bootstrap là thư viện JavaScript chạy phía giao diện, không phải ngôn ngữ lập trình và không dùng cho back-end. "It is a database management system for React applications." sai vì nó không lưu trữ hay truy vấn dữ liệu; đó là việc của hệ quản trị cơ sở dữ liệu như MySQL hoặc MongoDB. "It is a version control system for React projects." sai vì quản lý phiên bản mã nguồn là việc của công cụ như Git, không phải thư viện giao diện.
Mở trang câu hỏi này →
Aimport { createStore } from 'redux'; const store = createStore({ reducer: { counter: counterReducer } });
Bimport { createStore } from 'redux'; const store = createStore({ counter: counterReducer });
Cimport { configureStore } from '@reduxjs/toolkit'; const store = configureStore({ counter: counterReducer});
Dimport { configureStore } from '@reduxjs/toolkit'; const store = configureStore({ reducer: { counter: counterReducer } });
Lời giải
Đáp án đúng: "import { configureStore } from '@reduxjs/toolkit'; const store = configureStore({ reducer: { counter: counterReducer } });". configureStore của Redux Toolkit nhận MỘT đối tượng tuỳ chọn, trong đó khoá reducer chứa reducer gốc hoặc một đối tượng các slice reducer; ở đây counter là tên nhánh state nên state.counter do counterReducer quản lý, và configureStore còn tự gộp reducer bằng combineReducers, gắn sẵn middleware thunk, bật Redux DevTools. Phương án gọi "configureStore({ counter: counterReducer})" thiếu khoá reducer, nên Redux Toolkit báo lỗi vì reducer là đối số bắt buộc. Phương án dùng "createStore({ reducer: { counter" là hàm cũ của gói redux, nó nhận thẳng một hàm reducer chứ không nhận đối tượng tuỳ chọn, truyền đối tượng vào sẽ ném lỗi vì reducer gốc phải là hàm; hơn nữa createStore nay đã bị đánh dấu không khuyến nghị (deprecated) để chuyển sang Redux Toolkit. Phương án dùng "createStore({ counter: counterReducer })" cũng truyền đối tượng thay cho hàm reducer và không dùng Redux Toolkit như câu hỏi yêu cầu.
Mở trang câu hỏi này →
ATo handle UI rendering and user interactions
BTo fetch the data and passing to child component
CTo provide a visual representation of data
DTo encapsulate reusable UI components
Lời giải
Đáp án đúng: "To fetch the data and passing to child component". Mẫu container và presentational chia component theo vai trò: container component lo phần dữ liệu và logic, như gọi API, giữ state, kết nối store, rồi truyền dữ liệu cùng các hàm xử lý xuống component con qua props; component con (presentational) chỉ lo hiển thị. Nhờ tách như vậy, phần giao diện dễ dùng lại và dễ kiểm thử. Phương án "To handle UI rendering and user interactions" là việc của presentational component, nơi vẽ giao diện và nhận thao tác rồi gọi hàm được truyền xuống. Phương án "To provide a visual representation of data" cũng là vai trò hiển thị của presentational component. Phương án "To encapsulate reusable UI components" nói về việc đóng gói các thành phần giao diện dùng lại như nút hay thẻ, không phải nhiệm vụ đặc trưng của container là lấy dữ liệu và chuyền xuống.
Mở trang câu hỏi này →
AThey only work with static content
BThey allow building dynamic, responsive, and efficient web applications
CThey focus on database management
DThey are used exclusively for creating server-side logic
Lời giải
Đáp án đúng: "They allow building dynamic, responsive, and efficient web applications". React, Angular và Vue cho phép chia giao diện thành component tái sử dụng, cập nhật giao diện tự động khi dữ liệu thay đổi và chỉ vẽ lại phần cần đổi, nhờ đó dựng được ứng dụng web động, phản hồi nhanh và hiệu quả như ứng dụng một trang (SPA). "They only work with static content" sai vì thế mạnh của chúng chính là nội dung động; trang tĩnh thì HTML thuần đã đủ. "They focus on database management" nhầm: quản lý cơ sở dữ liệu là việc của hệ quản trị như PostgreSQL hay MongoDB ở phía máy chủ. "They are used exclusively for creating server-side logic" sai vì đây là công cụ chủ yếu cho phía giao diện (front-end); có thể render ở máy chủ nhưng không chỉ dùng cho logic phía máy chủ.
Mở trang câu hỏi này →
ACan be reused across different parts of the application.
BManage their own state.
CUse JSX syntax.
DDirectly manage routing.
Lời giải
Đáp án đúng gồm ba ý: "Can be reused across different parts of the application.", "Manage their own state." và "Use JSX syntax.". Component là khối giao diện độc lập, khai báo một lần rồi dùng lại ở nhiều nơi với props khác nhau. Component có thể tự giữ state riêng bằng useState hay useReducer, hoặc this.state ở class component, và mỗi thể hiện có bản state riêng; không phải component nào cũng cần state, nhưng khả năng tự quản lý state là đặc trưng của component. Component thường mô tả giao diện bằng JSX, cú pháp giống HTML được biên dịch thành lời gọi tạo phần tử React; về lý thuyết có thể viết không dùng JSX nhưng JSX là cách viết chuẩn. "Directly manage routing." không phải đặc trưng của component: định tuyến do thư viện riêng như React Router đảm nhận, React lõi không có khái niệm route.
Mở trang câu hỏi này →
ATo combine multiple code files into a single bundle
BTo improve web performance by loading only necessary code
CTo obfuscate code for security purposes
DTo enhance cross-browser compatibility
Lời giải
Đáp án đúng: "To improve web performance by loading only necessary code". Code splitting (tách mã) chia mã ứng dụng thành nhiều gói nhỏ (chunk) mà trình duyệt chỉ tải khi cần, ví dụ mỗi route một chunk qua import() động, React.lazy hoặc cấu hình của Webpack, Vite; lượng JavaScript phải tải, phân tích và chạy ở lần đầu giảm xuống nên trang hiển thị nhanh hơn. "To combine multiple code files into a single bundle" là việc gộp gói (bundling), chính là thứ code splitting chia nhỏ lại. "To obfuscate code for security purposes" là làm rối mã, không liên quan tới tách mã và cũng không phải biện pháp bảo mật thật vì mã phía trình duyệt vẫn đọc được. "To enhance cross-browser compatibility" thuộc về việc biên dịch bằng Babel và polyfill, không phải tách mã.
Mở trang câu hỏi này →
ATo manage state within a component
BTo respond to user interactions like clicking, hovering, and focusing
CTo handle server-side logic
DTo manage routing in a React application
Lời giải
Đáp án đúng: "To respond to user interactions like clicking, hovering, and focusing". Event handler (hàm xử lý sự kiện) là hàm ta truyền vào các prop như onClick, onMouseEnter, onFocus hay onChange; React gọi hàm đó khi người dùng nhấp, rê chuột, đưa con trỏ vào ô nhập hay gõ phím, và bên trong hàm ta làm việc cần làm như cập nhật state hay gửi biểu mẫu. Lưu ý phải truyền chính hàm, ví dụ onClick={handleClick}, chứ không gọi nó ngay. "To manage state within a component" sai vì giữ state là việc của useState hay useReducer; hàm xử lý sự kiện có thể gọi hàm set để đổi state, nhưng mục đích của nó là phản hồi thao tác người dùng. "To handle server-side logic" sai vì event handler chạy trong trình duyệt, logic máy chủ thuộc về backend. "To manage routing in a React application" sai vì định tuyến do React Router đảm nhận qua Routes, Route và Link.
Mở trang câu hỏi này →
Đề bài
<label for="exampleFormControlInput1" class="form-label">Email address</label>

)

AIt styles the label based on form control types
BIt links the label to the form control via the control's id, improving accessibility
CIt is used for adding inline form validation
DIt triggers JavaScript events when the form is submitted
Lời giải
Đáp án đúng: "It links the label to the form control via the control's id, improving accessibility". Thuộc tính for của thẻ label nhận đúng giá trị id của ô nhập, ở đây là exampleFormControlInput1; trình duyệt nối hai phần tử nên bấm vào nhãn thì con trỏ nhảy vào ô, và trình đọc màn hình đọc nhãn khi người dùng vào ô, tăng khả năng tiếp cận (accessibility). Trong JSX của React thuộc tính này viết là htmlFor vì for là từ khoá của JavaScript. "It styles the label based on form control types" sai vì kiểu chữ của nhãn do lớp form-label của Bootstrap đảm nhiệm. "It is used for adding inline form validation" nhầm: kiểm tra dữ liệu dùng required, pattern hoặc lớp is-invalid với invalid-feedback. "It triggers JavaScript events when the form is submitted" sai vì sự kiện gửi form được bắt bằng onSubmit trên thẻ form, không qua thuộc tính của nhãn.
Mở trang câu hỏi này →
ATo define functions with a shorter syntax
BTo create self-executing functions
CTo declare asynchronous functions
DTo bind the value of this inside a function
Lời giải

Đáp án đúng: "To define functions with a shorter syntax". Arrow function (hàm mũi tên) của ES6 ra đời trước hết để viết hàm gọn hơn: bỏ từ khoá function, có thể bỏ ngoặc khi chỉ có một tham số và bỏ return khi thân là một biểu thức, rất tiện cho callback như map, filter hay hàm xử lý sự kiện trong React. "To create self-executing functions" sai vì hàm tự gọi (IIFE) viết được bằng cả function thường lẫn hàm mũi tên, đó không phải mục đích của cú pháp này. "To declare asynchronous functions" sai vì hàm bất đồng bộ được khai báo bằng từ khoá async từ ES2017, áp dụng cho cả hai kiểu hàm. "To bind the value of this inside a function" là điểm dễ gây tranh cãi: hàm mũi tên đúng là không có this riêng mà dùng this của phạm vi bao ngoài, nhờ vậy tránh phải gọi bind trong class component; nhưng đó là đặc điểm đi kèm, không phải ràng buộc this, vì bind, call hay apply đều không đổi được this của nó, và câu hỏi hỏi mục đích chung nên cú pháp ngắn gọn là đáp án được chọn.

Mở trang câu hỏi này →
ABy running "npm create-react-app my-app"
BBy downloading a ZIP file from the official website
CBy using an online code editor
DBy cloning a Git repository
Lời giải
Đáp án đúng: "By running "npm create-react-app my-app"". Create React App là công cụ dòng lệnh dựng sẵn một dự án React với cấu hình webpack, Babel, máy chủ phát triển và các script start, build, test; cách dùng là chạy lệnh tạo dự án trong terminal kèm tên thư mục my-app, dạng chuẩn theo tài liệu là npx create-react-app my-app (hoặc npm create react-app my-app), nên phương án chạy lệnh create-react-app là phương án duy nhất mô tả đúng cách tạo dự án, dù cách viết chuẩn dùng npx. Ngày nay công cụ này đã ngừng được khuyến nghị, dự án mới thường dùng Vite hoặc framework như Next.js, nhưng câu hỏi hỏi riêng về Create React App. Phương án "By downloading a ZIP file from the official website" sai vì công cụ không phát hành dự án mẫu dạng tệp nén để tải về. Phương án "By using an online code editor" như CodeSandbox chỉ giúp thử React trên trình duyệt, không phải cách dùng Create React App. Phương án "By cloning a Git repository" là sao chép một dự án có sẵn, không phải khởi tạo ứng dụng mới bằng công cụ.
Mở trang câu hỏi này →
ARoutes is for styling, and Route is for defining event handlers.
BRoutes is for managing state, and Route is for rendering components.
CRoutes is used to wrap Route components and define the application's routes, while Route is used to define an individual route.
DRoutes is for client-side logic, and Route is for server-side logic
Lời giải
Đáp án đúng: "Routes is used to wrap Route components and define the application's routes, while Route is used to define an individual route.". Trong React Router v6, Routes là vùng chứa bao các Route con: mỗi khi URL đổi, nó xét toàn bộ cây Route bên trong, chọn route khớp nhất và render element của route đó; còn mỗi Route mô tả một tuyến riêng lẻ bằng prop path và prop element (component sẽ hiện), có thể lồng nhau để tạo route con hiển thị qua Outlet. Phương án "Routes is for styling, and Route is for defining event handlers." sai vì cả hai không liên quan tới định kiểu giao diện hay xử lý sự kiện. Phương án "Routes is for managing state, and Route is for rendering components." đúng một nửa ở chỗ Route quyết định component nào hiện, nhưng Routes không phải công cụ quản lý state. Phương án "Routes is for client-side logic, and Route is for server-side logic" sai vì cả hai cùng chạy phía client trong trình duyệt, chúng chia việc theo quan hệ bao chứa chứ không theo client và server.
Mở trang câu hỏi này →
Aconst Child = (props) => { const { name, age } = props; return <div>{name}, {age}</div>; };
Bconst Child = (props) => { const name = props.name; const age = props.age; return <div>{name}, {age}</div>; };
Cconst Child = ({ props }) => { const { name, age } = props; return <div>{name}, {age}</div>; };
Dconst Child = ({ name, age }) => { return <div>{name}, {age}</div>; };
Lời giải

Đáp án đúng: "const Child = ({ name, age }) => {

Lời giải
return <div>{
  name
}

, {age}</div>; };". Function component nhận props là một đối tượng, nên có thể phân rã (destructure) ngay trong danh sách tham số: hàm nhận thẳng hai biến name và age, thân hàm chỉ còn trả về JSX hiển thị chúng. Phương án chứa "(props) => { const { name, age } = props;" cũng là destructuring hợp lệ và chạy đúng, nhưng làm thành một bước riêng trong thân hàm qua biến props trung gian, không phải cách phân rã props tại tham số mà câu hỏi nhắm tới. Phương án chứa "const name = props.name; const age = props.age;" chỉ gán từng thuộc tính bằng dấu chấm, hoàn toàn không dùng destructuring. Phương án chứa "({ props }) => {" phân rã lấy khoá tên props từ đối tượng props, mà đối tượng đó không có khoá này nên biến props là undefined và câu lệnh phân rã kế tiếp ném TypeError.

Mở trang câu hỏi này →
AIt provides a comprehensive set of pre-built components for rapid development
BIt enforces strict design patterns to maintain visual consistency.
CIt offers a huge list of utility CSS classes, providing more freedom for custom designs
DIt relies heavily on JavaScript for styling and layout management.
Lời giải
Đáp án đúng: "It offers a huge list of utility CSS classes, providing more freedom for custom designs". Tailwind CSS theo hướng utility-first: thay vì đưa ra nút, thẻ, thanh điều hướng dựng sẵn, nó cung cấp rất nhiều lớp tiện ích nhỏ, mỗi lớp làm một việc như đặt khoảng đệm, màu, cỡ chữ hay bố cục flex, rồi ta ghép chúng ngay trên phần tử để tạo giao diện riêng, nên tự do thiết kế hơn Bootstrap. "It provides a comprehensive set of pre-built components for rapid development" sai vì bộ component dựng sẵn chính là đặc trưng của Bootstrap, không phải của Tailwind. "It enforces strict design patterns to maintain visual consistency." sai vì Tailwind không áp đặt mẫu thiết kế; tính nhất quán đến từ thang giá trị trong tệp cấu hình mà ta tự chỉnh. "It relies heavily on JavaScript for styling and layout management." sai vì Tailwind sinh ra tệp CSS thuần lúc build, giao diện chạy hoàn toàn bằng CSS, không cần JavaScript để định kiểu hay bố cục.
Mở trang câu hỏi này →
AUse .container-fluid for the entire layout
BCombine .container with .col-fluid
CUse a fixed-width class with a media query
DUse .container-md to apply a responsive container at the md breakpoint
Lời giải
Đáp án đúng: "Use .container-md to apply a responsive container at the md breakpoint". Container responsive của Bootstrap 5 như .container-md kết hợp hai kiểu độ rộng: dưới breakpoint md (768px) nó rộng 100% như container fluid, từ md trở lên nó chuyển sang max-width cố định tính bằng pixel, lần lượt 720px, 960px, 1140px, 1320px theo từng mốc. Đó chính là cách gộp hành vi fluid và pixel trong cùng một container mà không cần tự viết CSS. "Use .container-fluid for the entire layout" chỉ cho hành vi fluid ở mọi kích thước, không có phần pixel. "Combine .container with .col-fluid" sai vì Bootstrap không có lớp .col-fluid. "Use a fixed-width class with a media query" là tự viết CSS thủ công, chạy được nhưng không phải thứ Bootstrap 5 cung cấp sẵn và bỏ qua hệ container responsive.
Mở trang câu hỏi này →
A200 OK
B404 Not Found
C500 Internal Server Error
D302 Found
Lời giải
Đáp án đúng: "200 OK". Mã trạng thái HTTP nhóm 2xx báo yêu cầu đã được xử lý thành công, trong đó 200 OK là phản hồi thành công tiêu chuẩn, thường kèm dữ liệu trả về; khi gọi API bằng fetch, thuộc tính response.ok là true với mọi mã từ 200 tới 299, còn Axios coi đó là thành công và không ném lỗi. "404 Not Found" thuộc nhóm 4xx lỗi phía máy khách, nghĩa là không tìm thấy tài nguyên ở đường dẫn yêu cầu. "500 Internal Server Error" thuộc nhóm 5xx, máy chủ gặp lỗi bên trong khi xử lý. "302 Found" thuộc nhóm 3xx chuyển hướng, báo tài nguyên tạm thời nằm ở địa chỉ khác ghi trong header Location, trình duyệt sẽ đi tiếp sang đó nên chưa phải phản hồi thành công cuối cùng.
Mở trang câu hỏi này →
ATo handle database operations
BTo manage user authentication
CTo handle navigation between different pages
DTo style the user interface
Lời giải
Đáp án đúng: "To handle navigation between different pages". Router (bộ định tuyến) theo dõi URL và quyết định nội dung nào được hiển thị cho mỗi đường dẫn, nhờ đó người dùng chuyển qua lại giữa các trang, dùng được nút quay lại của trình duyệt và có thể chia sẻ đường link tới một trang cụ thể; trong ứng dụng một trang (SPA) như React, React Router đổi component hiển thị mà không tải lại cả trang. "To handle database operations" sai vì đọc ghi cơ sở dữ liệu là việc của máy chủ và tầng truy cập dữ liệu, router không chạm tới dữ liệu. "To manage user authentication" sai vì xác thực người dùng do hệ thống đăng nhập lo; router có thể dùng để chặn một tuyến khi chưa đăng nhập nhưng không tự xác thực ai. "To style the user interface" sai vì trang trí giao diện thuộc về CSS và các thư viện như Bootstrap, router không tác động tới kiểu dáng.
Mở trang câu hỏi này →
ATo connect React components directly to the Redux store without the need for action creators or reducers.
BTo provide a way to store and manage the application's state on the server-side, separate from the client-side state.
CTo enable creating action creators that return functions (for asynchronous operations like API calls) instead of plain action objects.
DTo automatically generate the code for action creators and reducers based on the application's data structure.
Lời giải
Đáp án đúng: "To enable creating action creators that return functions (for asynchronous operations like API calls) instead of plain action objects.". Theo mặc định Redux chỉ nhận action là object thuần và reducer phải là hàm thuần, nên không có chỗ cho việc gọi API; Redux Thunk là middleware cho phép dispatch một hàm, gọi là thunk, hàm này nhận dispatch và getState để chạy thao tác bất đồng bộ rồi dispatch các action thật như đang tải, thành công, thất bại; Redux Toolkit dựng sẵn middleware này và createAsyncThunk được xây trên nó. Phát biểu "connect React components directly to the Redux store without the need for action creators" sai vì kết nối component với store là việc của react-redux qua Provider, useSelector, useDispatch hoặc connect. Phát biểu "store and manage the application's state on the server-side" sai vì Redux Thunk chạy trên client, không quản lý state phía máy chủ. Phát biểu "automatically generate the code for action creators and reducers" sai vì Thunk không sinh mã; việc tự tạo action creator từ reducer là tính năng createSlice của Redux Toolkit.
Mở trang câu hỏi này →
Đề bài
const [isOpen, setIsOpen] = useState(false);
const [buttonText, setButtonText] = useState(isOpen ? "se" : "Open");
function toggle() {
  setIsOpen(!isOpen);
  setButtonText(isOpen ? "Open" : "se");
}
AThe code above is fine as it is.
BRemove buttonText from state and calculate it dynamically in the render method based on isOpen.
CKeep both isOpen and buttonText in state but update them separately.
DUse useEffect to sync buttonText with isOpen.
Lời giải
Đáp án đúng: "Remove buttonText from state and calculate it dynamically in the render method based on isOpen.". buttonText hoàn toàn suy ra được từ isOpen, nên giữ nó thành state riêng là hai nguồn sự thật cho cùng một thông tin. Lần theo toggle: setIsOpen(!isOpen) chưa đổi isOpen ngay, trong lần gọi này isOpen vẫn là giá trị cũ, nên setButtonText phải cố tình đảo điều kiện mới ra đúng chữ; chỉ cần sửa một chỗ mà quên chỗ kia, hay cập nhật isOpen từ nơi khác, là chữ trên nút lệch với trạng thái. Nguyên tắc của React là không lưu thứ tính được từ state khác: bỏ buttonText khỏi state và tính chữ của nút từ isOpen bằng toán tử ba ngôi ngay trong thân component. "The code above is fine as it is." sai vì đoạn mã chạy được nhưng dư state và dễ mâu thuẫn. "Keep both isOpen and buttonText in state but update them separately." chính là cách đang gây rủi ro lệch nhau. "Use useEffect to sync buttonText with isOpen." chạy được nhưng thêm một lần render thừa và một khoảnh khắc hai state lệch nhau; tài liệu React khuyên tránh effect chỉ để đồng bộ state suy diễn.
Mở trang câu hỏi này →
AUsing props directly in the element prop
BBy manually passing props via useParams
CBy using component prop
DProps are passed automatically in React Router
Lời giải

Đáp án đúng: "Using props directly in the element prop". Trong React Router v6, Route nhận prop element là một phần tử JSX dựng sẵn, nên muốn truyền props cho component được route render thì viết thẳng chúng vào phần tử đó, ví dụ element={

Lời giải
<Profile user={
  currentUser
}
/>

}, giống hệt khi dùng component ở bất kỳ đâu. Phương án "By manually passing props via useParams" sai vì useParams chỉ đọc tham số động trên URL như id trong /users/:id, không phải kênh truyền props tùy ý. Phương án "By using component prop" là cách của React Router v5, cách này không cho truyền props trực tiếp và đã bị bỏ ở v6. Phương án "Props are passed automatically in React Router" sai vì ở v6 router không tự bơm props như history, match vào component nữa; các thông tin đó lấy bằng hook như useNavigate, useLocation, useParams.

Mở trang câu hỏi này →