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

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
A<a href="/about">About</a>
B<Link to="/about">About</Link>
C<Route to="/about">About</Route>
D<Navigate to="/about">About</Navigate>
Lời giải

Đáp án đúng: "<Link to="/about">About</Link> ". Component Link của react-router-dom hiển thị thành thẻ a nhưng chặn hành vi tải trang mặc định và đổi URL qua History API, để React Router chỉ render route khớp mà không tải lại toàn bộ trang, giữ nguyên state của ứng dụng; thuộc tính to chỉ đường dẫn đích. "<a href="/about">About</a> " sai vì thẻ a thường vẫn đến được trang nhưng trình duyệt tải lại toàn bộ ứng dụng từ máy chủ, mất state và mất lợi ích của điều hướng phía client. "<Route to="/about">About</Route> " sai vì Route dùng để khai báo tuyến đường với path và element, không có thuộc tính to và không tạo liên kết bấm được. "<Navigate to="/about">About</Navigate> " sai vì Navigate chuyển hướng ngay khi được render, dùng cho trường hợp như chưa đăng nhập, nó không hiển thị chữ About thành liên kết cho người dùng bấm.

Mở trang câu hỏi này →
A.collapse
B.accordion
C.collapsible
D.collapse-accordion
Lời giải
Đáp án đúng: ".accordion". Trong Bootstrap 5, component accordion được dựng bằng thẻ bọc mang lớp .accordion, bên trong là các khối .accordion-item, mỗi khối có .accordion-header chứa nút .accordion-button và phần thân .accordion-collapse; cơ chế đóng mở vẫn dựa vào plugin collapse, nhưng lớp xác định component accordion là .accordion. Phương án ".collapse" là lớp ẩn nội dung của plugin collapse, dùng cho một vùng đóng mở đơn lẻ; trong accordion nó chỉ đi kèm phần thân chứ không tự tạo ra accordion. Phương án ".collapsible" không có trong Bootstrap, đó là tên lớp của thư viện khác như Materialize. Phương án ".collapse-accordion" không phải lớp nào của Bootstrap, gắn vào thẻ thì không có hiệu ứng gì.
Mở trang câu hỏi này →
Aresponse.data()
Bresponse.json()
Cresponse.jsonText()
Dresponse.body.json()
Lời giải
Đáp án đúng: "response.json()". Hàm fetch trả về một Promise cho object Response; phần thân của response là một luồng dữ liệu, nên phải gọi phương thức json() để đọc hết thân và phân tích (parse) nó thành object JavaScript, và chính phương thức này cũng trả về Promise, vì vậy ta thường nối tiếp bằng then hoặc dùng await trước nó. "response.data()" sai vì Response của Fetch API không có phương thức data; thói quen đọc thuộc tính data đến từ thư viện axios, nơi dữ liệu đã được parse sẵn và data là thuộc tính chứ không phải hàm. "response.jsonText()" sai vì không tồn tại phương thức này; thứ gần nhất là text(), trả về thân dưới dạng chuỗi thô. "response.body.json()" sai vì body là một ReadableStream, không có phương thức json; việc đọc và parse phải gọi thẳng trên response.
Mở trang câu hỏi này →
ABy passing an empty array as the second argument
BBy using a class-based component
CBy calling it after every render
DBy manually removing event listeners
Lời giải
Đáp án đúng: "By manually removing event listeners". Theo tài liệu React, Effect dọn dẹp bằng cách trả về một hàm cleanup; React gọi hàm này trước mỗi lần Effect chạy lại và khi component unmount, và việc cần làm bên trong là gỡ đúng thứ Effect đã gắn, ví dụ gọi removeEventListener cho listener đã thêm bằng addEventListener, hủy timer hay ngắt kết nối. Cách chuẩn nhất là trả về một hàm cleanup trong đó gỡ listener, nhưng câu không có phương án ấy, nên gỡ listener thủ công là phương án gần nhất với việc dọn dẹp thật sự. Phương án "By passing an empty array as the second argument" hay bị chọn nhầm: mảng phụ thuộc rỗng chỉ quyết định Effect chạy một lần lúc mount và cleanup chạy lúc unmount, tức quyết định thời điểm, còn bản thân nó không dọn dẹp gì; thiếu hàm cleanup thì listener vẫn rò rỉ. Phương án "By using a class-based component" đi ngược hướng hook, vì class dọn dẹp trong componentWillUnmount chứ không dùng useEffect. Phương án "By calling it after every render" là hành vi mặc định khi bỏ mảng phụ thuộc, làm Effect và cleanup chạy dày hơn chứ không tối ưu gì.
Mở trang câu hỏi này →
25ES6 is also known as:4 lựa chọn
AECMAScript 5
BECMAScript 6
CECMAScript 7
DJavaScript 6
Lời giải
Đáp án đúng: "ECMAScript 6". ES6 là tên gọi tắt của ECMAScript 6, bản chuẩn ngôn ngữ do Ecma International công bố năm 2015 nên còn gọi là ES2015; bản này đưa vào let, const, arrow function, class, template literal, destructuring, Promise và module. "ECMAScript 5" là bản trước đó (ES5, năm 2009), chưa có các cú pháp trên. "ECMAScript 7" là ES2016, bản kế tiếp, chỉ bổ sung ít tính năng như toán tử luỹ thừa và Array.prototype.includes. "JavaScript 6" không phải tên gọi chính thức: JavaScript là ngôn ngữ hiện thực chuẩn ECMAScript, và phiên bản được đánh số theo chuẩn ECMAScript chứ không theo tên JavaScript.
Mở trang câu hỏi này →
A<Route path="/user/userId/post/postId" component={UserPost} />
B<Route path="/user/:userId/:postId" component={UserPost} />
C<Route path="/user/:userId/post/:postId" component={UserPost} />
D<Route path="/user?userId/post?postId" component={UserPost} />
Lời giải

Đáp án đúng: "

Lời giải
<Route path="/user/:userId/post/:postId" component={
  UserPost
}
/>

". Trong React Router, mỗi đoạn đường dẫn bắt đầu bằng dấu hai chấm là một tham số động (URL parameter); mẫu này khớp URL như /user/7/post/42 và cho userId là 7, postId là 42, đọc ra bằng useParams (hoặc match.params ở bản cũ). Prop component là cú pháp React Router v5, ở v6 viết bằng prop element, nhưng cách khai báo tham số giống hệt. "

Lời giải
<Route path="/user/userId/post/postId" component={
  UserPost
}
/>

" thiếu dấu hai chấm nên userId và postId chỉ là chữ cố định, chỉ khớp đúng chuỗi đó. "

Lời giải
<Route path="/user/:userId/:postId" component={
  UserPost
}
/>

" cũng hợp lệ về cơ chế vì vẫn khai báo đúng hai tham số, chỉ bỏ đoạn post nên URL thành /user/7/42; đáp án chọn mẫu có đoạn post vì đường dẫn lồng tài nguyên như vậy rõ nghĩa hơn. "

Lời giải
<Route path="/user?userId/post?postId" component={
  UserPost
}
/>

" sai vì dấu chấm hỏi trong URL mở đầu query string, không khai báo tham số đường dẫn.

Mở trang câu hỏi này →
A<Suspense loading={<Loading />}><MyComponent /></Suspense>
B<Suspense fallback={<Loading />}><MyComponent /></Suspense>
C<Suspense wait={<Loading />}><MyComponent /></Suspense>
D<Suspense fallback={<Loading />} loading={<MyComponent />} />
Lời giải

Đáp án đúng: "<Suspense fallback={ <Loading /> }> <MyComponent /> </Suspense>". Suspense nhận đúng một prop tên fallback chứa phần tử hiển thị trong lúc một component con, như component tạo bằng lazy, đang tải; component cần chờ phải nằm BÊN TRONG Suspense dưới dạng con. "<Suspense loading={ <Loading /> }> <MyComponent /> </Suspense>" sai tên prop: Suspense không có prop loading nên không hiện giao diện chờ nào. "<Suspense wait={ <Loading /> }> <MyComponent /> </Suspense>" cũng sai tên prop, wait không tồn tại trên Suspense. "<Suspense fallback={ <Loading /> } loading={ <MyComponent /> } />" có fallback đúng nhưng nhét MyComponent vào một prop lạ thay vì làm con; Suspense tự đóng không có con nên MyComponent không bao giờ được render.

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 →
A<Route path="/users?id" element={<User />} />
B<Route path="/users/:id" element={<User />} />
C<Route path="/users/{id}" element={<User />} />
D<Route path="/users/#id" element={<User />} />
Lời giải

Đáp án đúng: "<Route path="/users/:id" element={ <User /> } />". Trong React Router v6, một đoạn đường dẫn bắt đầu bằng dấu hai chấm là tham số động (dynamic segment): đường dẫn /users/123 khớp với mẫu này và giá trị 123 được gán cho tham số id; bên trong component User, ta lấy nó bằng hook useParams, nhận object có id là chuỗi "123". "<Route path="/users?id" element={ <User /> } />" sai vì phần sau dấu hỏi là query string, React Router không dùng nó để so khớp đường dẫn, nên mẫu này không bắt được /users/123. "<Route path="/users/{id}" element={ <User /> } />" sai vì cặp ngoặc nhọn là cú pháp tham số của framework khác như ASP.NET, còn React Router coi đây là chữ thường cần khớp nguyên văn. "<Route path="/users/#id" element={ <User /> } />" sai vì dấu thăng mở đầu phần hash của URL, không phải ký hiệu tham số trong path.

Mở trang câu hỏi này →
ATo manage back-end data
BTo provide pre-designed responsive layout components and styles for front-end development
CTo perform server-side scripting
DTo enable database management in web applications
Lời giải
Đáp án đúng: "To provide pre-designed responsive layout components and styles for front-end development". Bootstrap là framework CSS phía front-end: nó cung cấp hệ lưới 12 cột đáp ứng theo cỡ màn hình, bộ định kiểu sẵn cho chữ, nút, biểu mẫu, bảng, cùng các component như thanh điều hướng, modal, carousel, và lớp tiện ích về khoảng cách, màu sắc, giúp dựng giao diện đẹp và chạy tốt trên cả điện thoại lẫn máy tính mà không phải viết nhiều CSS. "To manage back-end data" sai vì Bootstrap chỉ làm việc với giao diện trong trình duyệt, không chạm đến dữ liệu phía máy chủ. "To perform server-side scripting" sai vì kịch bản phía máy chủ được viết bằng ngôn ngữ như Node.js, PHP hay Java, còn Bootstrap gồm CSS và một ít JavaScript chạy phía client. "To enable database management in web applications" sai vì quản trị cơ sở dữ liệu là việc của hệ quản trị cơ sở dữ liệu và tầng back-end.
Mở trang câu hỏi này →
AIt makes the function execute immediately
BIt tells the function to pause until all variables are declared
CIt makes the function return a Promise
DIt prevents any asynchronous code from running
Lời giải
Đáp án đúng: "It makes the function return a Promise". Từ khóa async đánh dấu hàm bất đồng bộ: hàm đó luôn trả về một Promise, giá trị return được bọc thành Promise resolve với giá trị ấy, còn lỗi ném ra thành Promise reject; bên trong hàm được phép dùng await để tạm dừng chính hàm đó cho tới khi một Promise khác hoàn thành, trong khi phần còn lại của chương trình vẫn chạy tiếp. Phương án "It makes the function execute immediately" sai vì async không đổi thời điểm gọi hàm; hàm chỉ chạy khi được gọi, giống hàm thường. Phương án "It tells the function to pause until all variables are declared" là mô tả không có thật; tạm dừng chỉ xảy ra ở từng chỗ await để chờ Promise, không liên quan tới khai báo biến. Phương án "It prevents any asynchronous code from running" ngược hẳn, vì async sinh ra chính là để viết mã bất đồng bộ dễ đọc như mã tuần tự.
Mở trang câu hỏi này →
ARepresentational State Transfer
BRemote Execution and State Transfer
CResourceful Endpoint and Service Tools
DResponsive Event-driven Server Technologies
Lời giải
Đáp án đúng: "Representational State Transfer". REST là viết tắt của Representational State Transfer (chuyển giao trạng thái biểu diễn), phong cách kiến trúc do Roy Fielding mô tả năm 2000: mỗi tài nguyên có một URL, client thao tác bằng các phương thức HTTP như GET, POST, PUT, DELETE và nhận về một biểu diễn của tài nguyên (thường là JSON), mỗi yêu cầu tự mang đủ thông tin (stateless). "Remote Execution and State Transfer" là cụm tự đặt, REST không nói về thực thi từ xa. "Resourceful Endpoint and Service Tools" cũng là cụm tự đặt, ghép các chữ cái cho khớp R-E-S-T nhưng không phải nghĩa thật. "Responsive Event-driven Server Technologies" sai vì REST không gắn với máy chủ hướng sự kiện hay thiết kế responsive.
Mở trang câu hỏi này →
ANetwork errors due to connectivity issues
BSyntax errors in the code
CLogical errors in data fetching
DHardware performance issues affecting data processing
Lời giải
Đáp án đúng gồm ba ý: "Network errors due to connectivity issues", "Syntax errors in the code" và "Logical errors in data fetching". Loader ở đây là đoạn mã tải dữ liệu trước khi hiển thị, như hàm loader của React Router hay logic fetch kèm trạng thái đang tải. Lỗi hay gặp nhất là lỗi mạng: mất kết nối hoặc server không phản hồi khiến fetch bị reject. Kế đến là lỗi cú pháp trong chính hàm loader, như thiếu ngoặc hay sai từ khoá, làm mã không biên dịch hoặc ném lỗi khi chạy. Cuối cùng là lỗi logic khi lấy dữ liệu: gọi sai endpoint, đọc nhầm params, quên trả dữ liệu hay quên kiểm response.ok nên component nhận dữ liệu sai. React Router chuyển các lỗi này tới errorElement, còn tự viết thì bắt bằng try/catch. "Hardware performance issues affecting data processing" không phải lỗi của việc cài đặt loader: hiệu năng phần cứng nằm ngoài mã React, chỉ làm chậm chứ không làm hỏng logic tải dữ liệu.
Mở trang câu hỏi này →
Anull
Bundefined
CAn empty object {}
DAn empty array []
Lời giải
Đáp án đúng: "undefined". useSelector của React Redux gọi hàm selector với toàn bộ state của store và trả về đúng thứ selector trả ra, không tự thay bằng giá trị mặc định nào; nếu selector đọc một thuộc tính không tồn tại, ví dụ state.user.profile khi chưa có profile, JavaScript cho ra undefined nên useSelector cũng trả về undefined. "null" chỉ xuất hiện khi state thật sự lưu giá trị null, React Redux không đổi undefined thành null. "An empty object {}" sai vì useSelector không tạo đối tượng rỗng thay thế; muốn có giá trị dự phòng thì phải tự viết trong selector, chẳng hạn dùng toán tử ?? để thay giá trị thiếu. "An empty array []" cũng chỉ có khi initialState của slice khai báo mảng rỗng, không phải hành vi mặc định khi không tìm thấy giá trị.
Mở trang câu hỏi này →
AA function that triggers actions in response to user interactions
BA component that manages the application's state
CA function that specifies how the application's state changes in response to actions
DA middleware that handles asynchronous operations in Redux
Lời giải
Đáp án đúng: "A function that specifies how the application's state changes in response to actions". Reducer là một hàm thuần nhận hai đối số là state hiện tại và action, rồi trả về state kế tiếp; nó không sửa state cũ, không gọi API hay sinh số ngẫu nhiên, nên với cùng đầu vào luôn ra cùng kết quả, và chỉ reducer mới quyết định state đổi ra sao khi một action được dispatch. "A function that triggers actions in response to user interactions" sai vì việc phát action là của hàm xử lý sự kiện gọi dispatch, kèm action creator tạo đối tượng action; reducer chỉ nhận action, không phát ra. "A component that manages the application's state" sai vì reducer không phải component React và không hiển thị gì; state được giữ trong store. "A middleware that handles asynchronous operations in Redux" sai vì thao tác bất đồng bộ do middleware như redux-thunk hay createAsyncThunk lo, chúng chạy trước khi action tới reducer; reducer phải đồng bộ.
Mở trang câu hỏi này →
36What will the following code output?4 lựa chọncó code
Đề bài
const arr = [1, 2, 3];
const [x, , z] = arr;
console.log(x, z);
A1, 3
B1, undefined
Cundefined, 3
D1, 2
Lời giải
Đáp án đúng: "1, 3". Đây là destructuring assignment (gán phân rã) mảng: các biến bên trái được gán theo vị trí phần tử của arr, và dấu phẩy để trống ở giữa nghĩa là bỏ qua phần tử ở vị trí đó. Lần theo mã: arr là mảng 1, 2, 3; vị trí đầu gán cho x nên x bằng 1, vị trí thứ hai bị bỏ qua nên giá trị 2 không gán cho biến nào, vị trí thứ ba gán cho z nên z bằng 3; console.log(x, z) in ra 1 và 3 (trên console hai giá trị cách nhau bằng dấu cách). "1, undefined" sai vì z không bị thiếu giá trị, mảng có đủ phần tử thứ ba. "undefined, 3" sai vì x nhận phần tử đầu tiên là 1, chỗ bỏ trống nằm sau x chứ không phải trước. "1, 2" sai vì nhầm rằng z nhận phần tử kế tiếp, trong khi dấu phẩy trống đã đẩy z sang vị trí thứ ba.
Mở trang câu hỏi này →
AA component that does not use props.
BA component that does not manage its own state.
CA component that does not render any JSX.
DA component that does not handle events.
Lời giải
Đáp án đúng: "A component that does not manage its own state.". Stateless component (component không trạng thái) là component không giữ state riêng: nó chỉ nhận dữ liệu qua props và trả về giao diện tương ứng, cùng props thì luôn ra cùng kết quả, thường được gọi là presentational component; trước khi có hook, function component mặc định là stateless còn class component mới có this.state. Phương án "A component that does not use props." sai vì component không trạng thái thường dựa hoàn toàn vào props. Phương án "A component that does not render any JSX." sai vì component nào cũng trả về JSX hoặc null để mô tả giao diện, dù có state hay không. Phương án "A component that does not handle events." sai vì component không trạng thái vẫn gắn được sự kiện, ví dụ nhận hàm onClick từ cha qua props rồi gắn vào nút.
Mở trang câu hỏi này →
Aconst [state, dispatch] = useContext(CountContext);
Bconst { state, dispatch } = CountContext;
Cconst { state, dispatch } = useContext(CountContext);
Dconst state = CountContext.state;
Lời giải
Đáp án đúng: "const { state, dispatch } = useContext(CountContext);". Mẫu thường gặp là component cha dùng useReducer rồi truyền một đối tượng gồm state và dispatch vào prop value của CountContext.Provider; component con gọi useContext(CountContext) để nhận chính đối tượng đó và phân rã lấy hai khoá state, dispatch. "const [state, dispatch] = useContext(CountContext);" dùng ngoặc vuông để phân rã mảng, chỉ đúng nếu value là mảng; với value là đối tượng, phân rã mảng sẽ ném lỗi vì đối tượng không lặp được. "const { state, dispatch } = CountContext;" phân rã thẳng đối tượng context do createContext tạo ra; đối tượng này chỉ có Provider và Consumer chứ không chứa state hay dispatch, nên cả hai ra undefined. "const state = CountContext.state;" cũng đọc thuộc tính trên đối tượng context nên ra undefined; giá trị hiện hành chỉ lấy được qua useContext hoặc Consumer.
Mở trang câu hỏi này →
Afunction Greeting({ isAdmin }) { return ( <> <h1>Welcome!</h1> isAdmin && <p>You have administrative privileges.</p> </> ); }
Bfunction Greeting({ isAdmin }) { return ( <> <h1>Welcome!</h1> {isAdmin ? <p>You have administrative privileges.</p>} </> ); }
Cfunction Greeting({ isAdmin }) { return ( <> <h1>Welcome!</h1> {isAdmin && <p>You have administrative privileges.</p>} </> ); }
Dfunction Greeting({ isAdmin }) { return ( <> <h1>Welcome!</h1> {isAdmin ? <p>You have administrative privileges.</p>} </> ); }
Lời giải

Đáp án đúng: "function Greeting({ isAdmin }) {

Lời giải
return ( <> <h1>Welcome!</h1> {
  isAdmin && <p>You have administrative privileges.</p>
}

</> ); }". Trong JSX, cặp ngoặc nhọn mở chế độ biểu thức JavaScript; biểu thức isAdmin && thẻ p trả về thẻ p khi isAdmin là true, còn khi isAdmin là false nó trả về false và React không hiển thị gì, nên lời chào luôn hiện còn dòng thông báo quyền chỉ hiện với quản trị viên. Lưu ý nếu vế trái là số 0 thì React sẽ in ra số 0, nên vế trái nên là boolean. Phương án viết "</h1> isAdmin && <p> " thiếu ngoặc nhọn, nên chữ isAdmin && trở thành văn bản thường hiện thẳng ra màn hình, còn thẻ p luôn được render bất kể isAdmin. Cách viết "{isAdmin ? <p> " xuất hiện ở hai phương án có nội dung giống hệt nhau và đều sai cú pháp: toán tử ba ngôi bắt buộc có nhánh sau dấu hai chấm, thiếu nó trình biên dịch báo lỗi; muốn dùng ba ngôi thì phải thêm nhánh null, còn câu hỏi yêu cầu dùng toán tử &&.

Mở trang câu hỏi này →
AUsing the useState hook.
BUsing the useReducer hook.
CUsing a Provider component.
DUsing the useRef hook.
Lời giải
Đáp án đúng gồm hai ý: "Using the useState hook." và "Using the useReducer hook.". Trong function component, state là dữ liệu React ghi nhớ giữa các lần render và thay đổi nó sẽ khiến component render lại; useState khởi tạo một giá trị kèm hàm đặt giá trị mới, phù hợp state đơn giản, còn useReducer khởi tạo state từ giá trị ban đầu và cập nhật qua hàm reducer nhận state cũ cùng action, phù hợp khi state có nhiều trường hoặc logic chuyển đổi phức tạp. "Using a Provider component." sai vì Provider của Context chỉ truyền một giá trị xuống cây con để tránh truyền props qua nhiều tầng; bản thân giá trị đó vẫn phải được tạo và quản lý bằng useState hoặc useReducer ở đâu đó. "Using the useRef hook." sai vì useRef giữ một giá trị có thể thay đổi qua thuộc tính current nhưng đổi nó không gây render lại, nên dùng để giữ tham chiếu DOM hoặc giá trị phụ chứ không phải để quản lý state hiển thị.
Mở trang câu hỏi này →