{"id":1862,"date":"2016-10-28T15:29:33","date_gmt":"2016-10-28T18:29:33","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/2016\/10\/28\/licoes-aprendidas-no-mundo-react\/"},"modified":"2016-10-28T15:29:33","modified_gmt":"2016-10-28T18:29:33","slug":"licoes-aprendidas-no-mundo-react","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2016\/10\/28\/licoes-aprendidas-no-mundo-react\/","title":{"rendered":"Li\u00e7\u00f5es aprendidas no mundo React"},"content":{"rendered":"<h4>Boas pr\u00e1ticas pra eu nunca\u00a0esquecer<\/h4>\n<p>Depois de longos meses ensinando, fazendo algumas consultorias, analisando e escrevendo c\u00f3digo em React, cheguei nesse conjunto de boas pr\u00e1ticas que escrevi num papel e fico me lembrando pra n\u00e3o errar:<\/p>\n<h3>Tudo \u00e9 componente<\/h3>\n<p>P\u00e1ra de pensar em p\u00e1gina, em template, em DOM e ter medo de acionar o render, isso n\u00e3o est\u00e1 manipulando DOM.<\/p>\n<p>At\u00e9 a manipula\u00e7\u00e3o de rotas \u00e9 apenas o <a href=\"https:\/\/github.com\/ReactTraining\/react-router\" target=\"_blank\" rel=\"noopener noreferrer\">comportamento de um componente<\/a> que est\u00e1 mais pr\u00f3ximo da raiz e utiliza o ciclo de vida dos componentes para reorganizar a \u00e1rvore.<\/p>\n<h3>Cada galho \u00e9 uma \u00e1rvore independente<\/h3>\n<p>Cada componente \u00e9 respons\u00e1vel por orquestrar seus filhos, mas n\u00e3o conhece o pai e nem seus irm\u00e3os, apenas troca mensagens por fun\u00e7\u00f5es recebidas no <strong><em>props<\/em><\/strong> que magicamente ele sabe que existe e deve acionar, mas n\u00e3o sabe o que faz.<\/p>\n<h3>Universos imut\u00e1veis<\/h3>\n<p>N\u00e3o ter medo de acionar o render \u00e9 manter o universo sempre num estado v\u00e1lido e <a href=\"https:\/\/facebook.github.io\/immutable-js\/\" target=\"_blank\" rel=\"noopener noreferrer\">imut\u00e1vel<\/a>, recomponha sempre sua \u00e1rvore e pense nela apenas.<\/p>\n<p>A sua interface gr\u00e1fica \u00e9 o que est\u00e1 no <strong><em>return<\/em><\/strong> do <strong><em>render<\/em><\/strong>, ela \u00e9 imut\u00e1vel, sem c\u00f3digo (sem scriptlet, apenas marca\u00e7\u00e3o) e deve sempre representar o estado do universo, n\u00e3o dados isolados.<\/p>\n<h3>S\u00f3 existe\u00a0const<\/h3>\n<p>P\u00e1ra de escrever <strong><em>let<\/em><\/strong> (bem, <strong><em>var<\/em><\/strong> voce j\u00e1 deve ou deveria ter parado). Quando voc\u00ea trabalha com universos imut\u00e1veis, a interface representa o estado dele e voc\u00ea n\u00e3o precisa de vari\u00e1veis, apenas de constantes.<\/p>\n<p>Dessa forma se mant\u00e9m o mais fiel poss\u00edvel \u00e0 imutabilidade. Pensa comigo, se tem necessidade de mudar um valor, n\u00e3o vai ser atribuindo diretamente na propriedade, \u00e9 reconstruindo o universo.<\/p>\n<h3>D\u00ea prefer\u00eancia a\u00a0Props<\/h3>\n<p>Tem casos que \u00e9 imposs\u00edvel (do tipo ainda n\u00e3o consegui Mindset necess\u00e1rio) deixar de usar o <strong><em>state<\/em><\/strong>, mas usar como regra sempre expor os dados em uma fonte read-only te mant\u00e9m na imutabilidade.<\/p>\n<h3>Centralize a fonte dos\u00a0dados<\/h3>\n<p>Flux \u00e9 o padr\u00e3o, mas o \u00fanico razo\u00e1vel pra manter o c\u00f3digo saud\u00e1vel dentro dessa abordagem \u00e9 o <a href=\"http:\/\/redux.js.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">redux<\/a>, foquemos nele.<\/p>\n<p>S\u00f3 vai existir uma \u00fanica fonte de dados que parte da raiz da sua \u00e1rvore que representa a aplica\u00e7\u00e3o inteira (dentro do poss\u00edvel).<\/p>\n<h3>Crie Buracos\u00a0Negros<\/h3>\n<p>Eu por exemplo que j\u00e1 enfrentei e enfrento integra\u00e7\u00f5es, tento minimizar isso criando pequenos universos que trocam informa\u00e7\u00f5es por meio do store. Caso tenha essa necessidade, acione uma outra \u00e1rvore apenas por meio do Provider dela.<\/p>\n<h3>Evite dados repetidos<\/h3>\n<p>N\u00e3o podem existir estados diferentes para um mesmo modelo em um universo imut\u00e1vel.<\/p>\n<h3>Concentre as mudan\u00e7as nas\u00a0Sagas<\/h3>\n<p>Existe apenas um D&#8217;us que pode interceder por v\u00f3s, n\u00e3o sei como ele \u00e9, mas deixou um local pra voc\u00ea concentrar sua ora\u00e7\u00f5es, realize as mudan\u00e7as de estado desse universo para cria\u00e7\u00e3o de um outro v\u00e1lido apenas no <a href=\"https:\/\/github.com\/yelouafi\/redux-saga\" target=\"_blank\" rel=\"noopener noreferrer\">redux-saga<\/a>.<\/p>\n<p>Na hora que estiver fazendo seus testes unit\u00e1rios se lembrar\u00e1 desse serm\u00e3o.<\/p>\n<h3>D\u00ea prefer\u00eancia a fun\u00e7\u00f5es\u00a0puras<\/h3>\n<p>Vai agradecer tamb\u00e9m quando estiver testando, \u00e9 mais f\u00e1cil manter imutabilidade em uma fun\u00e7\u00e3o que apenas representa uma interface que aciona outras functions conforme a intera\u00e7\u00e3o do usu\u00e1rio.<\/p>\n<p>Um detalhe especial pra decorators, eu aboli o uso por causa dos testes, \u00e9 muito trabalhoso mockar.<\/p>\n<h3>Finalizando<\/h3>\n<p>S\u00e3o boas pr\u00e1ticas mais abstratas, cada ferramenta tem tamb\u00e9m seu conjunto interno de boas pr\u00e1ticas, mais pesquisas se mostram necess\u00e1rias.<\/p>\n<p>Pra quem j\u00e1 trabalha\/estuda o mundo React esse texto far\u00e1 algum sentido, se mora em Fortaleza <a href=\"http:\/\/www.produtoreativo.com.br\/cursos\/react\" target=\"_blank\" rel=\"noopener noreferrer\">eu posso ajudar num curso presencial<\/a>\u00a0<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/72x72\/1f600.png\" alt=\"&#x1f600;\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Boas pr\u00e1ticas pra eu nunca\u00a0esquecer Depois de longos meses ensinando, fazendo algumas consultorias, analisando e escrevendo c\u00f3digo em React, cheguei nesse conjunto de boas pr\u00e1ticas que escrevi num papel e fico me lembrando pra n\u00e3o errar: Tudo \u00e9 componente P\u00e1ra de pensar em p\u00e1gina, em template, em DOM e ter medo de acionar o render, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1862"}],"collection":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/comments?post=1862"}],"version-history":[{"count":0,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1862\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=1862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=1862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=1862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}