Stack Navigator — คอมโพเนนต์ของไลบรารี React Navigation สำหรับจัดการหน้าจอของแอปพลิเคชันมือถือตามหลักการสแต็ก (LIFO) แต่ละหน้าจอใหม่จะถูกวางไว้ด้านบนของหน้าจอก่อนหน้า และปุ่ม «ย้อนกลับ» จะลบหน้าจอด้านบนออกและนำผู้ใช้กลับไปยังหน้าจอก่อนหน้า อ่านเพิ่มเติมเกี่ยวกับสถาปัตยกรรมการนำทางได้ใน เอกสารทางการของ React Navigation
ประเด็นสำคัญ
Stack Navigator — หนึ่งในเนวิเกเตอร์พื้นฐานของไลบรารี React Navigation ที่ใช้โมเดลสแต็กของหน้าจอ ให้การนำทางที่ผู้ใช้มือถือคุ้นเคย: การเปิดหน้าจอใหม่มาพร้อมกับแอนิเมชันเลื่อนไปทางขวา และปุ่ม «ย้อนกลับ» หรือท่าทางปัดจะนำผู้ใช้กลับไปยังหน้าจอก่อนหน้า Stack Navigator รองรับ iOS และ Android โดยใช้คอมโพเนนต์เนทีฟของแพลตฟอร์มเพื่อประสิทธิภาพสูงสุด
React Navigation เป็นไลบรารีการนำทางที่ได้รับความนิยมมากที่สุดสำหรับ React Native ติดตั้งใน 85% ของโปรเจกต์ (ตามข้อมูล npm, 2026) Stack Navigator เป็นส่วนหนึ่งของแกนกลางและมีให้ใช้งานในสองรูปแบบ: createNativeStackNavigator (เนทีฟ, แนะนำ) และ createStackNavigator (JavaScript, สำหรับแอนิเมชันแบบกำหนดเองที่ซับซ้อน) เวอร์ชันเนทีฟปรากฏใน React Navigation v5 และกลายเป็นมาตรฐานใน v6+
ข้อได้เปรียบหลักของ Stack Navigator — พฤติกรรมที่เป็นธรรมชาติซึ่งผู้ใช้ iOS และ Android คุ้นเคย บน iOS สแต็กจะแสดงผลด้วย UINavigationController บน Android — ด้วย FragmentManager พร้อมแอนิเมชันเลื่อน นักพัฒนาไม่จำเป็นต้องใช้ตรรกะสแต็กด้วยตนเอง — เนวิเกเตอร์จะจัดการสถานะหน้าจอ สแต็กย้อนกลับ และแอนิเมชันโดยอัตโนมัติ
การนำทางแบบสแต็ก ขึ้นอยู่กับหลักการ LIFO (Last In, First Out) เมื่อผู้ใช้เปิดหน้าจอใหม่ เนวิเกเตอร์จะวางไว้ที่ด้านบนของสแต็ก เมื่อกด «ย้อนกลับ» หน้าจอด้านบนจะถูกลบออกและผู้ใช้จะเห็นหน้าจอก่อนหน้า สแต็กสามารถบรรจุหน้าจอได้จำนวนเท่าใดก็ได้ — ข้อจำกัดเพียงอย่างเดียวคือหน่วยความจำของอุปกรณ์
แต่ละหน้าจอในสแต็กจะคงสถานะไว้ เมื่อกลับไปยังหน้าจอก่อนหน้า สถานะจะถูกกู้คืนโดยอัตโนมัติ สิ่งนี้ทำให้สแต็กแตกต่างจากการนำทางประเภทอื่น (Tab, Drawer) ซึ่งหน้าจออาจถูกสร้างขึ้นใหม่ React Navigation จัดการสถานะผ่านกลไกบริบทการนำทางของตัวเอง
| การกระทำ | ผลลัพธ์ | ตัวอย่าง |
|---|---|---|
| navigate | วางหน้าจอไว้ที่ด้านบนของสแต็ก | navigation.navigate('Profile') |
| goBack | ลบหน้าจอด้านบนออกจากสแต็ก | navigation.goBack() |
| push | เพิ่มหน้าจอใหม่แบบบังคับ | navigation.push('Profile') |
| popToTop | กลับไปยังหน้าจอรูท | navigation.popToTop() |
| reset | แทนที่สแต็กทั้งหมดด้วยชุดใหม่ | navigation.reset({ index: 0, routes: [...] }) |
บน iOS Stack Navigator รองรับท่าทางปัดจากขอบซ้ายเพื่อกลับไป — นี่คือพฤติกรรมมาตรฐานของ iOS ที่ผู้ใช้คาดหวัง บน Android ท่าทางจะถูกปิดใช้งานตามค่าเริ่มต้น แต่สามารถเปิดใช้งานได้ผ่านตัวเลือก gestureEnabled ใน Native Stack ท่าทางจะทำงานแบบเนทีฟโดยไม่มีความล่าช้าของเธรด JavaScript
React Navigation มี Stack Navigator สองประเภท: Native Stack (createNativeStackNavigator) และ JS Stack (createStackNavigator) ความแตกต่างหลัก — ตำแหน่งที่แอนิเมชันทำงาน Native Stack ใช้ไดรเวอร์แอนิเมชันเนทีฟของ iOS และ Android ในขณะที่ JS Stack ทำงานผ่านเธรด JavaScript ของ React Native การเลือกระหว่างทั้งสองขึ้นอยู่กับข้อกำหนดด้านประสิทธิภาพและการปรับแต่ง
Native Stack แนะนำสำหรับโปรเจกต์ส่วนใหญ่ ให้แอนิเมชัน 60 FPS ที่ราบรื่นโดยไม่บล็อกเธรด JS รองรับท่าทางปัดกลับของระบบบน iOS และใช้การเปลี่ยนภาพแบบเนทีฟ — slide บน iOS, fade บน Android อย่างไรก็ตาม Native Stack มีข้อจำกัดในการปรับแต่งแอนิเมชัน: มีเฉพาะชุดการเปลี่ยนภาพที่กำหนดไว้ล่วงหน้าเท่านั้น
JS Stack ให้การควบคุมแอนิเมชันอย่างสมบูรณ์ผ่าน cardStyleInterpolator นักพัฒนาสามารถสร้างแอนิเมชันใดก็ได้: การย่อ/ขยาย การหมุน พาราแลกซ์ เส้นโค้งที่กำหนดเอง ข้อเสีย — แอนิเมชันทำงานในเธรด JS ซึ่งอาจทำให้เฟรมดร็อปบนอุปกรณ์ที่อ่อนแอด้วยการเปลี่ยนภาพที่ซับซ้อน สำหรับ 70% ของโปรเจกต์ Native Stack ก็เพียงพอแล้ว
// Native Stack — การใช้งานที่แนะนำ
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>
);
}ในการเริ่มต้นใช้งาน Stack Navigator จำเป็นต้องติดตั้ง React Navigation และ dependencies ของมัน ชุดขั้นต่ำประกอบด้วย @react-navigation/native, @react-navigation/native-stack และ react-native-screens หลังการติดตั้ง แอปพลิเคชันจะถูกห่อด้วย NavigationContainer — บริบทที่ให้สถานะการนำทางแก่คอมโพเนนต์ลูกทั้งหมด
# การติดตั้ง dependencies ของ React Navigation
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context
# สำหรับ iOS — การติดตั้ง pod
cd ios && pod install && cd ..หลังการติดตั้ง Stack.Navigator จะถูกสร้างขึ้นพร้อมกับหน้าจอเฉพาะที่กำหนดใน RootStackParamList แต่ละหน้าจอเชื่อมโยงกับคอมโพเนนต์ React ผ่าน prop component เนวิเกเตอร์สามารถเป็นรูทหรือซ้อนอยู่ภายในเนวิเกเตอร์อื่น (Tab, Drawer) สำหรับการกำหนดค่า ใช้ screenOptions — ร่วมกันสำหรับทุกหน้าจอหรือแยกสำหรับแต่ละหน้าจอ
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: 'หน้าแรก' }} />
<Stack.Screen name="Details" component={DetailsScreen}
options={({ route }) => ({ title: route.params.title })} />
</Stack.Navigator>
</NavigationContainer>
);
}Stack Navigator มีตัวเลือกมากมายสำหรับปรับแต่งลักษณะและพฤติกรรม พารามิเตอร์หลักถูกกำหนดผ่าน screenOptions ที่ระดับ Navigator หรือ options ที่ระดับ Screen นักพัฒนาสามารถกำหนดค่าส่วนหัว แอนิเมชันการเปลี่ยนภาพ ท่าทางปัด สไตล์การ์ด และการทำให้พื้นหลังมืดลง ความยืดหยุ่นของการตั้งค่าช่วยให้ปรับการนำทางให้เข้ากับระบบออกแบบของแอปพลิเคชัน
| ตัวเลือก | ชนิด | คำอธิบาย |
|---|---|---|
| headerShown | boolean | แสดงหรือซ่อนส่วนหัวของหน้าจอ |
| headerStyle | object | สไตล์แถบส่วนหัว (backgroundColor, elevation) |
| headerBackTitle | string | ข้อความปุ่ม «ย้อนกลับ» (iOS) |
| gestureEnabled | boolean | เปิดใช้งานท่าทางปัดกลับ |
| animation | string | ชนิดแอนิเมชัน: slide_from_right, fade, none |
| contentStyle | object | สไตล์พื้นที่ภายในของหน้าจอ |
สำหรับ JS Stack cardStyleInterpolator อนุญาตให้สร้างแอนิเมชันการเปลี่ยนภาพตามต้องการระหว่างหน้าจอ เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการใช้เอฟเฟกต์ภาพที่ไม่ซ้ำใคร: การย่อ/ขยาย การหมุน พาราแลกซ์ การพลิกแนวนอน ฟังก์ชันรับค่าความคืบหน้าแอนิเมชันปัจจุบัน (current, next) และส่งคืนสไตล์สำหรับองค์ประกอบที่กำลังเคลื่อนไหว
Stack Navigator รองรับการกำหนดชนิดอย่างสมบูรณ์ผ่าน TypeScript โดยกำหนด RootStackParamList — ชนิดออบเจกต์ที่คีย์เป็นชื่อหน้าจอและค่าเป็นชนิดพารามิเตอร์ หลังจากกำหนดชนิดแล้ว navigation.navigate และ route.params จะได้รับการเติมข้อความอัตโนมัติและการตรวจสอบชนิด ซึ่งช่วยลดข้อผิดพลาดในการส่งพารามิเตอร์ในเวลาคอมไพล์
type RootStackParamList = {
Home: undefined;
Product: { id: string; category: string };
Checkout: { items: CartItem[]; total: number };
};
// หน้าจอที่กำหนดชนิด
type ProductScreenProps = NativeStackScreenProps<RootStackParamList, 'Product'>;
function ProductScreen({ navigation, route }: ProductScreenProps) {
const { id, category } = route.params;
return (
<View>
<Text>สินค้า {id} — {category}</Text>id} — {category}</Text>
<Button title="เพิ่มในตะกร้า"
onPress={() => navigation.navigate('Checkout', {
items: [{ id, quantity: 1 }],
total: 99.99,
})} />
</View>
);
}Stack Navigator รองรับการจัดกลุ่มหน้าจอและหน้าต่างโมดอล กลุ่ม (Screen Group) อนุญาตให้ใช้การตั้งค่าร่วมกันกับหลายหน้าจอโดยไม่ซ้ำกัน หน้าต่างโมดอลถูกใช้งานผ่าน stack presentation: 'modal' — หน้าจอเปิดจากด้านล่างพร้อมการทำให้พื้นหลังมืดลง เช่น โมดอลระบบบน iOS ตัวเลือกนี้ใช้ได้เฉพาะใน Native Stack
สำหรับการนำทางที่ซับซ้อน Stack Navigator สามารถซ้อนอยู่ภายใน Tab Navigator หรือ Drawer Navigator ตัวอย่างเช่น แท็บ «หน้าแรก» มีสแต็กหน้าจอของตัวเอง และแท็บ «โปรไฟล์» มีของตัวเอง การประกอบเนวิเกเตอร์นี้เป็นแนวทางมาตรฐานสำหรับแอปพลิเคชันในระดับโปรดักชัน แต่ละสแต็กถูกแยกออกจากกัน: สแต็กย้อนกลับภายในแท็บหนึ่งไม่มีผลต่อแท็บอื่น
// สแต็กที่ซ้อนใน 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>
);
}
// กลุ่มหน้าจอที่มีตัวเลือกร่วมกัน
<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>คำถามที่พบบ่อย
navigate จะค้นหาหน้าจอที่มีอยู่แล้วในสแต็กก่อนและนำทางไปยังหน้านั้นหากพบ push จะเพิ่มหน้าจอใหม่ที่ด้านบนของสแต็กเสมอ แม้ว่าจะมีอยู่แล้วก็ตาม push มีประโยชน์เมื่อคุณต้องการเปิดหน้าจอเดียวกันกับข้อมูลที่แตกต่างกัน (เช่น โปรไฟล์ผู้ใช้)
พารามิเตอร์จะถูกส่งเป็นอาร์กิวเมนต์ที่สองของเมธอด navigate: navigation.navigate('Profile', { userId: '123', name: 'John' }) บนหน้าจอผู้รับ พารามิเตอร์สามารถเข้าถึงได้ผ่าน route.params ชนิดพารามิเตอร์ถูกกำหนดใน RootStackParamList สำหรับการเติมข้อความอัตโนมัติใน TypeScript
Stack Navigator เหมาะสำหรับการนำทางแบบเส้นตรง (หน้าจอ → รายละเอียด → แก้ไข) Tab Navigator สำหรับส่วนขนานของแอปพลิเคชัน (หน้าแรก, ค้นหา, โปรไฟล์) ในโปรเจกต์ระดับโปรดักชัน จะรวมกัน: Tab Navigator มี Stack Navigator หลายตัวสำหรับแต่ละแท็บ
ตามค่าเริ่มต้น Stack Navigator จะเพิ่มปุ่ม «ย้อนกลับ» ในส่วนหัวสำหรับหน้าจอทั้งหมดยกเว้นหน้าจอรูท บน iOS ท่าทางปัดจากขอบซ้ายก็ทำงานเช่นกัน เมธอด navigation.goBack() จะลบหน้าจอปัจจุบันออกจากสแต็กและนำผู้ใช้กลับไปยังหน้าจอก่อนหน้า
Native Stack มีแอนิเมชันที่กำหนดไว้ล่วงหน้า: slide_from_right, fade, none สำหรับการปรับแต่งอย่างสมบูรณ์ ใช้ JS Stack ร่วมกับ cardStyleInterpolator — ฟังก์ชันที่ส่งคืนสไตล์การ์ดในแต่ละเฟรมของแอนิเมชัน ซึ่งช่วยให้สร้างการเปลี่ยนภาพใดก็ได้: การย่อ/ขยาย พาราแลกซ์ การหมุน 3D
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม