ref.current : Why is often null?
When working with React, especially when using refs, many developers run into this common issue:
"Why is
ref.currentnull even though I just attached it to a DOM element?"
Let’s clear up the confusion by understanding how React updates the UI in two distinct phases:
Render
Commit
Imagine React is like a builder and a Planner who building a house (your UI). It does it in two steps:
- Planning Phase (Render)
React (the architect) is planning:
“Where should the doors go?”
“Where should the windows be?”
But
The house isn’t build yet.
So if you try to “open a door” during this step, it won't work — it doesn’t exist yet!
This is like trying to access ref.current during rendering — it's either null or not correct yet.
- Building Phase (Commit)
Now React (the builder) actually builds:
Puts the doors, windows, roof, etc., in place.
Once the house is done, you can now open the door!
his is like after the DOM is built — your ref.current now points to the real thing.
Let’s visualise this steps:
[Render Phase] (Planning)
------------------------------------------------
| React runs your components |
| No DOM yet (just planning) |
| ref.current = null or old value |
------------------------------------------------
[Commit Phase] (Building)
------------------------------------------------
| React updates the DOM |
| - First, it clears old refs (null them out) |
| - Then, builds DOM elements |
| - Then, sets ref.current to new elements |
------------------------------------------------
That’s all for today. Feel free to share your thoughts or questions if you found this article helpful.