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 cuối kỳ 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
Anavigate("/user:id");
Bnavigate("/user?id=123");
Cnavigate("/user/123");
Dnavigate({ path: "/user/123" });
Lời giải
Đáp án đúng: "navigate("/user/123");". Hook useNavigate của React Router v6 trả về hàm navigate; gọi hàm này với một chuỗi đường dẫn đã điền sẵn giá trị cụ thể như /user/123 thì router chuyển tới URL đó, route khai báo theo mẫu path="/user/:id" sẽ khớp và component đích đọc lại id bằng useParams. Dấu hai chấm chỉ dùng khi KHAI BÁO mẫu route chứ không dùng khi điều hướng, nên "navigate("/user:id");" đẩy tới đúng chuỗi ký tự /user:id, vừa thiếu dấu gạch chéo vừa không thay bằng giá trị thật. "navigate("/user?id=123");" vẫn chuyển trang được nhưng id lúc này là tham số truy vấn (query string), phải đọc bằng useSearchParams, không phải tham số route mà useParams nhận. "navigate({ path: "/user/123" });" sai vì đối tượng đích mà navigate nhận dùng khoá pathname (kèm search, hash), không có khoá path, nên đường dẫn /user/123 không được dùng tới.
Mở trang câu hỏi này →
2What is the core principle of Redux?4 lựa chọn
ASingle source of truth and unidirectional data flow.
BMultiple sources of truth for each component.
CState is mutable and can be directly modified.
DState is only updated using the useState hook.
Lời giải
Đáp án đúng: "Single source of truth and unidirectional data flow.". Redux giữ toàn bộ state của ứng dụng trong một store duy nhất (single source of truth – một nguồn sự thật duy nhất), và dữ liệu chỉ chảy một chiều (unidirectional data flow): giao diện dispatch một action, reducer tính ra state mới từ state cũ cùng action đó, store báo cho các component đang đọc để chúng render lại. "Multiple sources of truth for each component." sai vì chia state thành nhiều nguồn riêng cho từng component chính là điều Redux muốn tránh, mọi component đọc chung một store. "State is mutable and can be directly modified." sai vì state trong Redux được coi là bất biến (immutable): reducer phải trả về đối tượng mới chứ không sửa trực tiếp; Redux Toolkit cho viết kiểu gán nhưng thư viện Immer vẫn tạo bản sao mới phía sau. "State is only updated using the useState hook." sai vì useState chỉ quản lý state cục bộ của một component React, còn state trong Redux chỉ đổi khi một action được dispatch và đi qua reducer.
Mở trang câu hỏi này →
AArrow functions
BDestructuring assignment
CJSX syntax
DTemplate Literals
Lời giải
Đáp án đúng gồm ba ý: "Arrow functions", "Destructuring assignment" và "Template Literals". ES6 (ECMAScript 2015) là phiên bản chuẩn JavaScript bổ sung nhiều cú pháp mà mã React dùng hằng ngày: arrow function (hàm mũi tên) giúp viết hàm xử lý sự kiện và callback ngắn gọn, lại không tạo this riêng nên tránh lỗi mất ngữ cảnh; destructuring assignment (gán phân rã) cho phép tách props thành từng biến hoặc nhận cặp giá trị và hàm cập nhật mà useState trả về; template literals (chuỗi mẫu) giúp ghép chuỗi có biến, chẳng hạn tạo className động. "JSX syntax" không thuộc ES6: JSX là phần mở rộng cú pháp do React đưa ra, trình duyệt không hiểu trực tiếp và phải được công cụ như Babel biên dịch thành lời gọi React.createElement hoặc hàm jsx, nên nó không phải tính năng của chuẩn ECMAScript dù React rất cần nó.
Mở trang câu hỏi này →
A<h2> <p>{userName}</p> </h2>
B<h2> {userName} </h2>
C<h2> "userName" </h2>
D<h2>{userName: "John"}</h2>
Lời giải

Đáp án đúng: "

Lời giải
<h2> {
  userName
}
</h2>

". Trong JSX, cặp ngoặc nhọn mở một chỗ chứa biểu thức JavaScript: biểu thức bên trong được tính lúc render và giá trị của nó được chèn vào làm nội dung văn bản của thẻ, nên đặt biến userName trong ngoặc nhọn ngay giữa thẻ h2 sẽ hiện ra tên người dùng hiện tại và tự đổi theo khi biến mang giá trị mới. Phương án "

Lời giải
<h2> <p>{
  userName
}
</p> </h2>

" cũng hiện được tên nhưng lồng thêm một thẻ p không cần thiết vào tiêu đề, mà p là phần tử khối, đặt trong h2 là HTML không hợp lệ vì h2 chỉ nhận nội dung dạng chữ. Phương án "<h2> "userName" </h2> " thiếu ngoặc nhọn nên JSX coi đó là chữ thường và in nguyên văn cả tên biến lẫn dấu nháy chứ không đọc giá trị biến. Phương án "

Lời giải
<h2>{
  userName: "John"
}
</h2>

" sai vì cặp ngoặc nhọn ngoài cùng là chỗ chứa biểu thức, mà userName: "John" không phải một biểu thức JavaScript hợp lệ nên trình biên dịch báo lỗi cú pháp, và dù có chạy thì nó cũng gán cứng một tên chứ không hiển thị biến động.

Mở trang câu hỏi này →
A.navbar-static
B.nav-horizontal
C.navbar
D.navigation-block
Lời giải
Đáp án đúng: ".navbar". Trong Bootstrap, lớp .navbar là lớp gốc của thành phần thanh điều hướng (navbar); khi kết hợp với lớp .navbar-expand-lg (hoặc -md, -sm) và nút .navbar-toggler, thanh tự thu gọn thành nút ba gạch trên màn hình hẹp và bung ngang trên màn hình rộng, nhờ đó responsive (tự thích ứng theo kích thước màn hình). ".navbar-static" không phải lớp có trong Bootstrap; vị trí của navbar được chỉnh bằng lớp tiện ích như .fixed-top hay .sticky-top. ".nav-horizontal" cũng không tồn tại; menu ngang đơn giản dùng .nav cùng .nav-link và hướng xếp do flexbox quyết định. ".navigation-block" là tên tự đặt, Bootstrap không định nghĩa lớp này nên gắn vào phần tử cũng không sinh ra kiểu dáng nào.
Mở trang câu hỏi này →
AFlux enforces unidirectional data flow, while MVC allows bidirectional data flow.
BMVC enforces unidirectional data flow, while Flux allows bidirectional data flow.
CBoth Flux and MVC enforce unidirectional data flow.
DBoth Flux and MVC allow bidirectional data flow.
Lời giải
Đáp án đúng: "Flux enforces unidirectional data flow, while MVC allows bidirectional data flow.". Flux là kiến trúc Facebook đề xuất cho ứng dụng React, buộc dữ liệu đi theo một chiều (unidirectional data flow): view phát action, dispatcher chuyển action tới store, store cập nhật rồi view render lại; view không được sửa store trực tiếp. Trong MVC, controller và view đều có thể cập nhật model, model lại báo ngược cho view, nên dữ liệu đi hai chiều (bidirectional) và khó lần theo khi ứng dụng lớn. Phát biểu "MVC enforces unidirectional data flow, while Flux allows bidirectional data flow." đảo ngược vai trò của hai kiến trúc. "Both Flux and MVC enforce unidirectional data flow." sai vì MVC không ép luồng một chiều. "Both Flux and MVC allow bidirectional data flow." sai vì mục tiêu cốt lõi của Flux chính là loại bỏ luồng hai chiều để trạng thái dễ dự đoán.
Mở trang câu hỏi này →
AuseState should be useReducer
Buse setItems([...items, 'new'])
Cpush is not a valid method
DsetItems must take a string
Lời giải
Đáp án đúng: "use setItems([...items, 'new'])". State trong React phải được coi là bất biến (immutable): items.push('new') sửa trực tiếp mảng cũ, rồi setItems(items) truyền lại chính tham chiếu đó, React so sánh bằng Object.is thấy giá trị không đổi nên bỏ qua lần render lại và giao diện không hiện mục mới. Cách đúng là tạo mảng mới bằng toán tử spread (trải mảng) gồm các phần tử cũ cộng thêm 'new', tham chiếu khác đi nên component render lại. "useState should be useReducer" không đúng vì useReducer chỉ là lựa chọn khác cho state phức tạp, nó cũng đòi trả về state mới và không tự sửa được lỗi đột biến mảng. "push is not a valid method" sai vì push là phương thức hợp lệ của Array, vấn đề là nó đột biến mảng chứ không phải không tồn tại. "setItems must take a string" sai vì hàm cập nhật nhận giá trị thuộc kiểu bất kỳ hoặc một hàm cập nhật, ở đây state là mảng nên truyền mảng là đúng.
Mở trang câu hỏi này →
AAxios has better support for handling requests and responses.
BAxios requires less boilerplate code.
CAxios is faster than fetch for all types of HTTP requests.
DAxios does not support promises.
Lời giải
Đáp án đúng: "Axios has better support for handling requests and responses.". Axios là thư viện HTTP được xây sẵn nhiều tiện ích quanh request và response: tự chuyển dữ liệu sang JSON khi gửi và tự phân tích JSON khi nhận, có interceptor (bộ chặn) để gắn token hay xử lý lỗi chung, tự ném lỗi khi mã trạng thái không thuộc 2xx, hỗ trợ timeout và huỷ request; với fetch, những việc này phải tự viết, ví dụ phải gọi response.json() và tự kiểm response.ok. "Axios requires less boilerplate code." không phải đáp án vì việc ít mã lặp hơn chỉ là hệ quả của chính các tiện ích kể trên, và với một lệnh GET đơn giản thì fetch cũng ngắn chẳng kém. "Axios is faster than fetch for all types of HTTP requests." sai vì tốc độ phụ thuộc mạng và máy chủ; Axios trên trình duyệt chạy bằng XMLHttpRequest nên không nhanh hơn fetch một cách tổng quát. "Axios does not support promises." sai vì Axios dựa hoàn toàn trên Promise, mọi lời gọi như axios.get đều trả về Promise dùng được với then hoặc await.
Mở trang câu hỏi này →
9The purpose of JSX is to:4 lựa chọn
AMake JavaScript code more readable by embedding HTML in JavaScript
BMake JavaScript run faster
CEncrypt HTML elements
DHandle server-side logic
Lời giải
Đáp án đúng: "Make JavaScript code more readable by embedding HTML in JavaScript". JSX (JavaScript XML) là phần mở rộng cú pháp cho phép viết thẻ trông giống HTML ngay trong mã JavaScript để mô tả giao diện, nhờ đó cấu trúc component dễ đọc như một trang HTML trong khi vẫn dùng được biểu thức JavaScript trong cặp ngoặc nhọn; khi build, Babel chuyển từng thẻ thành lời gọi React.createElement. "Make JavaScript run faster" sai vì JSX chỉ là lớp cú pháp được biên dịch đi, mã chạy thực tế vẫn là lời gọi hàm thông thường, không nhanh hơn viết tay. "Encrypt HTML elements" sai vì JSX không mã hoá gì cả; nó chỉ tạo ra mô tả phần tử để React dựng DOM. "Handle server-side logic" sai vì JSX mô tả giao diện, còn logic phía máy chủ như truy vấn dữ liệu hay xác thực thuộc về back-end.
Mở trang câu hỏi này →
Aconst value = MyContext();
Bconst value = useContext(MyContext);
Cconst value = this.context(MyContext);
D<MyContext.Provider useContext={value} />
Lời giải

Đáp án đúng: "const value = useContext(MyContext);". Hook useContext nhận chính đối tượng context được tạo bởi createContext và trả về giá trị của Provider gần nhất phía trên component trong cây; khi giá trị Provider đổi, component đang đọc nó sẽ render lại. Vì vậy trong function component ta gọi useContext(MyContext) ở cấp cao nhất của hàm rồi gán kết quả vào biến. Phương án "const value = MyContext();" gọi đối tượng context như một hàm, nhưng context là đối tượng chứ không phải hàm nên sẽ ném lỗi TypeError. Phương án "const value = this.context(MyContext); " mượn cách của class component, nhưng ở class this.context là một thuộc tính (dùng cùng static contextType) chứ không phải hàm để gọi, và function component cũng không có this. Phương án "

Lời giải
<MyContext.Provider useContext={
  value
}
/>

" là phía cung cấp chứ không phải phía đọc: Provider nhận giá trị qua prop value, không có prop tên useContext, và viết vậy không đọc được gì vào component.

Mở trang câu hỏi này →
Đề bài
using React-Bootstrap: import {
  Button
}

from 'react-bootstrap';

Đề bài
<Button _______="primary">Click me</Button>
Acolor
Bvariant
Cstyle
Dtheme
Lời giải
Đáp án đúng: "variant". Trong React-Bootstrap, component Button nhận prop variant (biến thể) để chọn kiểu màu theo bảng màu của Bootstrap: variant="primary" được đổi thành lớp btn btn-primary, ngoài ra còn secondary, success, danger, outline-primary và các biến thể khác. "color" không phải prop của Button trong React-Bootstrap; nếu truyền vào, nó chỉ rơi xuống thẻ button HTML như một thuộc tính lạ và không đổi kiểu nút. "style" là prop chuẩn của React, nhận một đối tượng CSS nội tuyến chứ không nhận chuỗi tên biến thể, nên viết như vậy không ra kiểu nút chính. "theme" cũng không phải prop của Button; màu chủ đạo của cả giao diện được tuỳ biến qua biến Sass của Bootstrap chứ không qua từng nút.
Mở trang câu hỏi này →
A.container-fluid
B.container
C.container-lg
D.container-xs
Lời giải
Đáp án đúng: ".container-fluid". Trong Bootstrap, .container-fluid luôn rộng 100% khung nhìn ở mọi breakpoint (điểm ngắt), nên bố cục co giãn liên tục theo màn hình và không bao giờ bị khoá ở một max-width cố định. ".container" là container responsive cố định: nó rộng 100% dưới 576px nhưng từ breakpoint sm trở lên lại nhảy theo các max-width cố định như 540px, 720px, 960px, nên không co giãn ở mọi breakpoint. ".container-lg" chỉ rộng 100% cho tới trước breakpoint lg rồi chuyển sang max-width cố định, tức là chỉ co giãn một phần. ".container-xs" không phải lớp có thật của Bootstrap, vì xs là mức mặc định không có hậu tố riêng cho container; muốn hành vi đó thì dùng .container-fluid.
Mở trang câu hỏi này →
ATo return a new Promise object.
BTo immediately execute the next line of code without waiting.
CTo pause the execution of the async function until the Promise it's waiting for is resolved or rejected.
DTo define a synchronous block of code
Lời giải
Đáp án đúng: "To pause the execution of the async function until the Promise it's waiting for is resolved or rejected.". Từ khoá await chỉ dùng trong hàm async (hoặc ở cấp cao nhất của module): nó tạm dừng phần thân còn lại của hàm đó cho tới khi Promise đứng sau nó ổn định, nếu resolve thì biểu thức await trả về giá trị, nếu reject thì ném lỗi để try/catch bắt; trong lúc chờ, luồng chính không bị chặn mà vẫn xử lý việc khác qua event loop (vòng lặp sự kiện). "To return a new Promise object." mô tả từ khoá async chứ không phải await, vì chính hàm async luôn trả về một Promise. "To immediately execute the next line of code without waiting." ngược hẳn với await, đó là hành vi khi gọi một hàm trả Promise mà không await nó. "To define a synchronous block of code" sai vì await không tạo khối mã đồng bộ, mã chỉ trông tuần tự còn bản chất vẫn bất đồng bộ.
Mở trang câu hỏi này →
AUsing <Link path="/" element={<Home>} />
BUsing <Route path="/" element={<Home>} />
CUsing <Routes path="/" element={<Home>} />
DUsing <context path="/"></context><suspense></home>
Lời giải

Đáp án đúng: "Using <Route path="/" element={ <Home> } />". Trong React Router v6, mỗi tuyến đường được khai báo bằng component Route với hai prop chính: path là đường dẫn URL cần khớp và element là phần tử React sẽ hiển thị khi URL khớp; các Route này đặt bên trong Routes. "Using <Link path="/" element={ <Home> } />" sai vì Link dùng để tạo liên kết điều hướng (sinh ra thẻ a) và nhận prop to chỉ đích đến, nó không khai báo tuyến đường nào. "Using <Routes path="/" element={ <Home> } />" sai vì Routes là bộ chứa, nó duyệt các Route con và chọn tuyến khớp nhất với URL hiện tại, bản thân nó không nhận path hay element. "Using

Lời giải
<context path="/">
</context>
<suspense>

</home>" sai vì đây không phải component nào của React Router: context và suspense viết thường bị JSX hiểu là thẻ HTML, thẻ đóng home còn không có thẻ mở tương ứng nên đoạn này không biên dịch được.

Mở trang câu hỏi này →
A2
B200
C2000
D20000
Lời giải
Đáp án đúng: "2000". Hàm setTimeout của JavaScript nhận độ trễ tính bằng mili giây (millisecond), mà 1 giây bằng 1000 mili giây, nên muốn chờ 2 giây thì truyền 2000. Trong React, ta gọi setTimeout bên trong useEffect vì đặt hẹn giờ là một side effect (tác dụng phụ) chứ không phải việc tính toán giao diện, và nên trả về hàm dọn dẹp gọi clearTimeout để huỷ hẹn giờ khi component bị gỡ hoặc effect chạy lại. "2" sai vì chỉ là 2 mili giây, gần như chạy ngay lập tức. "200" sai vì tương ứng 0,2 giây, nhanh gấp mười lần yêu cầu. "20000" sai vì tương ứng 20 giây, chậm gấp mười lần yêu cầu; nhầm này thường do quên rằng đơn vị là mili giây chứ không phải giây.
Mở trang câu hỏi này →
ABy using PropTypes.array.isRequired
BBy creating a custom PropType validator
CBy using PropTypes.arrayOf()
DBy using PropTypes.objectOf()
Lời giải
Đáp án đúng: "By creating a custom PropType validator". Các validator có sẵn của PropTypes chỉ kiểm tra kiểu và sự có mặt của prop, không kiểm tra ràng buộc về số lượng phần tử; muốn đòi một mảng có ít nhất một phần tử thì phải viết validator tự định nghĩa, tức một hàm nhận props, propName, componentName và trả về một đối tượng Error khi giá trị không phải mảng hoặc có độ dài bằng 0, React sẽ in cảnh báo ở môi trường development. Phương án "By using PropTypes.array.isRequired" chỉ bảo đảm prop là mảng và bắt buộc phải truyền, một mảng rỗng vẫn lọt qua. Phương án "By using PropTypes.arrayOf()" kiểm tra kiểu của từng phần tử trong mảng (ví dụ mảng toàn số), vẫn chấp nhận mảng rỗng. Phương án "By using PropTypes.objectOf()" dành cho đối tượng có các giá trị cùng một kiểu, hoàn toàn không dùng để kiểm mảng.
Mở trang câu hỏi này →
AUsing the bind() method.
BUsing arrow functions.
CUsing the addEventListener() method.
DUsing the this keyword.
Lời giải
Đáp án đúng gồm ba ý: "Using the bind() method.", "Using arrow functions." và "Using the this keyword.". Muốn truyền thêm tham số cho hàm xử lý sự kiện (event handler), React có hai cách thật: bọc bằng arrow function (hàm mũi tên) như onClick={() => handleDelete(id)}, hoặc dùng bind để tạo một hàm mới có sẵn đối số, ví dụ this.handleDelete.bind(this, id), khi đó đối tượng event được nối vào sau cùng. Cần nói thẳng chỗ dễ tranh cãi: "Using the this keyword." tự nó không truyền được tham số, nó chỉ đúng theo nghĩa đi kèm bind(this, arg) trong class component, nơi this trỏ tới thể hiện component và là đối số đầu tiên của bind; vì gắn liền với cách dùng bind nên ý này được tính là đúng. Ngược lại "Using the addEventListener() method." là API DOM thuần, gắn trình nghe trực tiếp lên phần tử thật và đi vòng qua hệ thống sự kiện của React, nên không phải cách truyền tham số cho event handler trong React.
Mở trang câu hỏi này →
ATo handle asynchronous actions and side effects
BTo define the structure of the Redux store
CTo connect React components to the Redux store
DTo manage component hierarchy
Lời giải
Đáp án đúng: "To handle asynchronous actions and side effects". Middleware trong Redux là lớp chen giữa lúc dispatch một action và lúc action tới reducer; nhờ đó nó có thể chặn, ghi log, trì hoãn hoặc biến đổi action, và đây là chỗ đặt logic bất đồng bộ cùng side effect (tác dụng phụ) như gọi API, ví dụ redux-thunk cho phép dispatch một hàm thay vì object thuần. Reducer phải là hàm thuần nên không làm được việc này. "To define the structure of the Redux store" là việc của reducer, gộp lại bằng combineReducers hoặc configureStore. "To connect React components to the Redux store" là việc của thư viện react-redux với Provider, useSelector, useDispatch hay connect. "To manage component hierarchy" thuộc về chính React qua cây component, Redux không quyết định component nào lồng trong component nào.
Mở trang câu hỏi này →
APassing a function as a prop to the child component.
BUsing useState hook in the child component.
CUsing useContext in both parent and child components.
DDirectly accessing the child component's state.
Lời giải
Đáp án đúng: "Passing a function as a prop to the child component.". Dữ liệu trong React chảy một chiều từ cha xuống con qua props, và hàm cũng là một giá trị nên cha có thể truyền nó như một prop, ví dụ onAdd={handleAdd}; con gọi props.onAdd(data) để báo ngược sự kiện lên cha, đây là mẫu nâng state lên (lifting state up). "Using useState hook in the child component." chỉ tạo state riêng trong con, không nhận được hàm nào từ cha. "Using useContext in both parent and child components." là cách chia sẻ giá trị qua nhiều tầng mà không truyền props; context cũng chở được hàm, nhưng nó cần thêm createContext và Provider, không phải cách trực tiếp để cha đưa hàm cho con như câu hỏi. "Directly accessing the child component's state." sai vì state được đóng gói bên trong từng component, cha không đọc hay sửa thẳng state của con được.
Mở trang câu hỏi này →
20How can you access Chrome DevTools?4 lựa chọn
ABy pressing F12 or right-clicking and selecting "Inspect"
BBy installing a Chrome extension
CBy typing "chrome://devtools" in the address bar
DBy opening the Chrome menu and selecting "DevTools"
Lời giải
Đáp án đúng: "By pressing F12 or right-clicking and selecting "Inspect"". Chrome DevTools (bộ công cụ cho nhà phát triển) được tích hợp sẵn trong trình duyệt, nên cách nhanh và phổ biến nhất là nhấn F12 (hoặc Ctrl+Shift+I trên Windows), hay nhấp chuột phải lên một phần tử rồi chọn Inspect để mở thẳng tab Elements tại đúng phần tử đó. "By installing a Chrome extension" sai vì DevTools có sẵn, không cần cài thêm gì; tiện ích như React Developer Tools chỉ bổ sung tab mới vào DevTools chứ không phải cách để mở nó. "By typing "chrome://devtools" in the address bar" sai vì gõ địa chỉ này không mở bảng DevTools cho trang đang xem; DevTools gắn với từng tab và được mở bằng phím tắt hoặc menu. "By opening the Chrome menu and selecting "DevTools"" sai theo đúng cách nó mô tả: menu Chrome không có mục nào tên DevTools ở cấp đầu, đường đi thật là More tools rồi Developer tools, nên cách được nêu như đáp án là phím F12 và lệnh Inspect.
Mở trang câu hỏi này →