# Guia informal do fulcro
Fulcro é uma biblioteca de Clojurescript para desenvolver interfaces.
Ele agrega algumas ações comuns do desenvolvimento de interfaces
- Renderiza a interface (em geral, via React)
- Administra o estado
- Adminsitra eventos
- Administra a obtenção de dados
Tudo isso de forma muito simples
Diferente de outras ferramentas que (prometem) fazer o mesmo, como Relay,
o fulcro sempre permite que a qualquer momento você transpasse ele e administre esses elementos manualmente
Vamos começar conhecendo os Componentes fulcro.
O componente fulcro tem 3 elementos principais:
- `:query`: Descreve com EQL quais dados aquele componente irá precisar
- `:ident`: (opcional) Diz qual atributo da `:query` pode ser usado para normalizar o dado
- render: O componente React
Montado na macro `defsc`, fica assim:
```clojure
(defsc LiTodo [app props]
{:query [:todo/id
:todo/text
:todo/done?]
:ident :todo/id}
(dom/li
(dom/p (:todo/text props))
(dom/button (if (:todo/done? props)
"✗""✔"))))
(def ui-li-todo (comp/factory LiRoot {:keyfn :todo/id}))
```
Quando vc escreve um componente, vc não precisa se preocupar com "de onde vem o dado", apenas em
"quais dados ele precisa"
O defsc retorna uma estrutura de dados do fulcro, com vários metadados e tal
Quando fazemos `comp/factory` do componente, o retorno é um componente react.
Para motivos de aprendizado, podemos montar esse componente numa aplicação simples
```clojure
(defsc Root [this props]
{:query []}
(dom/div
(ui-li-todo {:todo/id 42
:todo/text "Olá!"
:todo/done? false})))
(defn ^:export main
[]
(let [app (app/fulcro-app)]
(app/mount! Root "app")))
```
# Ident's
Os ident's do fulcro servem para normalizar o banco.
Quando vc faz um `(df/load app :todos/my-todos LiTodo)` será enviado uma query para o servidor no seguinte formato:
```
[{:todos/my-todos [:todo/id
:todo/text
:todo/done?]}]
```
Essa query deve retornar um dado com formato parecido com
```
{:todos/my-todos [{:todo/id 1
:todo/text "a"
:todo/done? false}
{:todo/id 2
:todo/text "b"
:todo/done? true}]}
```
Uma vez que `LiTodo` possui `:ident :todo/id`, o fulcro irá normalizar seus elementos via `:todo/id`
No "app-db", ficará assim:
```
:todos/my-todos [[:todo/id 1]
[:todo/id 2]]
:todo/id {1 {:todo/id 1
:todo/text "a"
:todo/done? false}
2 {:todo/id 2
:todo/text "b"
:todo/done? true}}
```