In day-to-day development, comparing React Native navigation solutions comes up more and more often. This article systematically walks through their usage, internals, and optimization strategies.
Quick Start
In real projects the usage gets a bit more involved:
javascript
import { useRef, useEffect, useState } from 'react'
function useIntersectionObserver(options = {}) {
const [isVisible, setIsVisible] = useState(false)
const ref = useRef(null)
useEffect(() => {
const observer = new IntersectionObserver(([entry]) => {
setIsVisible(entry.isIntersecting)
}, { threshold: 0.1, ...options })
const el = ref.current
if (el) observer.observe(el)
return () => { if (el) observer.unobserve(el) }
}, [])
return [ref, isVisible]
}
This approach improves both the testability and extensibility of the code.
Internal Principles
Here is a complete example:
javascript
import { useReducer, useCallback } from 'react'
const initialState = { items: [], filter: '', sort: 'date' }
function reducer(state, action) {
switch (action.type) {
case 'SET_ITEMS': return { ...state, items: action.payload }
case 'SET_FILTER': return { ...state, filter: action.payload }
case 'ADD_ITEM': return { ...state, items: [...state.items, action.payload] }
case 'REMOVE_ITEM': return { ...state, items: state.items.filter(i => i.id !== action.payload) }
default: throw new Error(`Unknown: ${action.type}`)
}
}
Pay close attention to edge-case handling — that is critical in production.
Business Practice
The key is to understand the core logic:
javascript
import { useState, useEffect, useCallback } from 'react'
function DataList({ endpoint, pageSize = 20 }) {
const [data, setData] = useState([])
const [page, setPage] = useState(1)
const [loading, setLoading] = useState(false)
const fetchData = useCallback(async () => {
setLoading(true)
try {
const res = await fetch(`${endpoint}?page=${page}&size=${pageSize}`)
setData(await res.json())
} finally { setLoading(false) }
}, [endpoint, page, pageSize])
useEffect(() => { fetchData() }, [fetchData])
return <div>{loading ? <Spinner /> : <List items={data} />}</div>
}
Performance tuning has to fit the actual scenario; not every case needs over-optimization.
Performance Comparison
Here are a few ways we can improve on this:
javascript
import React, { useState, useCallback } from 'react'
import { View, Text, FlatList, TouchableOpacity, StyleSheet } from 'react-native'
const ItemList = ({ data, onRefresh }) => {
const [refreshing, setRefreshing] = useState(false)
const handleRefresh = useCallback(async () => {
setRefreshing(true)
await onRefresh()
setRefreshing(false)
}, [onRefresh])
const renderItem = useCallback(({ item }) => (
<TouchableOpacity style={styles.item}>
<Text style={styles.title}>{item.title}</Text>
</TouchableOpacity>
), [])
return (
<FlatList data={data} renderItem={renderItem}
keyExtractor={item => item.id}
refreshing={refreshing} onRefresh={handleRefresh} />
)
}
This approach has been running stably in production for over half a year, so it is battle-tested.
Summary
- Understanding the fundamentals matters more than memorizing APIs.
- Always verify compatibility before shipping to production.
- In team collaboration, conventions and documentation matter more than the tech itself.
- Keep an eye on the community — technical solutions need to keep evolving.
- Don't adopt new tech just for its own sake.
