The reagent docs have this code example:
(defn lister [items]
[:ul
(for [item items]
^{:key item} [:li "Item " item])])
Can anyone explain the ^{:key item}
part to me? I know that it is adding the key attribute for a list in React, but I don't quite understand the Clojure/Reagent syntax part of how this is workingAh that makes sense. Thanks @lilactown and @noisesmith
Ah nice I always just passed it into the props
Any reason to prefer setting the meta data instead?
Not for html elements like :li. If you’re using a component you’ve defined, then you might not have a place to set those props. E.g. [some-component foo bar] In this case there’s no props map to pass a key to, so you’ll want to use metadata
ah right makes sense thanks
It seems like this is Reagent metadata?
It’s syntax for adding metadata to the vector being constructed
Reagent checks a few places for keys when converting a vector into a React element
One is props , so you could just pass in the key like any other prop
Another is metadata on the vector
to be clear, ^{:foo bar}
is vanilla clojure, and puts a metadata map onto a collection or symbol, but reagent has a special interpretation of specific metadata keys
^:foo
is often seen, it translates to ^{:foo true}
you can combine them
ins)cljs.user=> (def m ^:foo ^{:bar false} {})
#'cljs.user/m
(ins)cljs.user=> m
{}
(ins)cljs.user=> (meta m)
{:bar false, :foo true}
yeah I feel some of the docs are just outdated, thing is, when learning, it is hard to determine which thing is wrong
I want to use functional components by default because I use hooks a lot
The problem is that I use react-navigation and the screens need to be react components, so my root component needs to be reactified, it's a reagent component, then it uses navigators and screens from react-navigation that take react components as params
(defmacro defscreen
[name component]
`(def ~name
(reagent.core/reactify-component
(fn []
@app.navigation/cnt
[(fn []
~component)])
app.navigation/functional-compiler)))
(defmacro defroutes
[name navigator-creation-fn navigator]
(let [screen-class (gensym "screen-class")
navigator-class (gensym "navigator-class")]
`(def ~name
(let [[~navigator-class ~screen-class] (~navigator-creation-fn)]
(reagent.core/reactify-component
(fn []
(~navigator ~navigator-class ~screen-class))
app.navigation/functional-compiler)))))
Well, my guess would be that that specific one at least is not just outdated, it seems just plain wrong (as in: I have doubts Reagent ever behaved that way).
Ah that makes sense. Thanks @lilactown and @noisesmith
right, I meant, maybe it was correct at some point, otherwise it would not had been written (I want to think) haha
would be awesome to have some sort of build for the docs: if you use a piece of code as an example, should be extracted from a test suite or something
maybe once I learn the thing I should try doing something like that 🙂