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ố 2

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 đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
ATo build React components using jQuery
BTo use Bootstrap styles with inline CSS only
CTo provide Bootstrap-styled components built entirely with React
DTo convert Bootstrap HTML into Angular components
Lời giải
Đáp án đúng: "To provide Bootstrap-styled components built entirely with React". React-Bootstrap viết lại các thành phần của Bootstrap như Button, Modal, Navbar, Dropdown thành component React thật: vẫn dùng CSS của Bootstrap, nhưng phần JavaScript vốn dựa trên jQuery được thay bằng state và props của React, nên không có mã nào sửa DOM ngoài tầm kiểm soát của React. "To build React components using jQuery" ngược với mục tiêu của thư viện, vì nó ra đời chính để bỏ phụ thuộc jQuery. "To use Bootstrap styles with inline CSS only" sai vì React-Bootstrap dùng các lớp CSS của Bootstrap như btn, card, container chứ không chuyển sang CSS nội tuyến. "To convert Bootstrap HTML into Angular components" nhầm sang hệ khác: Angular có thư viện riêng như ng-bootstrap, còn React-Bootstrap chỉ phục vụ ứng dụng React.
Mở trang câu hỏi này →
AServer-side logic
BStyling and responsive design
CDatabase connections
DData manipulation
Lời giải
Đáp án đúng: "Styling and responsive design". Bootstrap là framework front-end tập trung vào phần nhìn: nó cung cấp CSS định kiểu sẵn cho chữ, nút, biểu mẫu, bảng, các component như thanh điều hướng, modal, carousel, cùng hệ lưới 12 cột với các điểm ngắt giúp trang tự sắp lại trên điện thoại, máy tính bảng và máy tính, tức thiết kế đáp ứng (responsive design). "Server-side logic" sai vì logic phía máy chủ như xác thực hay xử lý nghiệp vụ được viết ở back-end, Bootstrap chỉ chạy trong trình duyệt. "Database connections" sai vì kết nối cơ sở dữ liệu là việc của tầng máy chủ thông qua driver hoặc ORM, nằm hoàn toàn ngoài phạm vi framework giao diện. "Data manipulation" sai vì biến đổi, lọc hay tính toán dữ liệu là việc của mã JavaScript ứng dụng hoặc back-end; Bootstrap chỉ quyết định dữ liệu đó được trình bày trông ra sao.
Mở trang câu hỏi này →
Acase 'increment': return { count + 1 };
Bcase 'increment': return { count: state.count + 1 };
Ccase 'increment': return { count= count + 1 };
Dcase 'increment': return { state.count + 1 };
Lời giải

Đáp án đúng: "case 'increment':

Lời giải
return {
  count: state.count + 1
}

;". Reducer là hàm thuần nhận state hiện tại cùng action và trả về state mới; trong khối switch theo action.type, mỗi case trả về một đối tượng mới chứ không sửa state cũ, nên với state dạng đối tượng có khóa count, cách viết đúng là tạo đối tượng có thuộc tính count bằng state.count cộng 1. Phương án "case 'increment':

Lời giải
return {
  count + 1
}

;" có ngoặc nhọn nhưng thiếu tên khóa, count + 1 không phải cặp khóa và giá trị nên là lỗi cú pháp, đồng thời count chưa được khai báo trong reducer. Phương án "case 'increment':

Lời giải
return {
  count= count + 1
}

;" dùng dấu bằng trong đối tượng, sai cú pháp vì cặp khóa và giá trị phải dùng dấu hai chấm, và ý đồ là gán thay vì trả về giá trị mới. Phương án "case 'increment':

Lời giải
return {
  state.count + 1
}

;" cũng thiếu tên khóa, biểu thức state.count + 1 không thể đứng một mình trong đối tượng nên lỗi cú pháp.

Mở trang câu hỏi này →
A<MyContext value={someValue}> <Component /> </MyContext>
B<MyContext.Provider value={someValue}> <Component /> </MyContext.Provider>
C<MyContext.Consumer value={someValue}> <Component /> </MyContext.Consumer>
D<MyContext.Provider> <Component value={someValue} /> </MyContext.Provider>
Lời giải

Đáp án đúng: "

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

". Provider của context nhận giá trị qua prop value, và mọi component nằm bên trong nó đọc được giá trị đó bằng useContext(MyContext) hoặc Consumer. "

Lời giải
<MyContext value={
  someValue
}
> <Component /> </MyContext>

" chỉ chạy được từ React 19, khi bản thân đối tượng context được phép dùng làm Provider; với React 18 trở về trước, cách viết chuẩn và chắc chắn vẫn là MyContext.Provider. Phương án chứa "

Lời giải
<MyContext.Consumer value={
  someValue
}
>

" dùng Consumer, vốn để đọc giá trị qua một hàm con, không nhận prop value nên không cung cấp được gì. Phương án chứa "

Lời giải
<Component value={
  someValue
}
/>

" để Provider thiếu value nên các component con đọc ra undefined, còn someValue chỉ thành một prop thường của Component, không đi vào context.

Mở trang câu hỏi này →
AcomponentDidMount
BcomponentWillUnmount
CcomponentDidUpdate
DshouldComponentUpdate
Lời giải
Đáp án đúng: "componentDidMount". Ở class component, componentDidMount được gọi đúng một lần ngay sau khi component render lần đầu và được gắn vào DOM, nên là chỗ để gọi API, đăng ký sự kiện hay đọc kích thước phần tử; ở function component, tương đương là useEffect với mảng phụ thuộc rỗng. "componentWillUnmount" chạy ngay trước khi component bị gỡ khỏi DOM, dùng để dọn dẹp như huỷ hẹn giờ hay huỷ đăng ký. "componentDidUpdate" chạy sau mỗi lần cập nhật, tức các lần render sau lần đầu, không chạy ở lần mount. "shouldComponentUpdate" chạy trước khi render lại, trả về true hoặc false để quyết định có render lại hay không, và không được gọi ở lần render đầu tiên.
Mở trang câu hỏi này →
Đề bài
<button onClick={
  ______
}
>Click</button>
Aconsole.log('Clicked')
Bevent: console.log('Clicked')
C() => console.log('Clicked')
DhandleClick = console.log('Clicked')
Lời giải
Đáp án đúng: "() => console.log('Clicked')". Prop onClick cần nhận một HÀM để React gọi khi người dùng bấm; arrow function bọc lệnh log lại nên lệnh chỉ chạy lúc click. "console.log('Clicked')" là lời gọi hàm, chạy ngay khi component render nên chữ Clicked in ra lúc render, còn onClick nhận giá trị trả về undefined nên bấm nút không in gì. "event: console.log('Clicked')" không phải biểu thức hợp lệ, trong chỗ chèn biểu thức của JSX cú pháp nhãn kiểu này gây lỗi biên dịch. "handleClick = console.log('Clicked')" là phép gán: console.log vẫn chạy ngay lúc render, onClick nhận undefined, và gán vào biến chưa khai báo trong module ES (chế độ strict) còn ném ReferenceError.
Mở trang câu hỏi này →
AOK
BCreated
CNot Found
DInternal Server Error
Lời giải
Đáp án đúng: "Not Found". Mã trạng thái HTTP 404 thuộc nhóm 4xx, nhóm lỗi phía client, và có nghĩa là máy chủ không tìm thấy tài nguyên tại URL được yêu cầu, chẳng hạn gõ sai đường dẫn hay gọi API tới bản ghi đã bị xoá. Khi dùng fetch, phản hồi 404 vẫn làm Promise hoàn thành bình thường nhưng response.ok bằng false, còn axios sẽ ném lỗi. "OK" sai vì đó là ý nghĩa của mã 200, yêu cầu thành công. "Created" sai vì đó là mã 201, thường trả về sau POST khi máy chủ tạo được tài nguyên mới. "Internal Server Error" sai vì đó là mã 500 thuộc nhóm 5xx, lỗi xảy ra bên trong máy chủ chứ không phải do không tìm thấy tài nguyên. Nhớ theo nhóm: 2xx thành công, 3xx chuyển hướng, 4xx lỗi từ phía yêu cầu, 5xx lỗi phía máy chủ.
Mở trang câu hỏi này →
AHTTP
BFTP
CSMTP
DSSH
Lời giải
Đáp án đúng: "HTTP". HTTP (HyperText Transfer Protocol, giao thức truyền siêu văn bản) là giao thức theo mô hình yêu cầu và phản hồi giữa client như trình duyệt và máy chủ web: client gửi request với phương thức như GET, POST kèm header, máy chủ trả response có mã trạng thái và nội dung như HTML hoặc JSON; bản HTTPS bổ sung mã hoá TLS, và fetch hay axios trong React đều giao tiếp qua giao thức này. "FTP" sai vì File Transfer Protocol dùng để truyền tệp giữa hai máy, thường để tải tệp lên máy chủ, không phải giao tiếp chính của ứng dụng web. "SMTP" sai vì Simple Mail Transfer Protocol dùng để gửi thư điện tử giữa các máy chủ mail. "SSH" sai vì Secure Shell dùng để đăng nhập và điều khiển máy từ xa qua kênh mã hoá, phục vụ quản trị máy chủ chứ không phục vụ trang web.
Mở trang câu hỏi này →
Đề bài
const [count, setCount] = useState(0);

function increment() {
  setCount(count + 1);
}
AReplace setCount with dispatch in the existing code.
BMove all state update logic into a reducer function.
CDefine the reducer function and use dispatch to replace setCount.
DImport useReducer without changing any code.
Lời giải
Đáp án đúng: "Replace setCount with dispatch in the existing code.". Tài liệu React, ở phần chuyển logic state vào reducer, chia việc đổi useState sang useReducer thành ba bước: bước một là chuyển từ việc đặt state sang việc dispatch action, tức trong increment thay lời gọi setCount(count + 1) bằng một lời gọi dispatch với action có type là increment, mô tả điều người dùng vừa làm; bước hai là viết hàm reducer chứa logic tính state mới; bước ba là dùng reducer trong component bằng useReducer. Cần nói thẳng có nguồn chấm "Move all state update logic into a reducer function." là đáp án, vì nghe rất hợp lý, nhưng theo trình tự trong tài liệu đó là bước hai, làm sau khi đã đổi các chỗ đặt state thành dispatch. Phương án "Define the reducer function and use dispatch to replace setCount." gộp bước hai với bước một và đặt việc viết reducer lên trước, nên không còn là một bước đầu tiên. Phương án "Import useReducer without changing any code." chỉ thêm lệnh import, không chuyển được chút logic nào nên không phải bước chuyển đổi có ý nghĩa.
Mở trang câu hỏi này →
ATo reduce the initial load time of an application by splitting JavaScript bundles.
BTo combine multiple React components into a single bundle.
CTo handle all the state management in React applications.
DTo make the app compatible with server-side rendering.
Lời giải
Đáp án đúng: "To reduce the initial load time of an application by splitting JavaScript bundles.". Mặc định công cụ build gộp toàn bộ mã vào một gói lớn; code splitting (tách mã) chia gói đó thành nhiều chunk, trong React thực hiện bằng import() động và React.lazy kèm Suspense, nên trình duyệt chỉ tải phần mã của màn hình đang mở, các phần khác tải sau khi cần, nhờ đó lần tải đầu nhanh hơn. "To combine multiple React components into a single bundle." là việc gộp gói thông thường, chính là thứ code splitting chia nhỏ lại. "To handle all the state management in React applications." thuộc về useState, Context hay Redux, tách mã không quản lý state. "To make the app compatible with server-side rendering." sai vì SSR là kỹ thuật render HTML trên máy chủ; tách mã dùng được cùng SSR nhưng không nhằm làm ứng dụng tương thích với SSR.
Mở trang câu hỏi này →
AonClick=“handleClick()”
BonClick={handleClick}
Cevent=“handleClick”
DhandleClick()
Lời giải
Đáp án đúng: "onClick={handleClick}". Trong JSX, sự kiện viết theo camelCase và nhận một hàm đặt trong ngoặc nhọn; React lưu tham chiếu tới handleClick và chỉ gọi nó khi người dùng bấm. "onClick=“handleClick()”" viết như thuộc tính HTML bằng một chuỗi chứa lời gọi hàm; React yêu cầu giá trị của onClick là hàm nên chuỗi không được thực thi khi bấm. "event=“handleClick”" sai vì event không phải tên prop sự kiện nào của React, gắn vào chỉ là thuộc tính vô nghĩa. "handleClick()" chỉ là lời gọi hàm trần: nó chạy ngay mỗi lần render chứ không gắn với cú bấm nào; kể cả đặt vào onClick thì cũng truyền kết quả trả về thay vì truyền hàm.
Mở trang câu hỏi này →
AThe repository has a new branch called new-feature with new-file.js added.
BThe main branch has new-file.js added.
CThe new-feature branch is merged into main without new-file.js.
DThe repository remains unchanged.
Lời giải

Đáp án đúng: "The main branch has new-file.js added.". Lần theo từng lệnh: git init tạo kho rỗng, nhánh mặc định ở đây được hiểu là main (Git cũ mặc định tên master); git add . rồi commit tạo commit đầu tiên; git branch new-feature tạo nhánh mới tại commit đó và git checkout new-feature chuyển sang nhánh này; git add new-file.js rồi commit thêm một commit chứa new-file.js chỉ trên new-feature; git checkout main quay về main, lúc này chưa có tệp đó; git merge new-feature thấy main không có commit riêng nào nên tiến thẳng (fast-forward) main lên commit của new-feature. Kết quả cuối là main chứa new-file.js. "The repository has a new branch called new-feature with new-file.js added." đúng ở bước giữa và nhánh đó vẫn còn, nhưng không mô tả kết quả cuối của lệnh merge. "The new-feature branch is merged into main without new-file.js." tự mâu thuẫn vì merge đưa đúng commit thêm tệp vào main. "The repository remains unchanged." sai vì đã có hai commit và một nhánh mới.

Mở trang câu hỏi này →
Aimport React, { lazy, Suspense } from 'react'; const MyComponent = lazy(() => import('./MyComponent')); function App() { return ( <Suspense fallback={<div>Loading...</div>}> <MyComponent /> </Suspense> ); } export default App;
Bimport React, { Suspense } from 'react'; const MyComponent = import('./MyComponent'); function App() { return ( <Suspense fallback={<div>Loading...</div>}> <MyComponent /> </Suspense> ); } export default App;
Cimport React, { lazy } from 'react'; const MyComponent = lazy('./MyComponent'); function App() { return ( <div fallback={<div>Loading...</div>}> <MyComponent /> </div> ); } export default App;
Dimport React from 'react'; const MyComponent = React.lazy(() => import('./MyComponent')); function App() { return ( <React.Suspense> <MyComponent /> </React.Suspense> ); } export default App;
Lời giải

Đáp án đúng: "import React, { lazy, Suspense } from 'react'; const MyComponent = lazy(() => import('./MyComponent')); function App() {

Lời giải
return ( <Suspense fallback={
  <div>Loading...</div>
}

> <MyComponent /> </Suspense> ); } export default App;". Hàm lazy nhận một hàm trả về Promise từ import() động, React chỉ tải chunk của MyComponent khi nó render lần đầu; trong lúc chờ, Suspense bao ngoài hiển thị phần tử truyền qua prop fallback, ở đây là dòng Loading..., tải xong mới thay bằng component thật. Phương án gán "const MyComponent = import('./MyComponent');" bỏ lazy, nên MyComponent là một Promise chứ không phải component, dùng làm thẻ JSX sẽ lỗi. Phương án viết "lazy('./MyComponent')" truyền chuỗi đường dẫn thay cho hàm gọi import(), lazy không tự tải được, đồng thời "<div fallback=" chỉ là thuộc tính vô nghĩa trên thẻ div, không có Suspense nên không có giao diện chờ. Phương án dùng "

Lời giải
<React.Suspense>
  <MyComponent />

" nạp lười đúng nhưng thiếu prop fallback, nên trong lúc tải không hiện gì, trái với yêu cầu hiển thị fallback.

Mở trang câu hỏi này →
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 →
A<Route path="/users/:id" component={UserDetail} />
B<Link to="/users">Users</Link>
Cimport { BrowserRouter as Router, Route } from "react-router-dom";
Dimport { Link, Route } from "react-router-dom";
Lời giải

Đáp án đúng: "

Lời giải
<Route path="/users/:id" component={
  UserDetail
}
/>

". Tham số route được khai báo bằng một đoạn động có dấu hai chấm trong path: /users/:id khớp với /users/5, /users/42 và giá trị sau dấu gạch chéo được gán vào tham số id, component đích đọc lại bằng useParams. Cần nói rõ prop component là cách viết của React Router v5, sang v6 phải viết element kèm thẻ UserDetail, nhưng ý khai báo tham số :id vẫn y nguyên và đây là đoạn mã duy nhất xử lý tham số route. "<Link to="/users">Users</Link> " chỉ tạo liên kết tới đường dẫn tĩnh /users, không có tham số nào. "import { BrowserRouter as Router, Route } from "react-router-dom";" chỉ là lệnh nhập BrowserRouter và Route, chưa khai báo route hay tham số. "import { Link, Route } from "react-router-dom";" cũng chỉ nhập Link và Route, không định nghĩa đường dẫn nào.

Mở trang câu hỏi này →
Anavigate('');
Bnavigate('home');
Cnavigate('/');
Dnavigate('root');
Lời giải
Đáp án đúng: "navigate('/');". useNavigate trả về hàm navigate, gọi với một đường dẫn để chuyển trang bằng mã; đường dẫn bắt đầu bằng dấu gạch chéo là đường dẫn tuyệt đối, và riêng dấu gạch chéo chính là trang gốc của ứng dụng, nên navigate('/') luôn đưa về tuyến gốc dù đang ở đâu. "navigate('');" sai vì chuỗi rỗng là đường dẫn tương đối trỏ về chính tuyến hiện tại, nên trang gần như đứng yên. "navigate('home');" sai vì không có dấu gạch chéo ở đầu nên đây là đường dẫn tương đối, nó đi tới tuyến home nằm dưới tuyến hiện tại, kể cả khi đang ở gốc thì cũng ra /home chứ không phải /. "navigate('root');" sai vì root chỉ là một chữ thường bị hiểu là đoạn đường dẫn tương đối tên root, React Router không có tên đặc biệt nào như vậy cho trang gốc.
Mở trang câu hỏi này →
Afetch(url).then(response => response.json())
Bfetch(url).catch(response => response.json())
Cfetch(url).then(response => response.text())
Dfetch(url).then(response => response.get())
Lời giải
Đáp án đúng: "fetch(url).then(response => response.json())". Gọi fetch chỉ với url sẽ gửi request GET mặc định và trả về Promise cho object Response; then nhận response đó khi request hoàn tất, và gọi json() để đọc thân phản hồi rồi parse thành object JavaScript, cũng trả về Promise để nối tiếp then kế tiếp xử lý dữ liệu, đây là mẫu chuẩn khi gọi API trả JSON. "fetch(url).catch(response => response.json())" sai vì catch chỉ chạy khi Promise bị từ chối, như lỗi mạng, và nhận đối tượng lỗi chứ không nhận response, nên dữ liệu thành công không bao giờ được đọc. "fetch(url).then(response => response.text())" về cú pháp vẫn là một request GET hợp lệ, nhưng text() trả về chuỗi thô và phải tự parse thêm, nên không phải dạng chuẩn để lấy dữ liệu từ API như câu hỏi muốn. "fetch(url).then(response => response.get())" sai vì Response không có phương thức get; các phương thức đọc thân là json, text, blob, arrayBuffer, formData.
Mở trang câu hỏi này →
AGET
BPOST
CPUT
DDELETE
Lời giải
Đáp án đúng: "GET". Theo chuẩn HTTP, GET là phương thức dùng để đọc, lấy tài nguyên từ máy chủ; nó được coi là an toàn (không làm thay đổi dữ liệu) và idempotent (gọi nhiều lần cho cùng kết quả), tham số thường nằm trên URL, và trình duyệt hay bộ đệm có thể lưu lại phản hồi. Trong React, fetch không ghi phương thức hoặc axios.get đều gửi GET. "POST" sai vì nó dùng để gửi dữ liệu lên máy chủ, thường là tạo bản ghi mới như đăng ký tài khoản, dữ liệu nằm trong thân request. "PUT" sai vì nó dùng để thay thế hoặc cập nhật toàn bộ một tài nguyên đã có tại một địa chỉ xác định. "DELETE" sai vì nó yêu cầu máy chủ xoá tài nguyên. Ba phương thức này có thể trả dữ liệu về trong phản hồi, nhưng mục đích chính của chúng là thay đổi dữ liệu, không phải lấy dữ liệu.
Mở trang câu hỏi này →
ATo enhance the performance of a React application by optimizing component rendering
BTo manage state globally across all components in a React application
CTo manage data flow between components within a React application
DTo manage navigation and routing between components within a React application
Lời giải
Đáp án đúng: "To manage navigation and routing between components within a React application". React Router ánh xạ URL trên thanh địa chỉ với component cần hiện: khi người dùng bấm Link hoặc mã gọi navigate, nó đổi URL qua History API mà không tải lại trang, rồi Routes chọn Route khớp và render element tương ứng, nhờ vậy ứng dụng một trang vẫn có nhiều màn hình, có nút quay lại và đường dẫn chia sẻ được. Phương án "To enhance the performance of a React application by optimizing component rendering" là việc của memo, useMemo hay tách mã, không phải mục đích của router. Phương án "To manage state globally across all components in a React application" là việc của Redux hay Context. Phương án "To manage data flow between components within a React application" nói về props, Context hay store; router có truyền tham số URL nhưng nhiệm vụ chính là điều hướng.
Mở trang câu hỏi này →
AIt is called before the component is updated.
BIt is called after the component is updated.
CIt is used to update the component's state.
DIt is used to handle events.
Lời giải
Đáp án đúng: "It is called before the component is updated.". getSnapshotBeforeUpdate là phương thức vòng đời của class component, được React gọi ngay trước khi thay đổi của lần cập nhật được ghi vào DOM thật, tức sau render nhưng trước khi màn hình đổi; giá trị nó trả về (ví dụ vị trí cuộn của một khung chat) được chuyển làm đối số thứ ba cho componentDidUpdate để khôi phục sau cập nhật. "It is called after the component is updated." là thời điểm của componentDidUpdate. "It is used to update the component's state." sai vì cập nhật state làm bằng setState; phương thức này chỉ đọc thông tin từ DOM rồi trả về một giá trị. "It is used to handle events." không liên quan, vì sự kiện được xử lý bằng các hàm gắn vào prop như onClick.
Mở trang câu hỏi này →