Prevent Unnecessary Re-renders from Unstable References
Share
Inline objects, arrays, and functions as props create new references every render, defeating React.memo and causing cascading re-renders across the tree.
Why This Matters
eliminates cascading re-renders that degrade Core Web Vitals and interaction responsiveness
Prevent Unnecessary Re-renders from Unstable References
Impact: HIGH (eliminates cascading re-renders that degrade Core Web Vitals and interaction responsiveness)
React re-renders a component whenever its parent re-renders or its props change. Props are compared by reference, not by value. This means inline objects (style={{}}), inline arrays (items={[]}), and inline functions (onClick={() => {}}) create new references every render — even if the values are identical — triggering re-renders in every child component.
This is the root cause of most "my React app is slow" complaints.
Incorrect (new references every render):
'use client'function Dashboard({ userId }: { userId: string }) { const [count, setCount] = useState(0) return ( <div> <button onClick={() => setCount(c => c + 1)}>Click: {count}</button> {/* ❌ Every click re-renders ALL of these children */} <UserProfile style={{ padding: 16, margin: 8 }} // New object every render options={['edit', 'delete', 'share']} // New array every render onAction={(action) => handleAction(action)} // New function every render /> <ActivityFeed filters={{ userId, limit: 20 }} /> // New object every render <Sidebar config={{ theme: 'dark', collapsed: false }} /> </div> )}
// ❌ Context value creates a new object every render → all consumers re-renderfunction AppProvider({ children }) { const [user, setUser] = useState(null) const [theme, setTheme] = useState('light') return ( <AppContext.Provider value={{ user, setUser, theme, setTheme }}> {children} </AppContext.Provider> )}
// ✅ Split contexts by update frequency — state that changes together stays togetherconst UserContext = createContext<{ user: User | null; setUser: SetState }>()const ThemeContext = createContext<{ theme: string; setTheme: SetState }>()// Now changing theme doesn't re-render components that only use user