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 đề. Trang 3/3 — câu 41–50.

Danh sách câu hỏi

50/50 câuHết danh sách
Aimport React from 'react'; import Button from 'react-bootstrap/Button'; function Demo() { return ( <Button variant="primary"> ); } export default Demo;
Bimport React from 'react'; import Button from 'react-bootstrap/Button'; function Demo() { return ( <button variant="primary"> Primary Button</button> ); } export default Demo;
Cimport React from 'react'; import Button from 'react-bootstrap/Button'; function Demo() { return ( <Button variant="primary">Primary Button</Button> ); } export default Demo;
Dimport React from 'react'; import Button from 'react-bootstrap/Button'; function Demo() { return ( <button variant="primary"/> ); } export default Demo;
Lời giải

Đáp án đúng: "import React from 'react'; import Button from 'react-bootstrap/Button'; function Demo() {

Lời giải
return ( <Button variant="primary">Primary Button</Button> );

} export default Demo;". Component Button phải được import từ react-bootstrap/Button rồi dùng đúng tên viết hoa Button, có thẻ mở và thẻ đóng bao lấy nội dung; khi đó prop variant="primary" được React-Bootstrap đổi thành lớp btn btn-primary và chữ Primary Button hiện trên nút màu xanh. Phương án chứa "<Button variant="primary">);" sai cú pháp JSX: thẻ mở Button không có thẻ đóng mà cũng không tự đóng, nên trình biên dịch báo lỗi ngay. Phương án chứa "

Lời giải
<button variant="primary"> Primary Button</button>

" dùng thẻ button HTML viết thường chứ không phải component đã import, nên variant chỉ là thuộc tính lạ và nút hiện ra không có kiểu Bootstrap. Phương án chứa "<button variant="primary"/> " vừa là thẻ HTML thường vừa tự đóng, không có chữ bên trong, nên chỉ ra một nút trống không kiểu dáng.

Mở trang câu hỏi này →
AFragments allow you to group multiple elements without adding an extra node to the DOM.
BFragments allow you to provide CSS styling to multiple elements.
CFragments allow you to handle state management in React.
DFragments are particularly useful for avoiding unnecessary <div> elements, which can clutter your markup.
Lời giải

Đáp án đúng gồm hai ý: "Fragments allow you to group multiple elements without adding an extra node to the DOM." và "Fragments are particularly useful

Lời giải
for avoiding unnecessary <div> elements, which can clutter your markup.".

Một component chỉ trả về được một phần tử gốc; React.Fragment, hay cú pháp rút gọn <></>, gom nhiều phần tử con thành một nhóm nhưng khi commit vào DOM thì không sinh ra thẻ bao nào, nên tránh được các thẻ div thừa làm rối markup và làm hỏng bố cục flex, grid hay cấu trúc bảng tr, td. Hai ý này là hai mặt của cùng một công dụng. "Fragments allow you to provide CSS styling to multiple elements." sai vì Fragment không tạo nút DOM nên không có chỗ gắn className hay style; Fragment chỉ nhận prop key. "Fragments allow you to handle state management in React." sai vì quản lý state là việc của useState, useReducer hay Context, Fragment không giữ state nào.

Mở trang câu hỏi này →
A.html
B.css
C.js or .jsx
D.php
Lời giải
Đáp án đúng: ".js or .jsx". Component React là một hàm (hoặc lớp) JavaScript trả về JSX, nên tệp chứa nó mang đuôi .js hoặc .jsx; đuôi .jsx báo rõ cho trình soạn thảo và công cụ build như Vite, Babel rằng tệp có cú pháp JSX cần biên dịch, còn dự án TypeScript dùng .ts hoặc .tsx tương ứng. ".html" là tài liệu HTML tĩnh; ứng dụng React thường chỉ có một index.html làm khung với thẻ div gốc để React gắn vào, component không viết ở đó. ".css" là tệp định kiểu, có thể import vào component nhưng không chứa logic của component. ".php" là mã PHP chạy phía máy chủ, không liên quan tới cách viết component React.
Mở trang câu hỏi này →
ATo manage state within a component
BTo respond to a URL based on a set of route handler declarations
CTo handle server-side logic
DTo manage routing in a React application
Lời giải
Đáp án đúng: "To respond to a URL based on a set of route handler declarations". Router (bộ định tuyến) giữ một tập khai báo, mỗi khai báo ghép một mẫu đường dẫn với một bộ xử lý (route handler); khi URL thay đổi, router so URL với các mẫu đó và chọn đúng bộ xử lý để phản hồi, trong React đó là component cần hiển thị, còn ở máy chủ đó là hàm trả về response. "To manage state within a component" sai vì việc giữ dữ liệu riêng trong component là của useState hay useReducer, không phải của router. "To handle server-side logic" sai vì logic phía máy chủ như truy vấn cơ sở dữ liệu thuộc về backend; router chỉ quyết định URL nào đi tới đâu. "To manage routing in a React application" không phải đáp án vì nó chỉ lặp lại chữ routing mà không nói router làm gì, lại bó hẹp vào ứng dụng React trong khi câu hỏi nói về ứng dụng web nói chung; cách diễn đạt có giá trị giải thích là phản hồi URL dựa trên các khai báo tuyến.
Mở trang câu hỏi này →
Aconst handleClick = () => { dispatch({ type: 'BUTTON_CLICKED' }); }; <button onClick={handleClick}>Click me</button>;
Bconst handleClick = () => { dispatch({ type: 'BUTTON_CLICKED' }); }; <button onClick={() => handleClick()}>Click me</button>;
Cconst handleClick = () => { dispatch({ type: 'BUTTON_CLICKED' }); }; <button onClick={handleClick()}>Click me</button>;
Dconst handleClick = () => { dispatch({ action: 'BUTTON_CLICKED' }); }; <button onClick={handleClick}>Click me</button>;
Lời giải

Đáp án đúng: "const handleClick = () => { dispatch({ type: 'BUTTON_CLICKED' }); };

Lời giải
<button onClick={
  handleClick
}
>Click me</button>

;". Trong Redux, action là một object thuần bắt buộc có thuộc tính type, và ta gửi nó tới store bằng dispatch; để làm việc đó khi bấm nút, ta định nghĩa hàm handleClick gọi dispatch rồi truyền chính tham chiếu hàm đó cho onClick, để React chỉ gọi nó khi sự kiện click xảy ra. Cách viết onClick={() => handleClick()} cũng chạy được, nhưng chỉ bọc thêm một hàm mũi tên thừa, tạo hàm mới ở mỗi lần render mà không đem lại gì khi không cần truyền tham số, nên không phải cách trực tiếp mà câu hỏi muốn. Cách viết onClick={handleClick()} sai vì dấu ngoặc khiến hàm bị gọi ngay trong lúc render: dispatch chạy mỗi lần render, store đổi, component render lại và dễ thành vòng lặp, còn onClick nhận giá trị trả về undefined nên bấm nút không làm gì. Cách viết dispatch({ action: 'BUTTON_CLICKED' }) sai vì object thiếu thuộc tính type, Redux sẽ báo lỗi action có type undefined và reducer không nhận ra được action này.

Mở trang câu hỏi này →
AuseState
BuseEffect
CuseDispatch
DuseContext
Lời giải
Đáp án đúng: "useDispatch". Trong React Redux, useSelector chỉ đọc một phần state từ store và đăng ký để component render lại khi phần đó đổi; muốn thay đổi state thì phải gửi action tới store, và hook useDispatch trả về hàm dispatch của store để làm việc đó, ví dụ dispatch(increment()), sau đó reducer tính ra state mới. Vì vậy hai hook này hay đi thành cặp: một đọc, một ghi. Phương án "useState" quản lý state cục bộ của riêng component, không đụng tới store Redux. Phương án "useEffect" chạy tác vụ phụ sau render; có thể gọi dispatch bên trong nó nhưng bản thân nó không phải công cụ sửa state Redux. Phương án "useContext" đọc giá trị từ React Context; React Redux có dùng context bên dưới để truyền store, nhưng gọi useContext không cho ta cách gửi action.
Mở trang câu hỏi này →
Aconst theme = useContext(ThemeContext);
Bconst { theme } = useContext(ThemeContext);
Cconst { theme } = useContext(ThemeContext.Provider);
Dconst theme = useContext(ThemeContext.Provider);
Lời giải
Đáp án đúng: "const theme = useContext(ThemeContext);". useContext nhận chính đối tượng context được tạo bằng createContext và trả về giá trị mà Provider gần nhất phía trên cây truyền xuống qua prop value; khi Provider truyền thẳng giá trị chủ đề (chuỗi 'dark' hoặc một đối tượng màu) thì gán kết quả cho biến theme như trên là đúng. "const { theme } = useContext(ThemeContext);" chỉ đúng khi value là một đối tượng có khoá theme bên trong; câu hỏi cần lấy chính giá trị chủ đề dùng chung nên phân rã là thêm một giả định không có. "const { theme } = useContext(ThemeContext.Provider);" sai kép: vừa phân rã thêm khoá theme vừa truyền component Provider thay cho đối tượng context. "const theme = useContext(ThemeContext.Provider);" cũng truyền ThemeContext.Provider vào useContext; React yêu cầu đối số là chính ThemeContext, cách gọi với Provider không được hỗ trợ và React đưa ra cảnh báo.
Mở trang câu hỏi này →
A401 the request is missing valid authentication credentials, while 403 the server refuses to authorize.
B401 the server encountered an internal error, while 403 means the requested resource was not found.
C401 the request was successful, while 403 means the request was not modified.
D401 and 403 are interchangeable and have the same meaning.
Lời giải
Đáp án đúng: "401 the request is missing valid authentication credentials, while 403 the server refuses to authorize.". Mã 401 Unauthorized nghĩa là yêu cầu chưa được xác thực (authentication): thiếu hoặc sai thông tin đăng nhập, chẳng hạn token hết hạn, nên client cần đăng nhập rồi gửi lại. Mã 403 Forbidden nghĩa là server đã biết người gửi là ai nhưng từ chối cấp quyền (authorization) truy cập tài nguyên, gửi lại với cùng danh tính cũng vô ích. Trong ứng dụng React, 401 thường dẫn về trang đăng nhập, còn 403 hiện thông báo không đủ quyền. "401 the server encountered an internal error, while 403 means the requested resource was not found." nhầm với 500 Internal Server Error và 404 Not Found. "401 the request was successful, while 403 means the request was not modified." nhầm với 200 OK và 304 Not Modified. "401 and 403 are interchangeable and have the same meaning." sai vì hai mã tách bạch việc chưa xác thực với việc không có quyền.
Mở trang câu hỏi này →
AManaging authentication and user sessions
BStyling and layout of React components
CHandling form validation and input tracking
DImplementing server-side rendering in React
Lời giải
Đáp án đúng: "Managing authentication and user sessions". Redux là kho state toàn cục (global store) dùng chung cho cả cây component; thông tin đăng nhập như người dùng hiện tại, token, quyền là loại dữ liệu nhiều màn hình cùng cần đọc (thanh điều hướng, route bảo vệ, trang hồ sơ) và chỉ thay đổi qua các action rõ ràng như login, logout, nên đây là trường hợp dùng Redux điển hình. "Styling and layout of React components" thuộc về CSS, Bootstrap hay styled-components, Redux không lo phần giao diện. "Handling form validation and input tracking" thường nằm trong state cục bộ của form bằng useState hoặc thư viện như React Hook Form, Formik; đưa từng ký tự gõ vào store toàn cục là thừa. "Implementing server-side rendering in React" là việc của framework như Next.js hoặc hàm renderToString của react-dom/server; Redux có thể chạy cùng SSR nhưng không phải công cụ thực hiện SSR.
Mở trang câu hỏi này →
Aconst value = useSelector((store) => store.value);
Bconst value = useSelector((state) => state.value);
Cconst value = useSelector((context) => context.value);
Dconst value = useSelector((redux) => redux.value);
Lời giải
Đáp án đúng: "const value = useSelector((state) => state.value);". useSelector nhận một hàm selector (hàm chọn), React-Redux gọi hàm này với đối số là toàn bộ state gốc của store, giá trị trả về chính là dữ liệu component nhận được, và component sẽ render lại khi giá trị này đổi; tài liệu Redux luôn đặt tên tham số là state vì nó đúng là state. Về mặt JavaScript, tên tham số chỉ là tên, nên các dạng dưới đây vẫn chạy, nhưng chúng gọi sai bản chất của đối số. "const value = useSelector((store) => store.value);" gây hiểu nhầm vì store là đối tượng có getState và dispatch, còn thứ selector nhận là state lấy ra từ store. "const value = useSelector((context) => context.value);" lẫn với React Context, một cơ chế khác hẳn được đọc bằng useContext. "const value = useSelector((redux) => redux.value);" không nói đối số là gì, chẳng có khái niệm redux nào được truyền vào; cách viết đúng chuẩn là đặt tên state.
Mở trang câu hỏi này →