Ever wonder why we use [my-component]
instead of (my-component)
. After all components are just functions, right? This blog post aims to address why we wrap a component name with []
instead of ()
. This is Clojure after all - where are the ()
?
The answer lies in how Reagent processes a Hiccup vector.
How Reagent Interprets Hiccup
(defn child []
[:h1 "WAAAAH"])
(defn parent []
[:div
[child]])
This is what Reagent is thinking when it encounters [child]
.
Hmm...
child
is not a valid symbol (e.g. :div, :img), which means thatchild
is a function. I shall call this function if I need to render. If you're curious about what makes a component re-render, check out this post.
If you're coming from a React background, this is the equivalent idea.
conts Child = () => <h1>Hello, world!</h1>
const Parent = () => {
return (
<div>
{Child()}
<Child />
</div>
)
}
It is true that both [fn]
and (fn)
will ultimately produce the same DOM just as it is the case that in React, it's the same outcome if we Fn()
vs <Fn/>
. But the key distinction is that []
does not force a render, whereas ()
does. Square brackets are efficient.
Here is a beautiful quote from Pratley's blog:
If our components called sub components directly, it would force them to always compute a result. We don't want that. Instead we leave the task of calling the component up to Reagent. Reagent will figure out when it needs to evaluate a component.
In React, use <>
. In Reagent, use []
. Simple as that.
Warmly,
DH
Top comments (0)