# 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}}
    ```