React Native ์ฑ์์
ํ๋จ ํญ ๋ค๋น๊ฒ์ด์
(Bottom Tabs) ๊ตฌ์กฐ๋ ๊ฑฐ์ ๊ธฐ๋ณธ์ด๋ผ๊ณ ํ ์ ์๋ค.
ํ์ง๋ง ํญ ๊ฐ ์ด๋์ ํ๋ค ๋ณด๋ฉด ์ด๋ฐ ๋ฌธ์ ๊ฐ ์๊ธด๋ค:
์ด๋ฒ ๊ธ์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ
React Navigation์ ๊ตฌ์กฐ + ์ํ๊ด๋ฆฌ ์กฐํฉ ์ ๋ต์ ๋ค๋ฃฌ๋ค.
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
const Tab = createBottomTabNavigator();
function MainTabs() {
return (
<Tab.Navigator>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Profile" component={ProfileScreen} />
</Tab.Navigator>
);
}
โ
ํ๋จ ํญ ๊ตฌ์กฐ ๊ธฐ๋ณธ ๊ตฌํ
โ
๊ฐ ํญ์ ๋
๋ฆฝ๋ ์คํ์ฒ๋ผ ์๋
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ํญ์ ๋ ๋๋ง ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํ์ง๋ง,
๊ฐํน ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ํ๋ฉด์ด ์ด๊ธฐํ๋๋ค:
unmountOnBlur: true
์ค์ ์ ๊ณตํต๋ ์ํ๋ Zustand๋ Context๋ก ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๋ฉด
ํญ ๊ฐ ์ด๋๊ณผ ๊ด๊ณ์์ด ์ํ๊ฐ ์ ์ง๋๋ค.
const useFeedStore = create((set) => ({
posts: [],
setPosts: (posts) => set({ posts }),
}));
unmountOnBlur: false
<Tab.Screen
name="Feed"
component={FeedScreen}
options={{ unmountOnBlur: false }}
/>
function FeedStack() {
return (
<Stack.Navigator>
<Stack.Screen name="FeedList" component={FeedList} />
<Stack.Screen name="FeedDetail" component={FeedDetail} />
</Stack.Navigator>
);
}
<Tab.Navigator>
<Tab.Screen name="Feed" component={FeedStack} />
</Tab.Navigator>
โ
์ค๋ฌด์์๋ ๊ฑฐ์ ํ์์ ์ธ ๊ตฌ์กฐ
โ
ํญ๋ง๋ค ๋
๋ฆฝ์ ์ธ ํ๋ฉด ํ๋ฆ ๊ตฌ์ฑ ๊ฐ๋ฅ
์ํฉ | ํด๊ฒฐ ๋ฐฉ๋ฒ |
---|---|
ํญ ์ด๋ ์ ํ๋ฉด ์ด๊ธฐํ๋จ | unmountOnBlur: false |
ํญ ๊ฐ ์ํ ๊ณต์ | Zustand, Context |
ํญ ์์ ์์ธ ํ์ด์ง ๊ตฌ์ฑ | Stack ์ค์ฒฉ |
์ํ ์ด๊ธฐํ๊ฐ ํ์ํ ๋? | useFocusEffect() ๋ก ์๋์ ์ด๊ธฐํ ์ฒ๋ฆฌ |
์ฒ์์๋ ํญ ํ๋ฉด์ด ๋ค์ ๋ ๋๋ง๋๋ ๊ฑธ ๋ณด๊ณ โ๋ฒ๊ทธ์ธ๊ฐ?โ ์ถ์๋๋ฐ,
์ค์ ํ๋๋ก ์ ์ง ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ง๋ค๋ ๊ฑธ ์๊ณ ๋์
์๋์ ์ผ๋ก ์ด๊ธฐํํ ๋์ ์ ์งํ ๋๋ฅผ ๋ถ๋ฆฌํด์ ์ค๊ณํ๊ฒ ๋๋ค.
์ง๊ธ์ Zustand
๋ก ํญ ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ,
unmountOnBlur
๋ก ํ๋ฉด ์ด๊ธฐํ ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ฉด์
UX์ ํผํฌ๋จผ์ค ๋ ๋ค ์ฑ๊ธฐ๊ณ ์๋ค.
๐งญ โํญ ๊ฐ ์ด๋์ ๋จ์ํ UI๊ฐ ์๋๋ผ, ์ฌ์ฉ์ ํ๋ฆ์ ์ค์ฌ์ด๋ค.โ