B.Không hỗ trợ hooks nên phải viết class component
C.Component dựng thành view native, không phải DOM
D.Dùng cú pháp riêng thay cho JSX
Đáp án: C
Cùng React, khác đích dựng hình: View và Text trở thành view native của Android và iOS thay vì phần tử DOM. Vì vậy không có HTML, không có CSS thật, và mọi API liên quan tới trình duyệt đều không tồn tại.
StyleSheet.create mang lại lợi ích gì so với đối tượng kiểu viết thẳng trong JSX?
A.Tự động áp kiểu khác nhau cho Android và iOS
B.Kiểu được tạo một lần và kiểm tra tên thuộc tính
C.Cho phép kế thừa kiểu từ component cha
D.Cho phép dùng bộ chọn giống CSS trong React Native
Đáp án: B
StyleSheet.create tạo đối tượng kiểu một lần thay vì mỗi lần render, và kiểm tra tên thuộc tính nên gõ sai bị bắt sớm. Với đối tượng viết thẳng trong JSX, mỗi lần render sinh một tham chiếu mới và làm hỏng việc so sánh props.
ScrollView dựng toàn bộ phần tử con ngay khi hiển thị, nên danh sách dài làm màn hình khựng và tốn bộ nhớ. FlatList chỉ dựng phần đang nhìn thấy cộng một vùng đệm, và tự thu hồi phần đã cuộn qua.
Mặc định là column, ngược với web vốn mặc định row. Ngoài ra flex: 1 trong React Native tương đương flex: 1 1 0 và mọi View đều là vùng flex, không cần khai báo display.
Cách viết đoạn mã chỉ chạy trên iOS trong React Native là gì?
A.Đặt mã trong khối chỉ thị biên dịch có điều kiện
B.Dùng biến môi trường đặt lúc chạy ứng dụng
C.Khai báo trong tệp cấu hình của dự án
D.Kiểm tra Platform.OS hoặc tách tệp theo hậu tố
Đáp án: D
Hai cách: kiểm tra Platform.OS trong mã, hoặc tách tệp thành Component.ios.tsx và Component.android.tsx để bộ đóng gói tự chọn khi build. Ngoài ra Platform.select cho phép chọn giá trị theo nền tảng ngay trong đối tượng kiểu.
A.Thiết lập nhẹ dạng khoá và chuỗi, không nhạy cảm
B.Tệp ảnh và video tải về từ server
C.Token đăng nhập và thông tin thanh toán
D.Dữ liệu quan hệ cần truy vấn và lọc
Đáp án: A
AsyncStorage là kho khoá và chuỗi không mã hoá, hợp cho thiết lập nhẹ như ngôn ngữ, chế độ tối, cờ đã xem hướng dẫn. Token phải nằm trong kho an toàn, còn dữ liệu cần truy vấn thì dùng cơ sở dữ liệu cục bộ.
Vì sao nên dùng Pressable thay cho TouchableOpacity trong mã mới?
A.Nó cho phép tự định nghĩa phản hồi khi nhấn
B.Nó xử lý cử chỉ nhanh hơn nhờ chạy ở tầng native
C.Nó tự thêm nhãn cho trình đọc màn hình
D.Nó là component duy nhất nhận sự kiện nhấn giữ
Đáp án: A
Pressable là API mới thay cho họ Touchable. Nó cho style và children nhận trạng thái nhấn, hỗ trợ vùng chạm mở rộng qua hitSlop, khoảng trễ nhấn giữ và ngưỡng huỷ khi kéo ra ngoài.
Khác biệt cốt lõi giữa dự án Expo và dự án React Native thuần là gì?
A.Expo không cho phép dùng thư viện bên thứ ba
B.Expo dùng phiên bản React khác với React Native thuần
C.Expo chỉ chạy được trên Android
D.Expo quản lý phần native thay cho lập trình viên
Đáp án: D
Expo quản lý phần native: cấu hình được sinh từ tệp cấu hình và có dịch vụ build trên đám mây. Dự án thuần thì thư mục android và ios nằm trong kho mã và mọi thay đổi native do lập trình viên tự làm.
Metro đóng vai trò gì trong ứng dụng React Native?
A.Quản lý các gói phụ thuộc trong dự án
B.Chạy mã JavaScript trên thiết bị
C.Biên dịch mã native cho Android và iOS
D.Gộp mã JavaScript thành gói cho ứng dụng nạp
Đáp án: D
Metro là bộ đóng gói JavaScript của React Native: gộp mã và tài nguyên thành gói cho ứng dụng nạp, đồng thời chạy server phát triển để cập nhật nhanh khi sửa mã. Phần native vẫn do Gradle và Xcode biên dịch.
Nội dung bị tai thỏ và thanh cử chỉ che mất. Cách xử lý đúng?
A.Bật chế độ toàn màn hình cho ứng dụng
B.Đặt marginTop theo chiều cao thanh trạng thái
C.Đặt khoảng cách trên cố định khoảng 44 điểm
D.Dùng vùng an toàn để lấy phần chèn thật
Đáp án: D
Dùng ngữ cảnh vùng an toàn để đọc phần chèn thật của thiết bị, rồi áp vào khoảng cách hoặc dùng thành phần bọc sẵn. Số cố định luôn sai trên ít nhất một dòng máy, và lỗi này chỉ lộ ra khi kiểm thử trên nhiều thiết bị.
Cắt chuỗi dài thành một dòng kèm dấu ba chấm trong React Native làm thế nào?
A.Đặt chiều cao cố định cho Text
B.Cắt chuỗi bằng slice trước khi hiển thị
C.Đặt numberOfLines cho Text
D.Đặt overflow hidden cho View bao ngoài
Đáp án: C
Dùng numberOfLines trên Text, kèm ellipsizeMode để chọn cắt ở đầu, giữa hay cuối. Cắt bằng slice là sai vì số ký tự vừa một dòng phụ thuộc cỡ chữ hệ thống và bề rộng thiết bị.
Vì sao nên dùng useWindowDimensions thay cho Dimensions.get?
A.Nó hoạt động được cả bên ngoài component
B.Nó cập nhật lại khi kích thước đổi
C.Nó trả về kích thước chính xác hơn tới từng điểm ảnh
D.Nó trừ sẵn phần vùng an toàn của thiết bị
Đáp án: B
useWindowDimensions là hook nên cập nhật khi kích thước đổi: xoay màn hình, chia đôi màn hình, hoặc mở máy gập. Dimensions.get chỉ chụp một lần, và giá trị đó cũ ngay lần xoay đầu tiên.
TextInput có value nhưng không có onChangeText thì điều gì xảy ra?
A.React Native ném lỗi ngay khi dựng component
B.Nội dung được lưu tạm cho tới khi mất tiêu điểm
C.Ô nhập bị vô hiệu hoá hoàn toàn
D.Người dùng gõ nhưng nội dung không đổi
Đáp án: D
Ô nhập trở thành được điều khiển nhưng không cập nhật: người dùng gõ, React dựng lại và đưa nội dung về giá trị cũ, nên chữ như không vào được. Có value thì phải có onChangeText, hoặc dùng defaultValue cho ô không điều khiển.
Mở ứng dụng gọi điện hoặc trình duyệt từ React Native dùng API nào?
A.Fetch tới địa chỉ cần mở
B.Linking với địa chỉ theo lược đồ tương ứng
C.Navigation với tên màn hình ngoài
D.WebView nhúng trong màn hình hiện tại
Đáp án: B
Linking.openURL với địa chỉ theo lược đồ phù hợp: tel: để gọi, mailto: để soạn thư, https: để mở trình duyệt, hoặc lược đồ riêng của ứng dụng khác. Nên kiểm tra khả năng mở trước khi gọi để xử lý được trường hợp không có ứng dụng nào nhận.
Vì sao ảnh trong thư mục dự án phải nạp bằng require thay vì đường dẫn chuỗi?
A.Chuỗi đường dẫn chỉ hoạt động trên iOS
B.Require nén ảnh lại nên tiết kiệm dung lượng
C.Bộ đóng gói cần biết ảnh lúc build để đưa vào gói
D.Chuỗi đường dẫn không hỗ trợ ảnh có độ phân giải cao
Đáp án: C
Bộ đóng gói phân giải requirelúc build để biết ảnh nào cần đưa vào gói và chọn đúng biến thể độ phân giải. Đường dẫn ghép động lúc chạy thì không thấy được, nên ảnh không được đóng gói và hiển thị rỗng.
Component Modal của React Native hiển thị nội dung ở đâu?
A.Trên một lớp phủ nằm trên toàn bộ giao diện
B.Trong màn hình mới của thư viện điều hướng
C.Ngay tại vị trí khai báo trong cây component
D.Trong một cửa sổ riêng của hệ điều hành
Đáp án: A
Modal hiển thị trên một lớp phủ nằm trên toàn bộ giao diện nên không bị cắt bởi phần tử cha. Đổi lại nó nằm ngoài ngăn xếp điều hướng, nên nút quay lại trên Android cần được xử lý riêng qua onRequestClose.
Chữ trên thanh trạng thái bị chìm vì nền màn hình sáng. Sửa bằng cách nào?
A.Đặt barStyle cho StatusBar theo màn hình
B.Bọc màn hình trong vùng an toàn có nền tối
C.Ẩn hẳn thanh trạng thái trên màn hình đó
D.Đổi màu nền của màn hình cho tối đi
Đáp án: A
Đặt barStyle là dark-content cho nền sáng và light-content cho nền tối, khai báo ở từng màn hình. Trên Android còn đặt được màu nền thanh trạng thái, còn iOS thì không nên chỉ đặt một lần ở gốc ứng dụng.
Danh sách cần chia theo nhóm có tiêu đề dính khi cuộn. Dùng component nào?
A.ScrollView với nhiều FlatList lồng bên trong
B.SectionList với danh sách nhóm và dữ liệu con
C.VirtualizedList tự cấu hình từ đầu
D.FlatList với dữ liệu đã làm phẳng
Đáp án: B
SectionList nhận mảng nhóm, mỗi nhóm có tiêu đề và mảng dữ liệu con, đồng thời có tuỳ chọn ghim tiêu đề khi cuộn. Nó giữ được cơ chế dựng lười giống FlatList nên phù hợp với danh bạ, lịch sử theo ngày, danh mục sản phẩm.
Ngăn người dùng thoát màn hình biểu mẫu đang nhập bằng nút quay lại trên Android làm thế nào?
A.Đặt cờ chặn điều hướng trong cấu hình ứng dụng
B.Lắng nghe sự kiện nút quay lại phần cứng
C.Mở màn hình dưới dạng modal toàn màn hình
D.Ẩn nút quay lại trong thanh điều hướng
Đáp án: B
Đăng ký lắng nghe sự kiện nút quay lại và trả về giá trị cho biết đã xử lý, thường kèm hộp thoại xác nhận rời màn hình. Nhớ gỡ đăng ký khi màn hình mất tiêu điểm, nếu không hành vi sẽ dính sang màn hình khác.
Vì sao useEffect với mảng phụ thuộc rỗng không đủ để làm mới dữ liệu khi quay lại màn hình?
A.useEffect không chạy được trên React Native
B.Màn hình vẫn nằm trong ngăn xếp
C.Dữ liệu bị bộ đóng gói lưu đệm nên không đổi
D.Mảng rỗng khiến hiệu ứng không bao giờ chạy
Đáp án: B
Thư viện điều hướng giữ màn hình trong ngăn xếp khi mở màn hình mới, nên khi quay lại component không được dựng lại và hiệu ứng chạy một lần không chạy lại. Cần dùng hook chạy theo tiêu điểm màn hình.
JSI thay đổi điều gì so với cầu nối cũ của React Native?
A.Mã JavaScript được biên dịch sang mã native lúc build
B.Giao diện được vẽ bằng công nghệ đồ hoạ riêng
C.JavaScript gọi thẳng hàm native, bỏ queue
D.Mọi lời gọi native chuyển sang chạy trên thread riêng
Đáp án: C
Cầu nối cũ chuyển mọi lời gọi thành thông điệp JSON xếp hàng bất đồng bộ. JSI cho JavaScript giữ tham chiếu tới đối tượng native và gọi thẳng, nên bỏ được chi phí tuần tự hoá và cho phép lời gọi đồng bộ khi cần.
Hermes cải thiện điều gì rõ nhất cho ứng dụng React Native?
A.Tốc độ mạng nhờ nén dữ liệu tự động
B.Thời gian khởi động nhờ mã byte biên dịch sẵn
C.Tốc độ vẽ giao diện trên thread dựng hình
D.Chất lượng hoạt ảnh nhờ đồng bộ theo khung hình
Đáp án: B
Hermes biên dịch JavaScript thành mã byte lúc build, nên khi mở ứng dụng không phải phân tích và biên dịch mã nữa. Kết quả rõ nhất là thời gian tới màn hình đầu giảm, kèm mức dùng bộ nhớ thấp hơn và dung lượng ứng dụng nhỏ hơn.
FlatList giật khi cuộn nhanh. Prop nào giúp nhiều nhất khi mọi dòng cao bằng nhau?
A.scrollEventThrottle đặt về giá trị nhỏ nhất
B.getItemLayout để bỏ bước đo từng dòng
C.removeClippedSubviews bật cho mọi nền tảng
D.initialNumToRender đặt giá trị thật lớn
Đáp án: B
getItemLayout cho danh sách biết trước chiều cao và vị trí từng dòng, nên bỏ được bước đo động khi cuộn và cho phép nhảy tới chỉ số bất kỳ ngay lập tức. Nó chỉ dùng được khi chiều cao dòng cố định hoặc tính được.
Bọc component con bằng memo nhưng nó vẫn dựng lại mỗi lần cha render. Nguyên nhân?
A.Cần đặt displayName thì memo mới có hiệu lực
B.Props là hàm hoặc đối tượng tạo mới mỗi lần
C.Component con có state riêng nên bỏ qua memo
D.memo chỉ hoạt động với class component
Đáp án: B
memo so sánh props theo tham chiếu. Một hàm gọi lại hoặc một đối tượng kiểu tạo ngay trong JSX sinh tham chiếu mới ở mỗi lần render, nên phép so sánh luôn thất bại. Cần useCallback và useMemo cho các props đó.
Native stack navigator khác stack navigator viết bằng JavaScript ở điểm nào?
A.Hỗ trợ deep link còn bản JavaScript thì không
B.Cho phép truyền tham số phức tạp hơn giữa các màn hình
C.Không cần bọc ứng dụng trong container điều hướng
D.Dùng điều hướng native nên hiệu ứng đúng chuẩn
Đáp án: D
Native stack dùng thành phần điều hướng thật của Android và iOS, nên hiệu ứng chuyển màn hình và cử chỉ vuốt về do nền tảng xử lý. Đổi lại, khả năng tuỳ biến hiệu ứng ít hơn so với bản dựng bằng JavaScript.
useNativeDriver trong Animated có tác dụng gì và khi nào không dùng được?
A.Tăng tần số khung hình lên mức cao nhất thiết bị hỗ trợ
B.Chạy hoạt ảnh trong một JS thread riêng
C.Cho phép hoạt ảnh tiếp tục khi ứng dụng vào nền
D.Đẩy hoạt ảnh xuống native, trừ thuộc tính bố cục
Đáp án: D
useNativeDriver gửi mô tả hoạt ảnh xuống tầng native để chạy độc lập với JS thread, nên hoạt ảnh không giật khi JavaScript bận. Nó chỉ áp dụng cho biến đổi hình học và độ mờ, không dùng được cho các thuộc tính bố cục như chiều rộng hay khoảng cách.
Vì sao các dự án React Native thường thay PanResponder bằng thư viện cử chỉ chuyên dụng?
A.Cử chỉ nhận dạng ở native, không phụ thuộc JavaScript
B.PanResponder đã bị gỡ khỏi React Native
C.Thư viện chuyên dụng tự sinh hoạt ảnh cho mọi cử chỉ
D.PanResponder không nhận được cử chỉ nhiều ngón tay
Đáp án: A
Thư viện cử chỉ chuyên dụng nhận dạng cử chỉ ở tầng native, nên phản hồi không bị trễ khi JS thread đang bận. Chúng cũng có sẵn cơ chế phối hợp giữa các cử chỉ đồng thời hoặc loại trừ nhau, thứ phải tự viết với PanResponder.
Danh sách ảnh làm ứng dụng bị đóng vì thiếu bộ nhớ. Nguyên nhân thường gặp nhất?
A.Thiếu khoá ổn định cho từng phần tử danh sách
B.Danh sách giữ quá nhiều dòng trong bộ nhớ
C.Ảnh giải mã ở kích thước gốc dù hiển thị nhỏ
D.Ảnh được tải lại nhiều lần từ server
Đáp án: C
Ảnh chiếm bộ nhớ theo kích thước điểm ảnh thật sau khi giải mã, không theo kích thước hiển thị. Một ảnh bốn nghìn điểm ảnh hiển thị trong ô một trăm điểm vẫn tốn như ảnh gốc, nên phải yêu cầu server trả ảnh đúng cỡ hoặc thu nhỏ trước khi hiển thị.
Lỗi chỉ xuất hiện ở bản release mà không có ở bản debug. Hướng kiểm tra đầu tiên?
A.Mã bị loại bỏ khi tối ưu, cấu hình khác nhau
B.Cache của bộ đóng gói chưa được xoá
C.Thiết bị thật có phiên bản hệ điều hành khác
D.Server phát triển không chạy khi thử bản release
Đáp án: A
Bản release rút gọn mã, tắt kiểm tra phát triển và dùng cấu hình khác. Các nguyên nhân phổ biến: mã dựa vào tên lớp hoặc tên hàm bị đổi khi rút gọn, luật giữ mã của trình rút gọn thiếu, biến môi trường trỏ sai, và tài nguyên chỉ có trong bản gỡ lỗi.
Dùng Context cho state đổi liên tục như ô tìm kiếm gây vấn đề gì?
A.Context không lưu được giá trị kiểu chuỗi
B.Mọi component đọc context đều dựng lại
C.Context không dùng được cùng hooks
D.Context chỉ hoạt động với component cùng cấp
Đáp án: B
Context không có cơ chế chọn phần dữ liệu: đổi giá trị là mọi component đọc nó đều dựng lại, kể cả những component chỉ quan tâm một trường khác. Với state đổi theo từng ký tự, đó là hàng loạt render thừa.
Xử lý đúng khi người dùng rời màn hình trong lúc yêu cầu mạng chưa xong là gì?
A.Đặt thời gian chờ rất ngắn để yêu cầu tự hỏng
B.Huỷ yêu cầu và bỏ qua kết quả trả về muộn
C.Chặn điều hướng cho tới khi yêu cầu hoàn tất
D.Giữ yêu cầu chạy tiếp rồi lưu kết quả vào biến toàn cục
Đáp án: B
Huỷ yêu cầu bằng tín hiệu huỷ và bỏ qua phản hồi tới muộn. Trong React, dọn dẹp trong hàm trả về của useEffect là chỗ đúng; nếu dùng thư viện dữ liệu server thì phần này đã được xử lý sẵn.
Cách để cài song song bản dev và bản production trên cùng một thiết bị là gì?
A.Cài một bản qua cửa hàng và một bản qua tệp cài đặt
B.Đặt định danh gói khác nhau cho từng biến thể build
C.Đổi tên hiển thị của ứng dụng cho từng bản
D.Đặt số phiên bản khác nhau giữa hai bản
Đáp án: B
Phải khác định danh gói: applicationId trên Android và bundle identifier trên iOS. Kèm theo đó thường đổi tên hiển thị và biểu tượng để phân biệt bằng mắt, và mỗi biến thể trỏ tới một endpoint riêng.
Thư viện kiểm thử React Native khuyến khích tìm phần tử theo tiêu chí nào?
A.Theo đường dẫn tệp chứa component cần kiểm tra
B.Theo thứ người dùng thấy như nhãn và chữ
C.Theo tên component và cây phân cấp của chúng
D.Theo thứ tự xuất hiện của phần tử trên màn hình
Đáp án: B
Tìm theo thứ người dùng nhận biết được: chữ hiển thị, nhãn khả năng tiếp cận, chỗ giữ chỗ của ô nhập. Nhờ vậy kiểm thử mô tả hành vi chứ không mô tả cấu trúc, và tái cấu trúc component không làm kiểm thử vỡ.
Cập nhật qua mạng cho ứng dụng React Native có giới hạn gì?
A.Chỉ áp dụng được cho Android, không dùng được trên iOS
B.Không thể quay lại bản trước khi bản mới có lỗi
C.Chỉ cập nhật JavaScript và tài nguyên, không có native
D.Bắt buộc người dùng phải mở lại ứng dụng ba lần
Đáp án: C
Chỉ phần JavaScript và tài nguyên được cập nhật. Thêm thư viện native, đổi quyền hoặc nâng cấp React Native đều phải qua cửa hàng. Ngoài ra bản cập nhật phải phù hợp chính sách của cửa hàng, không được đổi bản chất tính năng của ứng dụng.
Bàn phím che ô nhập ở cuối biểu mẫu. Cách xử lý phù hợp nhất?
A.Đặt khoảng đệm dưới cố định khoảng 300 điểm
B.Dùng thành phần né bàn phím với vùng cuộn
C.Tắt hiệu ứng đẩy màn hình khi bàn phím hiện
D.Chuyển ô nhập lên đầu biểu mẫu
Đáp án: B
Dùng thành phần né bàn phím bọc ngoài vùng cuộn, và đặt hành vi khác nhau cho hai nền tảng vì chúng xử lý phần chèn bàn phím theo cách khác nhau. Khoảng đệm cố định luôn sai trên một dòng máy nào đó.
Vì sao nên tách state dữ liệu server khỏi state giao diện?
A.Dữ liệu server luôn có kích thước lớn hơn
B.Dữ liệu server cần đệm, làm mới và thử lại
C.State giao diện không thể lưu trong cùng một kho
D.Redux không hỗ trợ dữ liệu bất đồng bộ
Đáp án: B
Dữ liệu server là bản sao của thứ thuộc về nơi khác, nên luôn có thể cũ và cần bộ đệm, làm mới, thử lại, khử trùng lặp yêu cầu. State giao diện thì thuộc sở hữu của ứng dụng và không có những nhu cầu đó.
Khi nào cần tự viết module native trong dự án React Native?
A.Khi cần API nền tảng chưa có thư viện nào bọc
B.Khi cần truy cập tệp trên thiết bị
C.Khi cần chạy tác vụ nền định kỳ
D.Khi cần tăng tốc phần tính toán trong JavaScript
Đáp án: A
Khi cần một API nền tảng chưa có thư viện nào bọc, hoặc phải tích hợp một bộ công cụ chỉ có bản native, ví dụ thư viện của đối tác thanh toán hay thiết bị phần cứng chuyên dụng.
Thông báo đẩy hoạt động khi ứng dụng ở nền nhưng im lặng khi đang mở. Vì sao?
A.Hệ điều hành chặn thông báo để tránh làm phiền
B.Thư viện thông báo chưa được khởi tạo đúng cách
C.Token thiết bị chỉ có hiệu lực khi ở nền
D.Ứng dụng đang mở thì mã ứng dụng tự xử lý
Đáp án: D
Khi ứng dụng đang hiển thị, hệ điều hành giao dữ liệu cho ứng dụng thay vì tự vẽ thông báo. Muốn thấy gì đó thì tự hiển thị bằng thông báo cục bộ hoặc một banner trong ứng dụng dựa trên dữ liệu nhận được.
Điều kiện để liên kết https mở thẳng ứng dụng thay vì trình duyệt là gì?
A.Tệp xác minh quyền sở hữu tên miền trên server
B.Ứng dụng phải được cài từ cửa hàng chính thức
C.Người dùng chọn ứng dụng làm trình xử lý mặc định
D.Khai báo lược đồ riêng trong cấu hình ứng dụng
Đáp án: A
Cần xác minh quyền sở hữu tên miền: assetlinks.json cho Android và apple-app-site-association cho iOS, đặt đúng đường dẫn well-known trên https. Thiếu bước này thì liên kết chỉ mở trình duyệt.
Cách hiệu quả nhất để giảm dung lượng bản Android của ứng dụng React Native là gì?
A.Phát hành app bundle và bật rút gọn mã
B.Chuyển ảnh trong ứng dụng sang định dạng nén mạnh hơn
C.Gỡ bớt màn hình ít người dùng khỏi ứng dụng
D.Tắt bộ máy JavaScript tối ưu để giảm thư viện đi kèm
Đáp án: A
Phát hành app bundle để cửa hàng sinh bản cài theo kiến trúc và mật độ màn hình từng máy, đồng thời bật rút gọn mã và loại bỏ tài nguyên không dùng. Đây là hai bước cắt được nhiều nhất mà không đụng tới tính năng.
Vết ngăn xếp từ người dùng thật chỉ toàn ký hiệu rút gọn. Thiếu gì?
A.Kết nối mạng ổn định lúc lỗi xảy ra
B.Bản đồ nguồn của đúng phiên bản đã phát hành
C.Quyền ghi nhật ký trên thiết bị người dùng
D.Chế độ gỡ lỗi bật trong bản phát hành
Đáp án: B
Thiếu bản đồ nguồn khớp đúng phiên bản. Bản phát hành rút gọn mã nên tên hàm mất ý nghĩa; phải tải bản đồ nguồn lên dịch vụ giám sát ở mỗi lần phát hành, và với Android còn cần tệp ký hiệu cho phần native.
Nút chỉ có biểu tượng cần thêm gì để trình đọc màn hình dùng được?
A.Nhãn khả năng tiếp cận và vai trò là nút
B.Màu sắc có độ tương phản cao hơn
C.Hiệu ứng phản hồi khi nhấn rõ ràng hơn
D.Kích thước biểu tượng lớn hơn ngưỡng khuyến nghị
Đáp án: A
Cần accessibilityLabel mô tả hành động và accessibilityRole là nút. Nhãn nên nói việc sẽ xảy ra chứ không mô tả hình vẽ: đọc lên là lưu bài viết thì hữu ích, còn đọc lên là biểu tượng dấu sao thì không.
Hỗ trợ ngôn ngữ viết từ phải sang trái cần chú ý điều gì trong bố cục?
A.Đảo thứ tự phần tử trong mảng dữ liệu
B.Đặt chiều rộng cố định cho mọi khối chữ
C.Dùng ảnh riêng cho từng hướng đọc
D.Dùng start và end thay cho left và right
Đáp án: D
Dùng các thuộc tính theo hướng đọc như marginStart, paddingEnd, textAlign là left chỉ khi thật sự cần cố định. Chúng tự đảo khi ngôn ngữ viết từ phải sang trái, còn marginLeft thì không đổi và làm bố cục lệch.
Lưu refresh token trong ứng dụng React Native nên dùng cách nào?
A.Kho an toàn dựa trên Keychain và Keystore
B.AsyncStorage kèm mã hoá tự viết
C.Biến trong bộ nhớ, đọc lại từ server khi mở app
D.Tệp trong thư mục dữ liệu của ứng dụng
Đáp án: A
Dùng kho an toàn dựa trên Keychain của iOS và Keystore của Android. Đó là nơi duy nhất có bảo vệ ở mức hệ điều hành. Access token nên ngắn hạn và giữ trong bộ nhớ, còn refresh token phải thu hồi được từ server.
Đưa ứng dụng React Native vào kho mã nhiều package thường vướng ở đâu?
A.Metro không theo dõi thư mục ngoài thư mục dự án
B.React Native không hỗ trợ TypeScript trong kho như vậy
C.Không thể chạy ứng dụng trên thiết bị thật
D.Phải viết lại toàn bộ phần native
Đáp án: A
Metro chỉ theo dõi thư mục dự án theo mặc định, nên mã nằm ở package khác không được phân giải. Phải khai báo thư mục theo dõi trong cấu hình Metro và xử lý trường hợp cùng một thư viện xuất hiện ở nhiều nơi trong cây phụ thuộc.
Thời điểm hợp lý để xin quyền vị trí trong ứng dụng là khi nào?
A.Sau khi người dùng đã dùng ứng dụng một tuần
B.Khi người dùng chạm vào tính năng cần vị trí
C.Trong màn hình cài đặt để người dùng tự bật
D.Ở màn hình đầu tiên khi mở ứng dụng lần đầu
Đáp án: B
Hỏi đúng lúc người dùng chạm vào tính năng cần quyền. Lúc đó lý do hiển nhiên nên tỉ lệ đồng ý cao. Hỏi ở màn hình mở đầu là cách nhanh nhất để bị từ chối, và trên iOS thì hộp thoại chỉ hiện một lần duy nhất.
Vì sao số build phải tăng ở mỗi lần tải lên cửa hàng?
A.Cửa hàng dùng nó để phân biệt các lần tải lên
B.Bộ đóng gói cần nó để đặt tên tệp gói
C.Dịch vụ giám sát lỗi cần nó để gom nhóm lỗi
D.Thiết bị dùng nó để quyết định có cập nhật hay không
Đáp án: A
Cửa hàng phân biệt các lần tải lên bằng số build, nên trùng số là bị từ chối. Cách bền là để hệ thống tích hợp liên tục cấp số tự động thay vì sửa tay, còn tên phiên bản hiển thị thì do con người quyết định.
Ứng dụng mất nhiều giây mới hiện màn hình đầu. Chỗ nào nên kiểm tra trước?
A.Số lượng component trên màn hình đầu tiên
B.Khởi tạo chạy đồng bộ trước khi vẽ
C.Kích thước ảnh nền của màn hình chờ
D.Tốc độ mạng của thiết bị khi mở ứng dụng
Đáp án: B
Rà phần khởi tạo chạy trước khi dựng giao diện: khởi tạo dịch vụ, đọc kho lưu trữ, gọi cấu hình từ xa. Chỉ giữ những gì quyết định màn hình đầu, phần còn lại chuyển sang chạy sau khi giao diện đã hiển thị.
Một lỗi khi dựng component làm cả ứng dụng trắng màn hình. Cách hạn chế thiệt hại?
A.Tắt chế độ nghiêm ngặt của React
B.Bắt lỗi trong useEffect của component gốc
C.Bọc mọi hàm dựng trong khối try catch
D.Đặt ranh giới lỗi quanh từng khu vực màn hình
Đáp án: D
Dùng ranh giới lỗi đặt quanh từng khu vực: một tab, một danh sách, một thẻ nội dung. Lỗi được giữ trong khu vực đó và hiển thị giao diện dự phòng, thay vì làm trắng toàn bộ ứng dụng.
Trường hợp nào React Native không phải lựa chọn phù hợp?
A.Ứng dụng thương mại điện tử nhiều màn hình danh sách
B.Ứng dụng cần chạy trên cả hai nền tảng với đội nhỏ
C.Ứng dụng nội bộ doanh nghiệp nhiều biểu mẫu
D.Ứng dụng đồ hoạ nặng và tích hợp hệ thống
Đáp án: D
React Native yếu thế với ứng dụng đồ hoạ nặng như trò chơi hoặc xử lý ảnh thời gian thực, và với ứng dụng cần tích hợp sâu vào hệ thống như tiện ích màn hình chính. Đội đã mạnh native cho một nền tảng duy nhất cũng nên cân nhắc kỹ.
Worklet là hàm JavaScript được biên dịch để chạy trên UI thread. Nhờ vậy hoạt ảnh và phản hồi cử chỉ vẫn mượt khi JS thread chính đang bận, đổi lại nó không truy cập được trực tiếp state của React.
Thư viện danh sách dựa trên tái dùng view khác FlatList ở điểm nào?
A.Nó nén dữ liệu trong bộ nhớ để tiết kiệm RAM
B.Nó dùng lại view cũ thay vì tạo mới
C.Nó vẽ danh sách bằng công nghệ đồ hoạ riêng
D.Nó tải dữ liệu từ server theo trang tự động
Đáp án: B
Cơ chế tái dùng view: khi một dòng cuộn khỏi màn hình, view của nó được gán dữ liệu mới thay vì bị huỷ và tạo lại. Cách này giảm mạnh chi phí khi cuộn nhanh, nhưng cần biết trước ước lượng kích thước dòng.
Vì sao viết state.items.push trong reducer của Redux Toolkit lại hợp lệ?
A.Reducer chạy trên bản nháp và sinh ra state mới
B.Redux Toolkit cho phép sửa trực tiếp state gốc
C.Mảng trong JavaScript vốn được sao chép khi truyền
D.Reducer chạy trong một thread riêng nên an toàn
Đáp án: A
Reducer nhận một bản nháp được theo dõi thay đổi. Cú pháp trông như sửa trực tiếp nhưng thư viện dựng ra một state mới bất biến từ các thay đổi đó, nên quy tắc bất biến của Redux vẫn được giữ.
Đọc cả kho state thay vì dùng bộ chọn hẹp gây hậu quả gì?
A.Component dựng lại theo mọi thay đổi của kho
B.Kho bị khoá cho tới khi component dựng xong
C.Các bộ chọn khác ngừng hoạt động
D.State bị sao chép nên tốn gấp đôi bộ nhớ
Đáp án: A
Component dựng lại theo mọi thay đổi trong kho, kể cả những phần nó không dùng. Trên di động, một danh sách dài đăng ký cả kho là cách nhanh nhất để mọi thao tác nhỏ đều gây rớt khung hình.
Thư viện biểu mẫu dựa trên ô nhập không điều khiển có lợi thế gì trên di động?
A.Không cần viết luật kiểm tra hợp lệ nữa
B.Dữ liệu biểu mẫu tự lưu xuống thiết bị
C.Bàn phím tự động né các ô nhập bị che
D.Gõ phím không render lại cả biểu mẫu
Đáp án: D
Giá trị được giữ ngoài state React nên gõ phím không dựng lại cả biểu mẫu. Trên biểu mẫu dài chạy ở máy tầm trung, khác biệt này thấy được ngay bằng mắt qua độ trễ giữa lúc gõ và lúc chữ hiện.
Thêm phông chữ tuỳ chỉnh nhưng chữ vẫn hiện bằng phông mặc định. Nguyên nhân thường gặp?
A.Cần khởi động lại server phát triển là đủ
B.Tệp phông chưa được nén đúng định dạng
C.Tên họ phông trong mã không khớp tên thật của tệp
D.Phông chỉ áp dụng được cho tiêu đề chứ không cho nội dung
Đáp án: C
Sai tên họ phông: hệ thống tra theo tên nội bộ trong tệp chứ không theo tên tệp, và khi không tìm thấy thì im lặng dùng phông mặc định mà không báo lỗi. Ngoài ra thêm phông cần build lại phần native.
Vì sao biểu tượng nên dùng SVG thay vì ảnh bitmap trong ứng dụng di động?
A.Sắc nét ở mọi mật độ và đổi màu được
B.SVG được lưu đệm tự động còn bitmap thì không
C.SVG vẽ nhanh hơn bitmap trên mọi thiết bị
D.SVG luôn nhẹ hơn ảnh bitmap ở mọi trường hợp
Đáp án: A
Một tệp vector phục vụ mọi mật độ điểm ảnh, không cần bộ ảnh cho từng độ phân giải, và đổi màu bằng thuộc tính nên một biểu tượng dùng được cho cả chế độ sáng lẫn tối. Đổi lại, hình rất phức tạp có thể vẽ chậm hơn ảnh bitmap.
Bản đồ với hàng nghìn điểm đánh dấu bị giật. Hướng xử lý đúng?
A.Gom nhóm điểm và chỉ vẽ trong viewport
B.Giảm kích thước biểu tượng của mỗi điểm
C.Tắt hoạt ảnh khi kéo bản đồ
D.Nạp toàn bộ điểm một lần khi mở màn hình
Đáp án: A
Gom nhóm điểm theo mức thu phóng và chỉ hiển thị các điểm nằm trong viewport hiện tại. Nghìn view riêng lẻ là quá tải cho tầng native, còn gom nhóm giữ số view ở mức vài chục bất kể tổng số điểm.
Tải ảnh lên server từ điện thoại nên xử lý thêm bước nào trước khi gửi?
A.Thu nhỏ và nén ảnh ở phía thiết bị
B.Chia ảnh thành nhiều tệp nhỏ rồi ghép ở server
C.Đổi tên tệp theo mã người dùng trước khi gửi
D.Chuyển ảnh sang chuỗi mã hoá base64
Đáp án: A
Thu nhỏ và nén ở phía thiết bị trước khi gửi. Ảnh gốc từ máy ảnh hiện nay thường vài megabyte, gửi nguyên bản tốn dữ liệu di động, dễ hết thời gian chờ trên mạng yếu, và server vẫn phải thu nhỏ lại.
Xác thực bằng vân tay trên thiết bị nên được hiểu là gì trong thiết kế bảo mật?
A.Lớp mở khoá cục bộ, không thay xác thực
B.Cách lưu mật khẩu người dùng an toàn hơn
C.Cách mã hoá dữ liệu truyền giữa ứng dụng và server
D.Cách xác thực người dùng thay cho mật khẩu ở server
Đáp án: A
Sinh trắc là lớp mở khoá cục bộ: nó bảo vệ quyền truy cập vào phiên đang lưu trên thiết bị, chứ không phải bằng chứng danh tính gửi lên server. Server vẫn phải xác thực bằng token và kiểm tra quyền như bình thường.
Vì sao cần quy ước đặt tên sự kiện trước khi gắn phân tích hành vi?
A.Dịch vụ phân tích từ chối các tên không theo chuẩn
B.Tên sự kiện ảnh hưởng tới hiệu năng ứng dụng
C.Quy ước giúp giảm dung lượng dữ liệu gửi đi
D.Dữ liệu không đồng nhất thì khó phân tích
Đáp án: D
Không có quy ước thì mỗi người đặt một kiểu, và sau vài tháng bảng theo dõi đầy các sự kiện gần giống nhau mà không ghép được. Sửa sau rất tốn vì dữ liệu lịch sử đã ghi theo tên cũ và không đổi lại được.
Cờ tính năng giải quyết vấn đề gì đặc thù của ứng dụng di động?
A.Thay thế hoàn toàn nhu cầu kiểm thử trước khi phát hành
B.Giảm dung lượng ứng dụng vì tính năng tắt không được đóng gói
C.Tắt tính năng hỏng mà không cần chờ duyệt bản mới
D.Cho phép cập nhật giao diện mà không cần mã mới
Đáp án: C
Trên di động, bản sửa lỗi phải qua duyệt và người dùng có thể không cập nhật trong nhiều tuần. Cờ tính năng cho phép tắt ngay một tính năng hỏng trên các bản đã cài, và mở dần tính năng mới cho một phần người dùng.
A.Chỉ từ tuỳ chọn do người dùng đặt trong ứng dụng
B.Từ khung giờ trong ngày của thiết bị
C.Từ cấu hình lưu trên server theo tài khoản
D.Từ thiết lập hệ thống, cho phép ghi đè
Đáp án: D
Mặc định theo thiết lập hệ thống và cho phép ghi đè trong ứng dụng với ba lựa chọn: theo hệ thống, luôn sáng, luôn tối. Giá trị ghi đè lưu cục bộ vì nó gắn với thiết bị chứ không gắn với tài khoản.
Kiểm thử đầu cuối trên thiết bị nên tập trung vào phạm vi nào?
A.Vài luồng sống còn của sản phẩm
B.Các hàm tính toán và chuyển đổi dữ liệu
C.Mọi màn hình có trong ứng dụng
D.Giao diện của từng component nhỏ
Đáp án: A
Giữ ít và tập trung vào luồng sống còn: đăng nhập, thanh toán, main thread tạo ra doanh thu. Mỗi lần chạy tốn phút và dễ chập chờn, nên phủ rộng bằng kiểm thử đơn vị và kiểm thử component thì kinh tế hơn nhiều.
Ứng dụng cần dùng được khi mất mạng. Phần khó nhất là gì?
A.Lưu dữ liệu xuống bộ nhớ thiết bị
B.Giải quyết xung đột khi đồng bộ lại thay đổi
C.Hiển thị trạng thái đang chờ đồng bộ
D.Phát hiện thiết bị có mạng hay không
Đáp án: B
Phần khó là xung đột: cùng một bản ghi bị sửa trên thiết bị và trên server trong lúc mất mạng. Phải chọn giữa lấy bản mới nhất, giữ bản server, hợp nhất theo trường, hoặc hỏi người dùng, và mỗi cách đều có cái giá.
Lưu thời điểm một sự kiện xảy ra nên dùng cách nào?
A.Lưu chuỗi đã định dạng sẵn để hiển thị
B.Lưu theo giờ chuẩn quốc tế, hiển thị theo máy
C.Lưu số phút kể từ khi ứng dụng khởi động
D.Lưu theo giờ địa phương của người tạo bản ghi
Đáp án: B
Lưu theo giờ chuẩn quốc tế và chỉ chuyển sang múi giờ thiết bị khi hiển thị. Người dùng đi lại, đổi múi giờ và đồng hồ thiết bị có thể sai, nên dữ liệu gốc phải độc lập với những thứ đó.
Nguyên nhân rò bộ nhớ phổ biến nhất trong màn hình React Native là gì?
A.Dùng quá nhiều component trong một màn hình
B.Đặt kiểu bằng đối tượng viết thẳng trong JSX
C.Đăng ký sự kiện và bộ đếm giờ không được dọn
D.Nạp dữ liệu trong useEffect thay vì trong hàm dựng
Đáp án: C
Đăng ký sự kiện, bộ đếm giờ và kết nối realtime không được dọn trong hàm trả về của hiệu ứng. Chúng giữ tham chiếu tới component nên toàn bộ cây con không được giải phóng, và mỗi lần mở lại màn hình là thêm một bản nữa.
Nâng React Native lên phiên bản mới trên dự án lớn nên làm thế nào?
A.Chỉ nâng các thư viện, giữ nguyên phiên bản React Native
B.Nâng thẳng trên nhánh chính cho cả đội cùng sửa
C.Tạo dự án mới rồi chép mã nguồn sang
D.Nâng trên nhánh riêng, đối chiếu cấu hình native
Đáp án: D
Nâng trên nhánh riêng và dùng công cụ so sánh khác biệt giữa hai phiên bản để biết chính xác tệp cấu hình native nào phải sửa. Sau đó nâng thư viện theo từng nhóm nhỏ và kiểm thử lại main thread trên cả hai nền tảng.
Giảm thời gian nạp gói JavaScript lúc khởi động bằng cách nào?
A.Chuyển bớt mã sang phía server
B.Nén gói JavaScript mạnh hơn khi build
C.Gộp mọi module thành một tệp duy nhất
D.Hoãn nạp module cho tới khi cần
Đáp án: D
Hoãn việc nạp module bằng cách yêu cầu chúng ngay tại chỗ dùng thay vì nạp ở đầu tệp. Module chỉ được đánh giá khi lần đầu cần tới, nên các màn hình ít mở không làm chậm khởi động.
Màn hình danh sách nên xử lý những trạng thái nào ngoài trạng thái có dữ liệu?
A.Người dùng đang xoay ngang thiết bị
B.Tải thất bại kèm nút thử lại
C.Đang tải lần đầu
D.Tải xong nhưng danh sách rỗng
Đáp án: B, C, D
Ba trạng thái tối thiểu: đang tải, rỗng và lỗi có nút thử lại. Bỏ trạng thái rỗng là nguyên nhân phổ biến nhất của màn hình trắng, và bỏ nhánh lỗi khiến người dùng không có cách nào tiếp tục.
Tab được dựng sẵn khi mở ứng dụng làm chậm khởi động. Cách xử lý?
A.Giảm số lượng tab xuống còn hai hoặc ba
B.Chuyển các tab thành màn hình trong ngăn xếp
C.Nạp dữ liệu của mọi tab ngay khi khởi động
D.Chỉ dựng tab khi lần đầu người dùng mở nó
Đáp án: D
Bật tuỳ chọn dựng lười cho các tab để mỗi tab chỉ được dựng khi lần đầu người dùng mở. Kèm theo đó, chỉ gọi dữ liệu khi tab có tiêu điểm thay vì gọi tất cả lúc khởi động.
Người dùng bấm nút gửi hai lần rất nhanh tạo hai đơn hàng. Cách xử lý bền vững?
A.Hiển thị hộp thoại xác nhận trước khi gửi
B.Chống dội sự kiện chạm khoảng một giây
C.Khoá ở tầng state cộng khoá idempotent ở server
D.Vô hiệu hoá nút ngay trong hàm xử lý chạm
Đáp án: C
Cần hai lớp: cờ đang gửi ở tầng state để chặn lời gọi thứ hai và cho nút vào trạng thái chờ, và khoá idempotent gửi kèm yêu cầu để server nhận ra lần thử lại và trả về đúng bản ghi cũ.
Danh sách tin nhắn nên cuộn thế nào khi có tin mới?
A.Cuộn về đầu danh sách để thấy tin mới nhất
B.Không bao giờ tự cuộn, để người dùng tự kéo
C.Luôn cuộn xuống cuối mỗi khi có tin mới
D.Chỉ tự cuộn khi đang ở gần cuối danh sách
Đáp án: D
Chỉ tự cuộn khi người dùng đang ở gần cuối. Nếu họ đang đọc lại tin cũ thì hiện một chỉ báo có tin mới thay vì kéo màn hình, để họ tự chọn thời điểm nhảy xuống.
Chỉ số nào phản ánh đúng nhất độ mượt mà người dùng thật cảm nhận?
A.Mức dùng bộ nhớ trung bình của ứng dụng
B.Tỉ lệ khung hình chậm ở nhóm phần trăm cao
C.Thời gian phản hồi trung bình của API
D.Số khung hình trung bình mỗi giây của phiên
Đáp án: B
Nhìn vào phân bố ở nhóm phần trăm cao, ví dụ số khung hình chậm trong năm phần trăm tệ nhất. Giá trị trung bình che mất các đợt khựng, mà trải nghiệm lại được định hình bởi đúng những lần khựng đó.
Khoá API nhúng trong mã ứng dụng di động nên được coi là gì?
A.Bí mật an toàn nếu chỉ gửi qua kết nối được mã hoá
B.Bí mật an toàn nếu lưu trong kho an toàn của hệ điều hành
C.Bí mật an toàn nếu mã đã được rút gọn
D.Thông tin công khai vì có thể trích xuất từ gói cài đặt
Đáp án: D
Coi như công khai. Mọi chuỗi trong gói cài đặt đều trích xuất được, và rút gọn mã không thay đổi điều đó. Bí mật thật phải nằm ở server; khoá bắt buộc có ở phía ứng dụng thì phải giới hạn quyền và giả định sẽ bị lộ.