Stacks keep covered screens mounted and tabs keep visited tabs mounted, which preserves scroll positions and input but lets hidden screens re-render when state they read changes. BookNest's cart tab logs its renders. Visiting the cart once, then adding Salt and Saffron three times from its book screen, gave by default:
LOG path: /book/3 LOG render Cart tab, 1 items LOG book screen, id = "3" LOG render Cart tab, 2 items LOG book screen, id = "3" LOG render Cart tab, 3 items LOG book screen, id = "3"
The cart was not visible, yet it rendered three times. With freezeOnBlur: true in the tab navigator's screenOptions (Stacks, Tabs, Drawers), the same taps logged only the book screen, and the cart rendered once, with 3 items, when its tab was opened again. Freezing uses React 7,897 Suspense, through react-freeze (https://github.com/software-mansion/react-freeze 1,654 ), to hold back a hidden screen's updates. On the root stack the same option did not stop these renders, so measure where you apply it. Other levers:
Native stack over JS stack. Stack and native-stack use the platform's own transitions; the JavaScript stacks animate with the Animated API, which is more customizable but less native.
Lazy tabs. Tabs render on first visit by default (lazy: true); keep it unless a tab must be ready instantly.
Defer work. Start a screen's expensive work in useFocusEffect or after the transition (Performance Optimization).
Prefetch. <Link href="/book/3" prefetch> renders the target screen before the tap.