Danh sách câu hỏi của đề

Câu hỏi: MMA301 Phát triển ứng dụng di động đa nền tảng – Bộ ôn tập thi lại số 1

49 câu trắc nghiệm kèm lời giải của môn Multiplatform Mobile App Development - Phát triển ứng dụng di động đa nền tảng, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/49 câuCòn 29
AonClick
BonPress
ConButtonPress
DonClicked
Lời giải
Đáp án đúng: "onPress". Button của React Native nhận prop onPress, là hàm callback được gọi khi người dùng chạm rồi nhả nút; cùng với title, đây là prop bắt buộc của Button, ví dụ onPress={() => setCount(count + 1)}. "onClick" là tên sự kiện của DOM và React trên web, React Native không dùng tên này cho thành phần cảm ứng nên truyền vào sẽ không có tác dụng. "onButtonPress" không phải prop nào của Button, chỉ là tên đặt tưởng tượng. "onClicked" cũng không tồn tại trong API, Button sẽ bỏ qua nó. Ngoài onPress, các thành phần chạm như Pressable còn có onPressIn, onPressOut và onLongPress cho những giai đoạn khác của thao tác chạm.
Mở trang câu hỏi này →
ArenderItem
Bdata
CkeyExtractor
DListHeaderComponent
Lời giải
Đáp án đúng: "keyExtractor". FlatList dùng key của từng phần tử để React đối chiếu danh sách cũ với mới, biết phần tử nào thêm, xoá hay đổi chỗ, nhờ đó chỉ vẽ lại phần cần thiết và giữ state ô đúng chỗ khi cuộn ảo hoá (virtualization, chỉ dựng các ô gần vùng nhìn thấy). keyExtractor là hàm nhận item và index, trả về chuỗi duy nhất; nếu không có, FlatList thử item.key rồi mới rơi về index. "renderItem" sai vì đây là hàm vẽ giao diện cho từng phần tử, nó không định danh phần tử. "data" sai vì đây là mảng dữ liệu nguồn, bản thân nó không cung cấp key. "ListHeaderComponent" sai vì đây là component hiển thị ở đầu danh sách, không liên quan tới định danh phần tử. Chữ "required" ở đây hiểu là prop chịu trách nhiệm định danh, dù FlatList vẫn chạy khi bỏ trống nhờ giá trị mặc định.
Mở trang câu hỏi này →
AArray
BJSON string
CObject literal
DNumber
Lời giải
Đáp án đúng: "JSON string". AsyncStorage là kho lưu khoá–giá trị bất đồng bộ chỉ chứa chuỗi, nên đối tượng phải được chuyển bằng JSON.stringify trước khi gọi setItem và đọc lại bằng JSON.parse sau khi gọi getItem. "Array" không lưu trực tiếp được; mảng cũng phải stringify thành chuỗi JSON rồi mới lưu. "Object literal" chính là thứ ta muốn lưu, nhưng truyền thẳng vào setItem sẽ không giữ được cấu trúc vì giá trị không phải chuỗi. "Number" cũng không phải kiểu được chấp nhận; số phải đổi sang chuỗi bằng String hoặc JSON.stringify rồi parse lại khi đọc ra.
Mở trang câu hỏi này →
Aconst Button = styled.TouchableOpacity` background-color: ${props => props.primary ? 'blue' : 'red'};
Bconst Button = styled.TouchableOpacity` background-color: props.primary ? 'blue' : 'red';
C<Button style={{ backgroundColor: primary ? 'blue' : 'red' }} />
D<Button primaryColor />
Lời giải

Đáp án đúng: "const Button = styled.TouchableOpacity` background-color: ${props => props.primary ? 'blue' : 'red'};". Trong styled-components, template literal có thể chứa nội suy (interpolation) đặt trong cặp dấu đô la và ngoặc nhọn; nếu thứ được nội suy là một hàm thì thư viện gọi hàm đó với props hiện tại mỗi lần render, nên props.primary bằng true cho 'blue', bằng false cho 'red', và giá trị được chèn vào thuộc tính background-color. "const Button = styled.TouchableOpacity` background-color: props.primary ? 'blue' : 'red';" sai vì biểu thức nằm trần trong chuỗi CSS, không được bọc nội suy, nên JavaScript không đánh giá nó và CSS nhận về một giá trị vô nghĩa. "

Lời giải
<Button style={
  {
    backgroundColor: primary ? 'blue' : 'red'
  }
}
/>

" là inline style thông thường chứ không phải cú pháp styled-components, và biến primary ở đó cũng không lấy từ props. "<Button primaryColor /> " chỉ truyền một prop boolean tên primaryColor, không định nghĩa màu nào cho nút.

Mở trang câu hỏi này →
ATo access native platform APIs not available in JavaScript
BTo write CSS styles
CTo manage text alignment
DTo handle basic UI components
Lời giải
Đáp án đúng: "To access native platform APIs not available in JavaScript". Native Module là lớp viết bằng mã gốc (Java/Kotlin cho Android, Objective-C/Swift cho iOS) được đăng ký để JavaScript gọi được, nhằm dùng những API của hệ điều hành mà JavaScript không chạm tới trực tiếp như cảm biến vân tay, Bluetooth, SDK gốc của bên thứ ba, hoặc để chạy tác vụ nặng cần hiệu năng cao. "To write CSS styles" sai vì style được viết bằng StyleSheet ngay trong JavaScript. "To manage text alignment" chỉ cần thuộc tính textAlign của style. "To handle basic UI components" sai vì các thành phần cơ bản như View, Text, Image đã có sẵn trong lõi React Native, không cần tự viết module.
Mở trang câu hỏi này →
AApp.js
Bpackage.json
Cbabel.config.js
Dnode_modules
Lời giải
Đáp án đúng: "App.js". Trong dự án tạo bằng React Native CLI hoặc Expo, App.js (hoặc App.tsx) chứa component gốc của ứng dụng; index.js gọi AppRegistry.registerComponent để đăng ký component này, và từ đó toàn bộ cây màn hình, điều hướng, state được dựng lên. "package.json" sai vì tệp này khai báo tên dự án, các script và danh sách phụ thuộc cho npm, không chứa logic ứng dụng. "babel.config.js" sai vì đây là cấu hình Babel để biên dịch JSX và cú pháp JavaScript mới, chỉ ảnh hưởng quá trình build. "node_modules" sai vì đây là thư mục chứa mã của các thư viện đã cài, không phải mã của ứng dụng và không nên sửa tay.
Mở trang câu hỏi này →
7What is the purpose of the <TouchableHighlight> component in React Native?4 lựa chọnDễ100% trả lời đúng
ATo render text
BTo handle touch interactions with visual feedback
CTo display images
DTo create lists
Lời giải
Đáp án đúng: "To handle touch interactions with visual feedback". TouchableHighlight bọc một phần tử con và phản hồi chạm: khi nhấn, nó hiện màu underlayColor phía sau và làm mờ phần tử con, rồi gọi onPress khi nhả tay, nhờ đó người dùng thấy rõ thao tác đã được nhận. "To render text" là việc của component Text; TouchableHighlight không tự hiển thị chữ. "To display images" là việc của Image hoặc ImageBackground. "To create lists" là việc của FlatList, SectionList hoặc ScrollView; TouchableHighlight chỉ có thể nằm trong từng dòng của danh sách để dòng đó bấm được.
Mở trang câu hỏi này →
AKeeping styles inline within components
BUsing a centralized styles file
CCreating separate style modules for different components
DUsing CSS-in-JS libraries
Lời giải
Đáp án đúng: "Creating separate style modules for different components". Với dự án lớn, cách dễ mở rộng và bảo trì là để mỗi component hoặc mỗi màn hình có module style riêng, thường là tệp styles.js tạo bằng StyleSheet.create đặt cạnh component; sửa một component không ảnh hưởng chỗ khác, còn giá trị dùng chung như màu, cỡ chữ, khoảng cách được gom vào tệp theme để import. "Keeping styles inline within components" làm style lặp lại, tạo đối tượng mới mỗi lần render và khó tái sử dụng. "Using a centralized styles file" ổn với dự án nhỏ, nhưng khi ứng dụng lớn lên tệp sẽ phình to, khó tìm và dễ xung đột khi nhiều người cùng sửa. "Using CSS-in-JS libraries" như styled-components là lựa chọn hợp lệ, nhưng chỉ là công cụ viết style; bản thân nó không bảo đảm style được tổ chức theo module, lại thêm một phụ thuộc bên ngoài.
Mở trang câu hỏi này →
9Which component is a wrapper for making views respond properly to touches in Android?4 lựa chọnTrung bình67% trả lời đúng
ATouchableNative
BTouchableNativeFeedback
CTouchableView
DDataPicker
Lời giải
Đáp án đúng: "TouchableNativeFeedback". TouchableNativeFeedback là wrapper (lớp bọc) chỉ dành cho Android, giúp một view phản hồi chạm đúng kiểu gốc của nền tảng, tức hiệu ứng gợn sóng ripple của Material Design, chỉnh qua prop background như TouchableNativeFeedback.Ripple. "TouchableNative" không phải component có thật, chỉ là tên rút gọn gây nhầm. "TouchableView" cũng không tồn tại trong React Native; các biến thể có thật là TouchableOpacity, TouchableHighlight, TouchableWithoutFeedback và Pressable. "DataPicker" không liên quan đến chạm, gần giống tên bộ chọn ngày DatePicker vốn để chọn ngày giờ. Hiện nay Pressable với android_ripple là lựa chọn được khuyến nghị cho cùng hiệu ứng.
Mở trang câu hỏi này →
Aconst MyComponent = () => <View><Text>Hello</Text></View>;
Bclass MyComponent extends React.Component { render() { return <Text>Hello</Text>; } }
Cconst MyComponent = () => { return <Text>Hello</Text>; };
Dfunction MyComponent() { return <View>Hello</View>; }
Lời giải

Đáp án đúng: "const MyComponent = () => <View><Text>Hello</Text></View>;". Function Component là hàm JavaScript trả về JSX; arrow function viết gọn có thể trả JSX trực tiếp mà không cần return. Trong React Native, chuỗi chữ phải nằm trong Text, còn View làm khung bố cục bọc ngoài, nên mẫu này vừa đúng cú pháp vừa có đủ View và Text như yêu cầu. "

Lời giải
class MyComponent extends React.Component {
  render() {
    return <Text>Hello</Text>;
  }
}

" sai vì đây là Class Component chứ không phải Function Component, lại chỉ có Text mà không có View. "const MyComponent = () => { return <Text>Hello</Text>; };" là Function Component hợp lệ nhưng chỉ trả về Text, thiếu View nên không đạt yêu cầu bố cục có cả hai. "function MyComponent() { return <View>Hello</View>; }" sai vì đặt chuỗi Hello trực tiếp trong View; React Native báo lỗi "Text strings must be rendered within a <Text> component".

Mở trang câu hỏi này →
ADrawerLayoutAndroid
BTouchableNativeFeedback
CInputAccessoryView
DSafeAreaView
Lời giải
Đáp án đúng: "InputAccessoryView". InputAccessoryView là component chỉ có trên iOS, cho phép gắn một thanh giao diện tuỳ biến nằm ngay trên bàn phím khi TextInput được focus, ví dụ thanh có nút gửi hay nút chèn biểu tượng; liên kết bằng prop nativeID của nó và inputAccessoryViewID của TextInput. "DrawerLayoutAndroid" là ngăn kéo điều hướng chỉ có trên Android, không liên quan bàn phím. "TouchableNativeFeedback" cũng chỉ dành cho Android, tạo hiệu ứng gợn sóng khi chạm. "SafeAreaView" là component iOS nhưng dùng để đẩy nội dung tránh tai thỏ, thanh trạng thái và home indicator, không tuỳ biến phần phụ của bàn phím.
Mở trang câu hỏi này →
AuseFocusEffect
BuseRoute
CuseIsFocused
DuseNavigationState
Lời giải
Đáp án đúng: "useFocusEffect". Trong React Navigation, thay vì tự đăng ký navigation.addListener với sự kiện focus bên trong useEffect rồi nhớ huỷ đăng ký, ta dùng useFocusEffect: nó chạy callback mỗi khi màn hình được focus và gọi hàm cleanup mà callback trả về khi màn hình mất focus; callback nên bọc trong useCallback để không chạy lại thừa. "useRoute" chỉ trả về đối tượng route hiện tại với name và params, không phản ứng với sự kiện focus. "useIsFocused" trả về giá trị boolean cho biết màn hình có đang được focus và làm component render lại khi giá trị đổi; nó hợp để hiển thị theo trạng thái nhưng không phải nơi chạy side effect thay cho listener. "useNavigationState" đọc một phần trạng thái của navigator, chẳng hạn số route trong ngăn xếp, không xử lý sự kiện focus.
Mở trang câu hỏi này →
Arow
Bcolumn
Ccolumn-reverse
Drow-reverse
Lời giải
Đáp án đúng: "row". flexDirection quyết định trục chính của container; giá trị row xếp các phần tử con thành hàng ngang từ trái sang phải (với ngôn ngữ viết từ trái sang phải). "column" xếp các phần tử theo cột từ trên xuống dưới, đây là mặc định trong React Native, khác với CSS trên web mặc định là hàng. "column-reverse" cũng xếp theo cột nhưng đảo chiều, phần tử đầu nằm dưới cùng. "row-reverse" xếp theo hàng ngang nhưng từ phải sang trái, ngược với yêu cầu. Khi đổi flexDirection thì vai trò của justifyContent và alignItems cũng đổi theo vì trục chính và trục phụ hoán đổi cho nhau.
Mở trang câu hỏi này →
Anpm -v
Bnode -v
Cnpm --ver
Dnode --version
Lời giải
Đáp án đúng: "npm -v". npm là trình quản lý gói đi kèm Node.js; cờ -v (viết đầy đủ là --version) in số phiên bản npm đang cài, giúp kiểm tra môi trường trước khi tạo hay cài dự án React Native. "node -v" sai vì lệnh này in phiên bản của Node.js, không phải của npm; hai số này khác nhau vì npm có chu kỳ phát hành riêng. "npm --ver" sai vì npm không có cờ --ver; cờ đúng là --version hoặc -v. "node --version" cũng chỉ in phiên bản Node.js, nó là cách viết đầy đủ của node -v nên không trả lời được câu hỏi về npm. Khi chuẩn bị môi trường nên kiểm tra cả hai: Node.js đủ mới theo yêu cầu của React Native, và npm tương ứng để cài các gói.
Mở trang câu hỏi này →
AonEndReached
Brefreshing
CextraData
DwindowSize
Lời giải
Đáp án đúng: "refreshing". Kéo để làm mới (pull-to-refresh) trong FlatList dùng cặp prop onRefresh và refreshing: khi người dùng kéo xuống, onRefresh được gọi để tải lại dữ liệu, còn refreshing là boolean quyết định vòng quay tải có hiện hay không; ta đặt true khi bắt đầu và false khi tải xong. "onEndReached" được gọi khi cuộn gần tới cuối danh sách, dùng để tải thêm (infinite scroll), không phải kéo làm mới ở đầu. "extraData" báo cho FlatList render lại khi một giá trị nằm ngoài data thay đổi, ví dụ id đang chọn. "windowSize" điều chỉnh số màn hình nội dung được giữ render quanh vùng nhìn thấy, phục vụ hiệu năng ảo hoá.
Mở trang câu hỏi này →
ASQLite
BAsyncStorage
CMongoDB
DFirebase
Lời giải
Đáp án đúng: "AsyncStorage". AsyncStorage (nay là gói @react-native-async-storage/async-storage) là kho lưu trữ khoá–giá trị bất đồng bộ, không mã hoá, lưu cục bộ và bền vững trên thiết bị; nó dành cho dữ liệu đơn giản như cài đặt người dùng, cờ đã xem hướng dẫn, thông qua setItem và getItem với giá trị dạng chuỗi. "SQLite" là cơ sở dữ liệu quan hệ cục bộ, phù hợp khi dữ liệu có cấu trúc, nhiều bảng và cần truy vấn, tức là vượt quá mức lưu trữ đơn giản. "MongoDB" là cơ sở dữ liệu NoSQL chạy phía máy chủ, không phải kho lưu trữ có sẵn trên thiết bị. "Firebase" là dịch vụ backend đám mây của Google như Firestore hay Realtime Database, cần mạng và thư viện ngoài, không phải hệ lưu trữ cục bộ cơ bản của React Native.
Mở trang câu hỏi này →
AIt provides a store object to maintain application state and notify components of state changes
BIt manages CSS styles
CIt allows for server-side rendering
DIt provides a custom database for large datasets
Lời giải
Đáp án đúng: "It provides a store object to maintain application state and notify components of state changes". Redux giữ toàn bộ state chung của ứng dụng trong một store duy nhất; muốn đổi state phải dispatch một action, reducer là hàm thuần nhận state cũ cùng action rồi trả state mới, sau đó store thông báo cho các component đã đăng ký (qua useSelector hoặc connect của react-redux) để chúng render lại. "It manages CSS styles" sai vì style do StyleSheet hoặc thư viện styling đảm nhận. "It allows for server-side rendering" sai vì render phía máy chủ là việc của framework như Next.js, Redux chỉ quản lý state. "It provides a custom database for large datasets" sai vì store nằm trong bộ nhớ, không phải cơ sở dữ liệu; dữ liệu lớn cần lưu bền thì dùng SQLite hay Realm.
Mở trang câu hỏi này →
AWriting the native module in Objective-C or Swift
BRegistering the module with RCTBridgeModule
CConfiguring the Xcode project to include the bridging header
DUsing RCT_EXPORT_METHOD to expose methods to JavaScript
Lời giải
Đáp án đúng: "Configuring the Xcode project to include the bridging header". Bridging header (tệp tiêu đề cầu nối, thường đặt tên dạng TênDựÁn-Bridging-Header.h) là tệp Xcode dùng để cho mã Swift nhìn thấy các khai báo Objective-C, ví dụ RCTBridgeModule.h của React Native; khi viết module bằng Swift, ta tạo tệp này và trỏ thiết lập Objective-C Bridging Header của target tới nó. "Writing the native module in Objective-C or Swift" là bước viết logic module, chưa đụng tới việc nối hai ngôn ngữ. "Registering the module with RCTBridgeModule" là bước khai báo lớp tuân theo giao thức RCTBridgeModule và dùng RCT_EXPORT_MODULE để React Native nhận ra module, không phải tạo bridging header. "Using RCT_EXPORT_METHOD to expose methods to JavaScript" là bước phơi từng phương thức cho JavaScript gọi, cũng không liên quan tới tệp cầu nối.
Mở trang câu hỏi này →
AWhen a component has flex: 1, it will try to fill all available space in its parent container, dividing this space equally with siblings that have an equivalent flex value.
BA component with a larger flex value will occupy a smaller proportion of space in the parent container.
CThe flex property is used to set a fixed height and width for a component.
DUsing flex allows a component to expand or shrink its size depending on the available space in the parent container.
Lời giải
Đáp án đúng gồm hai ý: "When a component has flex: 1, it will try to fill all available space in its parent container, dividing this space equally with siblings that have an equivalent flex value." và "Using flex allows a component to expand or shrink its size depending on the available space in the parent container." Trong React Native, flex là con số chỉ tỉ lệ chia khoảng trống dọc theo trục chính: các con cùng flex: 1 chia đều, còn con có flex: 2 đứng cạnh con flex: 1 nhận gấp đôi; vì thế kích thước component co giãn theo không gian của cha. Phát biểu "with a larger flex value will occupy a smaller proportion" đảo ngược quy tắc: flex càng lớn thì phần chiếm càng lớn. Phát biểu "The flex property is used to set a fixed height and width for a component." sai vì kích thước cố định đặt bằng width và height; flex chính là cách để kích thước không cố định.
Mở trang câu hỏi này →
20What is the purpose of the ScrollView component?4 lựa chọnDễ100% trả lời đúng
ATo display a single item at a time
BTo scroll through a list of items that may not fit on the screen
CTo create a carousel of images
DTo manage state within the component
Lời giải
Đáp án đúng: "To scroll through a list of items that may not fit on the screen". ScrollView là vùng chứa cuộn được: nó bọc nội dung dài hơn khung nhìn và cho phép cuộn dọc, hoặc cuộn ngang khi bật prop horizontal. ScrollView render tất cả phần tử con cùng lúc nên hợp với nội dung có số lượng vừa phải, còn danh sách dài nên chuyển sang FlatList. "To display a single item at a time" không đúng, vì ScrollView hiển thị nhiều phần tử liền nhau; chỉ khi bật pagingEnabled nó mới dừng theo từng trang. "To create a carousel of images" chỉ là một ứng dụng có thể dựng từ ScrollView ngang, không phải mục đích của component. "To manage state within the component" là việc của useState hoặc this.state, không phải của một component giao diện dùng để cuộn.
Mở trang câu hỏi này →