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