Tất cả câu hỏi

Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.

4.480/20.347 câuCòn 15.867
AsetState
BgetState
CupdateState
DmodifyState
Lời giải
Đáp án đúng: "setState". Trong class component, state được cập nhật bằng this.setState: phương thức này gộp đối tượng mới vào state hiện tại rồi lên lịch render lại component; với function component, useState trả về cặp state và hàm cập nhật như setCount, đóng vai trò tương tự, và quy ước đặt tên setX cũng bắt nguồn từ setState. "getState" là phương thức đọc state của Redux store (store.getState()), chỉ đọc chứ không cập nhật state của component. "updateState" không phải API có sẵn của React, chỉ là một tên tự đặt. "modifyState" cũng không tồn tại trong React; sửa thẳng this.state hay biến state mà không qua setState thì React không biết để render lại giao diện.
Mở trang câu hỏi này →
AWhen components require simple, independent state values.
BWhen performing initialization and cleanup actions
CWhen there is complex state logic, several sub-values, or when the upcoming state depends on the previous state
DWhen sharing data across a component hierarchy without prop
Lời giải
Đáp án đúng: "When there is complex state logic, several sub-values, or when the upcoming state depends on the previous state". useReducer gom mọi cách thay đổi state vào một hàm reducer nhận state cùng action và trả về state mới; component chỉ dispatch action mô tả chuyện gì đã xảy ra. Cách này hợp khi state là object có nhiều giá trị con liên quan nhau, khi có nhiều kiểu cập nhật, hoặc khi state kế tiếp tính từ state trước, vì logic nằm tập trung, dễ kiểm thử và tránh các lời gọi set rời rạc làm state mâu thuẫn. "When components require simple, independent state values." là đúng trường hợp nên dùng useState, gọn hơn cho một con số hay một cờ boolean. "When performing initialization and cleanup actions" là việc của useEffect với hàm cleanup trả về. "When sharing data across a component hierarchy without prop" là việc của Context với createContext và useContext, tránh truyền prop qua nhiều tầng.
Mở trang câu hỏi này →
AProps are mutable, while state is immutable.
BState is used for passing data between components, while props are used to manage component behavior.
CProps do not change after the initial render, while state can change over time.
DState is used for rendering UI, while props are used for functionality.
Lời giải
Đáp án đúng: "Props do not change after the initial render, while state can change over time.". Props là dữ liệu component cha truyền xuống, component con chỉ đọc chứ không tự sửa; state là dữ liệu nội bộ do chính component quản lý và thay đổi qua setState hoặc hàm set của useState, mỗi lần đổi thì component render lại. Props vẫn có thể nhận giá trị mới khi cha render lại, nhưng đối với component con chúng là bất biến (read-only), nên phát biểu này nắm đúng ý chính của sự khác biệt. "Props are mutable, while state is immutable." đảo ngược: props mới là chỉ đọc, còn state được cập nhật. "State is used for passing data between components, while props are used to manage component behavior." cũng đảo vai, vì truyền dữ liệu giữa các component là việc của props. "State is used for rendering UI, while props are used for functionality." sai vì cả props lẫn state đều được dùng để render giao diện; khác biệt nằm ở ai sở hữu dữ liệu và ai được thay đổi nó.
Mở trang câu hỏi này →
AState
BProps
CContext
DRef
Lời giải
Đáp án đúng: "Props". Props (thuộc tính) là cơ chế truyền dữ liệu một chiều từ cha xuống con: component cha viết giá trị như thuộc tính trên thẻ của con, component con nhận chúng qua tham số props và chỉ được đọc, không được sửa. Khi cha render lại với giá trị mới, con nhận props mới và render theo. Phương án "State" là dữ liệu riêng do chính component quản lý và thay đổi bằng hàm setter; state của cha thường được đưa xuống con nhưng phải đi qua props. Phương án "Context" cũng đưa dữ liệu xuống cây, nhưng dùng khi dữ liệu cần tới nhiều tầng sâu để khỏi truyền props qua từng cấp, không phải khái niệm cơ bản cho quan hệ cha con trực tiếp mà câu hỏi nhắm tới. Phương án "Ref" dùng giữ một giá trị không gây render lại hoặc trỏ tới phần tử DOM, không phải kênh truyền dữ liệu từ cha xuống con.
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 →
AInitial, Running, Completed
BStarting, Paused, Finished
CPending, Fulfilled, Rejected
DWaiting, Processing, Error Answer
Lời giải
Đáp án đúng: "Pending, Fulfilled, Rejected". Một Promise trong JavaScript luôn ở một trong ba trạng thái: pending (đang chờ) khi vừa được tạo và thao tác bất đồng bộ chưa xong; fulfilled (đã hoàn thành) khi resolve được gọi với một giá trị, lúc đó các hàm trong then chạy; rejected (bị từ chối) khi reject được gọi hoặc có lỗi, lúc đó catch chạy. Khi đã chuyển sang fulfilled hoặc rejected thì Promise được coi là settled (đã ngã ngũ) và không bao giờ đổi trạng thái nữa. "Initial, Running, Completed" sai vì đây là tên gọi tự đặt, không phải thuật ngữ của Promise, và nó không phân biệt được thành công với thất bại. "Starting, Paused, Finished" sai vì Promise không có trạng thái tạm dừng, nó cũng không tách kết quả thành công và lỗi. "Waiting, Processing, Error Answer" sai vì chuẩn không có các tên này, và thiếu hẳn trạng thái thành công.
Mở trang câu hỏi này →
AIt allows direct modification of the DOM
BIt makes synchronous code asynchronous.
CIt helps solve the "callback hell" problem by allowing chains of asynchronous operations.
DIt ensures data is always instantaneously available.
Lời giải
Đáp án đúng: "It helps solve the "callback hell" problem by allowing chains of asynchronous operations.". Promise là đối tượng đại diện cho kết quả tương lai của một thao tác bất đồng bộ, ở một trong ba trạng thái pending, fulfilled, rejected; mỗi lần gọi then trả về một Promise mới nên các bước có thể nối thành chuỗi phẳng và gom lỗi về một catch, thay vì lồng callback trong callback thành hình kim tự tháp khó đọc (callback hell). "It allows direct modification of the DOM" sai vì sửa DOM là việc của DOM API hoặc React, Promise chỉ quản lý luồng bất đồng bộ. "It makes synchronous code asynchronous." sai vì bọc mã đồng bộ trong Promise không làm nó chạy song song; hàm executor vẫn chạy đồng bộ ngay lập tức, chỉ các callback của then được hoãn lại. "It ensures data is always instantaneously available." sai vì Promise sinh ra chính là để xử lý dữ liệu CHƯA có ngay, kết quả đến sau và có thể thất bại.
Mở trang câu hỏi này →
Afetch(url).then((response)=>{ return response.json();} ).catch(error => console.log(error))
Bfetch(url).then(response => response.catch(error => console.log(error)))
Cfetch(url).catch(error => {{ console.log(error) }})
Dfetch(url).then(response => { throw new Error() }).catch(error => console.log(error))
Lời giải

Đáp án đúng: "fetch(url).then((response)=>{ return response.json(); } ).catch(error => console.log(error))". fetch trả về một Promise; then nhận response và trả về response.json(), cũng là một Promise, còn catch đặt ở cuối chuỗi bắt mọi lỗi ném ra ở bất kỳ bước nào trước nó, như lỗi mạng làm fetch bị reject hay lỗi phân tích JSON, rồi ghi ra console. Cần nhớ fetch không reject khi server trả 404 hay 500; muốn coi đó là lỗi thì kiểm response.ok rồi tự ném lỗi trong then. Cách viết "then(response => response.catch(" sai vì response là đối tượng Response chứ không phải Promise, không có phương thức catch, gọi vào sẽ gây TypeError. "fetch(url).catch(error => {{

Lời giải
console.log(error)
}
}
)"

bắt được lỗi mạng nhưng không bao giờ đọc dữ liệu trả về; cặp ngoặc nhọn lồng nhau chỉ là một khối lệnh thừa. Cách viết "then(response => { throw

Lời giải
new Error()
}
)"

luôn ném lỗi kể cả khi yêu cầu thành công, nên catch chỉ ghi ra một lỗi rỗng thay vì xử lý dữ liệu.

Mở trang câu hỏi này →
A<Suspense loader={<div>Loading...</div>}> <LazyComponent /> </Suspense>
B<Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </Suspense>
C<Await fallback={<div>Loading...</div>}> <LazyComponent /> </Await>
D<Loading fallback={<div>Loading...</div>}> <LazyComponent /> </Loading>
Lời giải

Đáp án đúng: "<Suspense fallback={ <div>Loading...</div> }> <LazyComponent /> </Suspense>". Component nạp lười bằng React.lazy phải nằm trong ranh giới Suspense; trong lúc tệp mã của nó còn đang tải, React hiển thị thứ được truyền qua prop fallback (ở đây là khối chữ Loading...), tải xong thì thay bằng LazyComponent. Phương án chứa "<Suspense loader=" sai vì Suspense không có prop loader, React bỏ qua nó, nên trong lúc chờ không có giao diện chờ nào được chỉ định. Phương án chứa "<Await fallback=" nhầm sang component Await của React Router, dùng để chờ một promise trả về từ loader; nó không bọc component lazy và cũng không nhận prop fallback. Phương án chứa "<Loading fallback=" dùng một component không có sẵn trong React; dù tự định nghĩa component Loading, nó cũng không bắt được trạng thái tạm treo khi tải mã như Suspense.

Mở trang câu hỏi này →
4470What is Redux Thunk used for?4 lựa chọn
ATo manage asynchronous actions in Redux.
BTo log every action dispatched to the Redux store.
CTo split reducers into simpler functions.
DTo handle side effects in React components.
Lời giải
Đáp án đúng: "To manage asynchronous actions in Redux.". Redux thuần chỉ cho dispatch đối tượng action và reducer phải là hàm thuần đồng bộ, nên không có chỗ đặt lời gọi API; Redux Thunk là middleware cho phép dispatch một hàm (thunk) thay cho đối tượng, hàm này nhận dispatch và getState, có thể chờ fetch xong rồi mới dispatch action thành công hoặc thất bại. Redux Toolkit cài sẵn thunk và cung cấp createAsyncThunk dựa trên chính cơ chế này. Phương án "To log every action dispatched to the Redux store." là việc của middleware ghi log như redux-logger. Phương án "To split reducers into simpler functions." là việc của combineReducers hoặc chia slice. Phương án "To handle side effects in React components." nói về phía component, nơi tác vụ phụ được xử lý bằng useEffect; thunk xử lý logic bất đồng bộ ở tầng Redux chứ không nằm trong component.
Mở trang câu hỏi này →
A<ErrorBoundary>
B<Suspense>
C<LoadingComponent>
D<Provider>
Lời giải

Đáp án đúng: "<Suspense> ". React.lazy cho phép tải một component theo kiểu động, tách nó thành một chunk riêng chỉ được tải khi cần; trong lúc chunk đang tải, component lazy tạm "treo" (suspend), và component Suspense bao ngoài sẽ hiển thị giao diện thay thế đặt trong thuộc tính fallback, chẳng hạn chữ đang tải hoặc vòng quay, cho tới khi mã tải xong. "<ErrorBoundary> " sai vì error boundary là component tự viết để bắt lỗi khi render, kể cả khi tải chunk thất bại; nó thường được dùng kèm nhưng xử lý trạng thái lỗi chứ không phải trạng thái đang tải. "<LoadingComponent> " sai vì React không có component dựng sẵn nào tên như vậy; đó chỉ là tên một component tự đặt mà ta có thể truyền vào fallback. "<Provider> " sai vì Provider của Context hay của react-redux dùng để cung cấp dữ liệu dùng chung cho cây component, không liên quan đến việc tải mã.

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 →
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 →
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 →
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 →
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 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 →
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 →
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 →
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 →