Back to Sanity

Defer State Reads to Usage Point

.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md

5.24.0787 B
Original Source

Defer State Reads to Usage Point

Don't subscribe to dynamic state (searchParams, localStorage) if you only read it inside callbacks.

Incorrect (subscribes to all searchParams changes):

tsx
function ShareButton({chatId}: {chatId: string}) {
  const searchParams = useSearchParams()

  const handleShare = () => {
    const ref = searchParams.get('ref')
    shareChat(chatId, {ref})
  }

  return <button onClick={handleShare}>Share</button>
}

Correct (reads on demand, no subscription):

tsx
function ShareButton({chatId}: {chatId: string}) {
  const handleShare = () => {
    const params = new URLSearchParams(window.location.search)
    const ref = params.get('ref')
    shareChat(chatId, {ref})
  }

  return <button onClick={handleShare}>Share</button>
}