Stack Navigator — một thành phần của thư viện React Navigation để quản lý màn hình ứng dụng di động theo nguyên lý ngăn xếp (LIFO). Mỗi màn hình mới được đặt lên trên màn hình trước đó và nút «Quay lại» xoá màn hình trên cùng và đưa người dùng trở lại màn hình trước đó. Đọc thêm về kiến trúc điều hướng trong tài liệu chính thức của React Navigation.
Những điểm chính
Stack Navigator — một trong những bộ điều hướng cơ bản của thư viện React Navigation triển khai mô hình ngăn xếp màn hình. Nó cung cấp điều hướng quen thuộc cho người dùng di động: mở màn hình mới đi kèm hoạt ảnh trượt sang phải và nút «Quay lại» hoặc cử chỉ vuốt đưa người dùng về màn hình trước đó. Stack Navigator hỗ trợ iOS và Android, sử dụng thành phần native của nền tảng để đạt hiệu suất tối đa.
React Navigation là thư viện điều hướng phổ biến nhất cho React Native, được cài đặt trong 85% dự án (theo dữ liệu npm, 2026). Stack Navigator là một phần lõi của nó và có sẵn ở hai triển khai: createNativeStackNavigator (native, được khuyến nghị) và createStackNavigator (JavaScript, cho hoạt ảnh tuỳ chỉnh phức tạp). Phiên bản native xuất hiện trong React Navigation v5 và trở thành tiêu chuẩn trong v6+.
Lợi thế chính của Stack Navigator — hành vi tự nhiên quen thuộc với người dùng iOS và Android. Trên iOS, ngăn xếp được thể hiện trực quan qua UINavigationController, trên Android — qua FragmentManager với hoạt ảnh trượt. Nhà phát triển không cần triển khai logic ngăn xếp thủ công — bộ điều hướng tự động quản lý trạng thái màn hình, ngăn xếp quay lại và hoạt ảnh.
Điều hướng ngăn xếp dựa trên nguyên lý LIFO (Last In, First Out). Khi người dùng mở một màn hình mới, bộ điều hướng đặt nó lên đỉnh ngăn xếp. Khi nhấn «Quay lại», màn hình trên cùng bị xoá và người dùng thấy màn hình trước đó. Ngăn xếp có thể chứa bất kỳ số lượng màn hình nào — giới hạn duy nhất là bộ nhớ thiết bị.
Mỗi màn hình trong ngăn xếp giữ nguyên trạng thái của nó. Khi quay lại màn hình trước, trạng thái của nó được khôi phục tự động. Điều này phân biệt ngăn xếp với các loại điều hướng khác (Tab, Drawer), nơi màn hình có thể được tạo lại. React Navigation quản lý trạng thái qua cơ chế ngữ cảnh điều hướng riêng của nó.
| Hành động | Kết quả | Ví dụ |
|---|---|---|
| navigate | Đặt màn hình lên đỉnh ngăn xếp | navigation.navigate('Profile') |
| goBack | Xoá màn hình trên cùng khỏi ngăn xếp | navigation.goBack() |
| push | Thêm màn hình mới một cách bắt buộc | navigation.push('Profile') |
| popToTop | Quay lại màn hình gốc | navigation.popToTop() |
| reset | Thay thế toàn bộ ngăn xếp bằng tập hợp mới | navigation.reset({ index: 0, routes: [...] }) |
Trên iOS, Stack Navigator hỗ trợ cử chỉ vuốt từ mép trái để quay lại — đây là hành vi tiêu chuẩn của iOS mà người dùng mong đợi. Trên Android, cử chỉ bị tắt theo mặc định nhưng có thể bật qua tuỳ chọn gestureEnabled. Trong Native Stack, cử chỉ hoạt động native mà không có độ trễ của luồng JavaScript.
React Navigation cung cấp hai loại Stack Navigator: Native Stack (createNativeStackNavigator) và JS Stack (createStackNavigator). Sự khác biệt chính — nơi hoạt ảnh được thực thi. Native Stack sử dụng trình điều khiển hoạt ảnh native của iOS và Android, trong khi JS Stack chạy qua luồng JavaScript của React Native. Lựa chọn giữa chúng phụ thuộc vào yêu cầu về hiệu suất và tuỳ chỉnh.
Native Stack được khuyến nghị cho hầu hết các dự án. Nó cung cấp hoạt ảnh mượt mà 60 FPS mà không chặn luồng JS, hỗ trợ cử chỉ vuốt quay lại hệ thống trên iOS và sử dụng chuyển tiếp native — slide trên iOS, fade trên Android. Tuy nhiên, Native Stack bị giới hạn trong việc tuỳ chỉnh hoạt ảnh: chỉ có một tập hợp chuyển tiếp được xác định trước.
JS Stack cho phép kiểm soát hoàn toàn hoạt ảnh qua cardStyleInterpolator. Nhà phát triển có thể tạo bất kỳ hoạt ảnh nào: thu phóng, xoay, parallax, đường cong tuỳ chỉnh. Nhược điểm — hoạt ảnh chạy trong luồng JS, có thể gây rớt khung hình trên thiết bị yếu với chuyển tiếp phức tạp. Đối với 70% dự án, Native Stack là quá đủ.
// Native Stack — triển khai được khuyến nghị
import { createNativeStackNavigator } from '@react-navigation/native-stack';
type RootStackParamList = {
Home: undefined;
Profile: { userId: string; name: string };
Settings: undefined;
};
const Stack = createNativeStackNavigator<RootStackParamList>();
function AppNavigator() {
return (
<Stack.Navigator screenOptions={{ headerShown: true }}>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
);
}Để bắt đầu với Stack Navigator, cần cài đặt React Navigation và các phụ thuộc của nó. Bộ tối thiểu bao gồm @react-navigation/native, @react-navigation/native-stack và react-native-screens. Sau khi cài đặt, ứng dụng được bọc trong NavigationContainer — một ngữ cảnh cung cấp trạng thái điều hướng cho tất cả các thành phần con.
# Cài đặt phụ thuộc React Navigation
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context
# Đối với iOS — cài đặt pod
cd ios && pod install && cd ..Sau khi cài đặt, Stack.Navigator được tạo với các màn hình cụ thể được định nghĩa trong RootStackParamList. Mỗi màn hình được liên kết với một thành phần React qua prop component. Bộ điều hướng có thể là gốc hoặc được lồng bên trong một bộ điều hướng khác (Tab, Drawer). Để cấu hình, sử dụng screenOptions — chung cho tất cả màn hình hoặc riêng cho từng màn hình.
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
type RootStackParamList = {
Home: undefined;
Details: { itemId: number; title: string };
};
const Stack = createNativeStackNavigator<RootStackParamList>();
export default function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home"
screenOptions={{
headerStyle: { backgroundColor: '#6200ee' },
headerTintColor: '#fff',
gestureEnabled: true,
}}>
<Stack.Screen name="Home" component={HomeScreen}
options={{ title: 'Trang chủ' }} />
<Stack.Screen name="Details" component={DetailsScreen}
options={({ route }) => ({ title: route.params.title })} />
</Stack.Navigator>
</NavigationContainer>
);
}Stack Navigator cung cấp nhiều tuỳ chọn để tuỳ chỉnh giao diện và hành vi. Các tham số chính được thiết lập qua screenOptions ở cấp Navigator hoặc options ở cấp Screen. Nhà phát triển có thể cấu hình tiêu đề, hoạt ảnh chuyển tiếp, cử chỉ vuốt, kiểu thẻ và làm tối nền. Tính linh hoạt của cài đặt cho phép điều chỉnh điều hướng theo hệ thống thiết kế của ứng dụng.
| Tuỳ chọn | Loại | Mô tả |
|---|---|---|
| headerShown | boolean | Hiển thị hoặc ẩn tiêu đề màn hình |
| headerStyle | object | Kiểu thanh tiêu đề (backgroundColor, elevation) |
| headerBackTitle | string | Văn bản nút «Quay lại» (iOS) |
| gestureEnabled | boolean | Bật cử chỉ vuốt để quay lại |
| animation | string | Loại hoạt ảnh: slide_from_right, fade, none |
| contentStyle | object | Kiểu khu vực bên trong màn hình |
Đối với JS Stack, cardStyleInterpolator cho phép tạo hoạt ảnh chuyển tiếp tuỳ ý giữa các màn hình. Đây là công cụ mạnh mẽ để triển khai các hiệu ứng hình ảnh độc đáo: thu phóng, xoay, parallax, lật ngang. Hàm nhận các giá trị tiến trình hoạt ảnh hiện tại (current, next) và trả về kiểu cho các phần tử đang được tạo hoạt ảnh.
Stack Navigator hỗ trợ kiểu đầy đủ qua TypeScript. Để làm điều này, RootStackParamList được định nghĩa — một kiểu đối tượng nơi khoá là tên màn hình và giá trị là kiểu tham số. Sau khi định kiểu, navigation.navigate và route.params nhận được tự động hoàn thành và kiểm tra kiểu. Điều này loại bỏ lỗi truyền tham số tại thời điểm biên dịch.
type RootStackParamList = {
Home: undefined;
Product: { id: string; category: string };
Checkout: { items: CartItem[]; total: number };
};
// Màn hình được định kiểu
type ProductScreenProps = NativeStackScreenProps<RootStackParamList, 'Product'>;
function ProductScreen({ navigation, route }: ProductScreenProps) {
const { id, category } = route.params;
return (
<View>
<Text>Sản phẩm {id} — {category}</Text>
<Button title="Thêm vào giỏ"
onPress={() => navigation.navigate('Checkout', {
items: [{ id, quantity: 1 }],
total: 99.99,
})} />
</View>
);
}Stack Navigator hỗ trợ nhóm màn hình và cửa sổ modal. Nhóm (Screen Group) cho phép áp dụng cài đặt chung cho nhiều màn hình mà không trùng lặp. Cửa sổ modal được triển khai qua stack presentation: 'modal' — màn hình mở từ dưới lên với nền tối đi, giống như modal hệ thống trên iOS. Tuỳ chọn này chỉ khả dụng trong Native Stack.
Đối với điều hướng phức tạp, Stack Navigator có thể được lồng bên trong Tab Navigator hoặc Drawer Navigator. Ví dụ, tab «Trang chủ» có ngăn xếp màn hình riêng và tab «Hồ sơ» có ngăn xếp riêng. Sự kết hợp các bộ điều hướng này là cách tiếp cận tiêu chuẩn cho ứng dụng sản xuất. Mỗi ngăn xếp được cách ly: ngăn xếp quay lại trong một tab không ảnh hưởng đến các tab khác.
// Ngăn xếp lồng trong Tab Navigator
const HomeStack = createNativeStackNavigator<HomeStackParamList>();
function HomeStackScreen() {
return (
<HomeStack.Navigator>
<HomeStack.Screen name="Feed" component={FeedScreen} />
<HomeStack.Screen name="PostDetail" component={PostDetailScreen}
options={{ presentation: 'modal' }} />
</HomeStack.Navigator>
);
}
// Nhóm màn hình với tuỳ chọn dùng chung
<Stack.Navigator>
<Stack.Group screenOptions={{ headerShown: true }}>
<Stack.Screen name="Main" component={MainScreen} />
<Stack.Screen name="About" component={AboutScreen} />
</Stack.Group>
<Stack.Screen name="Auth" component={AuthScreen}
options={{ presentation: 'modal', headerShown: false }} />
</Stack.Navigator>Câu hỏi thường gặp
navigate trước tiên tìm màn hình hiện có với tên đó trong ngăn xếp và điều hướng đến nó nếu tìm thấy. push luôn thêm một màn hình mới lên đỉnh ngăn xếp, ngay cả khi đã tồn tại. push hữu ích khi bạn cần mở cùng một màn hình với dữ liệu khác nhau (ví dụ: hồ sơ người dùng).
Tham số được truyền làm đối số thứ hai của phương thức navigate: navigation.navigate('Profile', { userId: '123', name: 'John' }). Trên màn hình nhận, tham số có sẵn qua route.params. Kiểu tham số được định nghĩa trong RootStackParamList để tự động hoàn thành trong TypeScript.
Stack Navigator phù hợp cho điều hướng tuyến tính (màn hình → chi tiết → chỉnh sửa). Tab Navigator dành cho các phần song song của ứng dụng (Trang chủ, Tìm kiếm, Hồ sơ). Trong các dự án sản xuất, chúng được kết hợp: Tab Navigator chứa nhiều Stack Navigator cho mỗi tab.
Theo mặc định, Stack Navigator thêm nút «Quay lại» trong tiêu đề cho tất cả màn hình trừ màn hình gốc. Trên iOS, cử chỉ vuốt từ mép trái cũng hoạt động. Phương thức navigation.goBack() xoá màn hình hiện tại khỏi ngăn xếp và đưa người dùng trở lại màn hình trước đó.
Native Stack cung cấp hoạt ảnh được xác định trước: slide_from_right, fade, none. Để tuỳ chỉnh hoàn toàn, sử dụng JS Stack với cardStyleInterpolator — một hàm trả về kiểu thẻ trên mỗi khung hình hoạt ảnh. Điều này cho phép tạo bất kỳ chuyển tiếp nào: thu phóng, parallax, xoay 3D.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm