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 đề.
Danh sách câu hỏi
<label for="exampleFormControlInput1" class="form-label">Email address</label>)
Đáp án đúng: "To save memory resources by reusing synthetic event wrappers, thereby avoiding performance issues related to garbage collection.". React bọc sự kiện gốc của trình duyệt trong SyntheticEvent (sự kiện tổng hợp); ở React 16 trở về trước, các đối tượng này được gom vào một pool (bể dùng lại): sau khi hàm xử lý chạy xong, React xoá trắng thuộc tính rồi tái sử dụng đối tượng cho sự kiện sau, đỡ phải tạo đối tượng mới liên tục và giảm áp lực cho bộ thu gom rác. Hệ quả là không đọc được event sau await hay setTimeout nếu không gọi event.persist(); từ React 17 cơ chế này đã bị bỏ vì trình duyệt hiện đại không còn được lợi đáng kể. "To make event handlers asynchronous" sai vì pooling không đổi cách gọi hàm xử lý, chúng vẫn chạy đồng bộ. "To allow events to be shared across multiple components simultaneously" sai vì một đối tượng chỉ được dùng lại tuần tự sau khi sự kiện trước xong, không dùng chung cùng lúc. "To automatically prevent default browser actions for events." sai vì muốn chặn hành vi mặc định vẫn phải tự gọi event.preventDefault().
snake_casePascalCasecamelCaseUPPER_CASEconst items = ["Apple", "Banana", "Cherry", "Avocado"];
return (
<ul>
{
items.filter(item => item.length > 5).map(item => <li>{item}</li>)
}
</ul>
);const items = ["Apple", "Banana", "Cherry", "Avocado"];
return (
<ul>
{
items.filter(item => item.length > 5)
.map(item => <li key={item}>{item.toUpperCase()}</li>)
}
</ul>
);const items = ["Apple", "Banana", "Cherry", "Avocado"];
return (
<ul>
{
items.map(item => <li key={item}>{item}</li>).filter(item => item.length > 5)
}
</ul>
);const items = ["Apple", "Banana", "Cherry", "Avocado"];
return (
<ul>
{
items.map(item => item.toUpperCase()).filter(item => item.length > 5)
}
</ul>
);Đáp án đúng: "const items = ["Apple", "Banana", "Cherry", "Avocado"];
return ( <ul> {
items.filter(item => item.length > 5) .map(item => <li key={
item
}
>{
item.toUpperCase()
}
</li>)
}</ul> );". Lần theo mã: filter giữ phần tử có length lớn hơn 5 nên Apple (đúng 5 ký tự) bị loại, còn Banana, Cherry, Avocado; sau đó map biến mỗi chuỗi thành một thẻ li có key là chính chuỗi đó và nội dung là item.toUpperCase(), nên danh sách hiện BANANA, CHERRY, AVOCADO. Lọc trước rồi biến đổi sau là đúng vì điều kiện lọc dựa trên chuỗi gốc. Phương án chứa ".map(item =>
<li>{
item
}
</li>)" lọc đúng nhưng không gọi toUpperCase nên chữ giữ nguyên, lại thiếu key nên React cảnh báo. Phương án chứa "</li>).filter(item => item.length > 5)" map trước tạo ra phần tử React rồi mới lọc; phần tử React không có length nên điều kiện luôn sai và danh sách rỗng. Phương án chứa "items.map(item => item.toUpperCase()).filter" lọc ra đúng ba chuỗi viết hoa nhưng không bọc trong thẻ li, nên chúng hiện dính liền thành một dòng chữ chứ không thành các mục danh sách.
Đáp án đúng: "git branch branch-name; git checkout branch-name". Lệnh git branch kèm tên tạo một nhánh mới trỏ vào commit hiện tại nhưng vẫn đứng ở nhánh cũ; git checkout kèm tên chuyển HEAD và thư mục làm việc sang nhánh vừa tạo. Hai bước này còn gộp được thành git checkout -b kèm tên nhánh, hoặc git switch -c ở các bản Git mới. "git new branch-name; git change branch-name" sai vì Git không có lệnh
new hay change. "git make branch-name; git switch branch-name"có nửa sau hợp lệ vì git switch dùng để chuyển nhánh, nhưng git make không phải lệnh Git nên nhánh không được tạo và lệnh chuyển cũng thất bại. "git create branch-name; git select branch-nam" sai vì create và select đều không phải lệnh của Git.
useStateuseEffectuseFetchuseRefimport React, { lazy, Suspense } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function App() { return ( <Suspense fallback={<div>Loading...</div>}> <MyComponent /> </Suspense> ); }
export default App;import React, { Suspense } from 'react';
const MyComponent = import('./MyComponent');
function App() { return ( <Suspense fallback={<div>Loading...</div>}> <MyComponent /> </Suspense> ); }
export default App;import React, { lazy } from 'react';
const MyComponent = lazy('./MyComponent');
function App() { return ( <div fallback={<div>Loading...</div>}> <MyComponent /> </div> ); }
export default App;import React from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() { return ( <React.Suspense> <MyComponent /> </React.Suspense> ); }
export default App;Đáp án đúng: "import React, { lazy, Suspense } from 'react'; const MyComponent = lazy(() => import('./MyComponent')); function App() {
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 "
<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.
Đáp án đúng gồm hai ý: "<Card.Title>Card Title</Card.Title> " và "<Card.Text>Some quick example text to build on the card title and make up the bulk of the card's content.</Card.Text>". React-Bootstrap gắn các phần của thẻ vào component Card dưới dạng thuộc tính con, viết có dấu chấm: Card.Body là vùng nội dung, bên trong đặt Card.Title cho tiêu đề và Card.Text cho đoạn chữ, ngoài ra có Card.Img, Card.Header, Card.Footer. "
<CardImage variant="top" src="holder.js/100px180" />" sai vì component ảnh của thẻ tên là Card.Img, không có CardImage, và dù viết đúng thì nó hiển thị ảnh chứ không phải tiêu đề hay chữ. "<CardHeader>Card Title</CardHeader> " sai vì component đúng tên là Card.Header, và nó tạo dải đầu thẻ tách khỏi phần thân, khác với tiêu đề Card.Title nằm trong Card.Body như câu hỏi cần.