{"id":1854,"date":"2017-03-08T08:30:29","date_gmt":"2017-03-08T11:30:29","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/2017\/03\/08\/jsx-a-resposta-do-react-pra-resolver-definitivamente-um-problema\/"},"modified":"2017-03-08T08:30:29","modified_gmt":"2017-03-08T11:30:29","slug":"jsx-a-resposta-do-react-pra-resolver-definitivamente-um-problema","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2017\/03\/08\/jsx-a-resposta-do-react-pra-resolver-definitivamente-um-problema\/","title":{"rendered":"JSX, a resposta do React pra resolver definitivamente um problema"},"content":{"rendered":"<p><a href=\"https:\/\/medium.com\/@kewersonhugo\/christiano-milfont-voc%C3%AA-n%C3%A3o-chega-a-falar-sobre-o-jsx-mas-atualmente-com-o-template-literals-no-4a43c4a87073#.h8w6f2onx\" target=\"_blank\" rel=\"noopener noreferrer\">Uma pergunta<\/a> do <a href=\"https:\/\/medium.com\/@kewersonhugo\" target=\"_blank\" rel=\"noopener noreferrer\">Kewerson Hugo<\/a> no meu post &#8220;<a href=\"https:\/\/medium.com\/@milfont\/os-m%C3%BAsculos-do-javascript-be2b721851b7#.oxzah7kwx\" target=\"_blank\" rel=\"noopener noreferrer\">Os m\u00fasculos do Javascript<\/a>&#8221; me lembrou de escrever sobre algo que parece t\u00e3o simples, mas esconde nuances importantes que menosprezamos e deixamos de explicitar.<\/p>\n<figure>\n<p><img decoding=\"async\" data-width=\"789\" data-height=\"478\" src=\"https:\/\/cdn-images-1.medium.com\/max\/800\/1*6ssIAPFEhuMWkRN73TRn0Q.png\"><br \/>\n<\/figure>\n<p>Respondendo diretamente: <a href=\"https:\/\/developer.mozilla.org\/en\/docs\/Web\/JavaScript\/Reference\/Template_literals\" target=\"_blank\" rel=\"noopener noreferrer\">Template literals<\/a> s\u00f3 resolve interpola\u00e7\u00e3o de strings e nada mais.<\/p>\n<p>Em vez de fazer coisas como o primeiro c\u00f3digo, pode interpolar valores em uma string usando o <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Acento_grave\" target=\"_blank\" rel=\"noopener noreferrer\">acento grave<\/a> como marcador dessa string como pode ver no c\u00f3digo seguinte.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/cmilfont\/09b0623feaa3b6caaf1a01914747e3d4#file-template-concat-js\">https:\/\/gist.github.com\/cmilfont\/09b0623feaa3b6caaf1a01914747e3d4#file-template-concat-js<\/a><\/p>\n<h4>Engines de\u00a0Template<\/h4>\n<p>Desde 1990 quando o HTML foi criado que ningu\u00e9m tinha pensado (e se pensou n\u00e3o entregou) levar o XML pra dentro da linguagem para montar templates em vez do contr\u00e1rio como fizeram com PHP, JSP, ASP e todos os seguintes.<\/p>\n<p><a href=\"http:\/\/www.milfont.org\/tech\/2011\/09\/16\/qcon-sao-paulo-2011\/\" target=\"_blank\" rel=\"noopener noreferrer\">H\u00e1 alguns poucos anos eu palestrei uma Lightning Talk no QCONSP<\/a> sobre estrat\u00e9gias de engines de template em javascript.<\/p>\n<div class=\"embed-slideshare\"><iframe loading=\"lazy\" title=\"Engine de template em Javascript com HTML Sprites\" src=\"https:\/\/www.slideshare.net\/slideshow\/embed_code\/key\/dI2BnVj0o3sx0n\" width=\"427\" height=\"356\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" style=\"border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;\" allowfullscreen> <\/iframe> <\/p>\n<div style=\"margin-bottom:5px\"> <strong> <a href=\"https:\/\/www.slideshare.net\/cmilfont\/engine-de-template-em-javascript-com-html-sprites\" title=\"Engine de template em Javascript com HTML Sprites\" target=\"_blank\" rel=\"noopener noreferrer\">Engine de template em Javascript com HTML Sprites<\/a> <\/strong> from <strong><a href=\"https:\/\/www.slideshare.net\/cmilfont\" target=\"_blank\" rel=\"noopener noreferrer\">Milfont Consulting<\/a><\/strong> <\/div>\n<\/div>\n<p>J\u00e1 na \u00e9poca eu <a href=\"https:\/\/garann.github.io\/template-chooser\/\" target=\"_blank\" rel=\"noopener noreferrer\">contava mais de 20 existentes<\/a>, n\u00e3o importa que estrat\u00e9gia era, tudo se resumia a no fim das contas concatenar\/interpolar strings com estrat\u00e9gias mais elaboradas.<\/p>\n<h4>Templates n\u00e3o existem\u00a0mais<\/h4>\n<p>Em 2013 quando o React surgiu eu lembro de um grande amigo, <a href=\"https:\/\/twitter.com\/mozartdiniz\" target=\"_blank\" rel=\"noopener noreferrer\">Mozart Diniz<\/a>, me perguntar:<\/p>\n<p>&#8220;- Milfont, o que acha desse React?&#8221;<\/p>\n<p>E eu na minha ignor\u00e2ncia usando meus preconceitos, respondi:<\/p>\n<p>&#8220;- n\u00e3o vai dar em nada, idiotice&#8221;<\/p>\n<p>Como sempre o idiota sou eu e talvez por isso eu seja pobre, na hora o que me veio a mente foi <strong>Javascript Obstrutivo<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/72x72\/2122.png\" alt=\"&#x2122;\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/>.<\/strong><\/p>\n<h4>Interfaces Gr\u00e1ficas<\/h4>\n<p>Na pr\u00f3pria p\u00e1gina do JSX na documenta\u00e7\u00e3o do React eles s\u00e3o bem humild\u00f5es e dizem que \u00e9 apenas um <a href=\"https:\/\/facebook.github.io\/react\/docs\/jsx-in-depth.html\" target=\"_blank\" rel=\"noopener noreferrer\">assucar sint\u00e1tico para o React.createElement<\/a>.<\/p>\n<p>\u00c9 \u00f3bvio que JSX funciona muito bem com o Virtual-DOM, um assucar sint\u00e1tico pra montar a \u00e1rvore DOM virtual dentro da sua \u00e1rvore de componentes e usar uma linguagem ub\u00edqua falando e mostrando as mesmas estruturas pra ir modelando o mindset de &#8220;dados sempre da raiz pras folhas&#8221;, unidirecional, etc.<\/p>\n<p>Mas o que n\u00e3o percebemos at\u00e9 gastar algumas horas \u00e9 o qu\u00e3o maravilhoso \u00e9 esquecer de templates e considerar que XML agora \u00e9 uma extens\u00e3o bem vinda dentro da linguagem como cidad\u00e3o de primeira classe no Javascript.<\/p>\n<p>Atributo vira propriedade, tag vira classe na compila\u00e7\u00e3o, isso \u00e9 s\u00f3 mais uma sintaxe Javascript, baby!<\/p>\n<p>Se \u00e9 linguagem, eu posso escrever uma ferramenta que compile, analize, verifique, me notifique e complete c\u00f3digo.<\/p>\n<p><strong>Valores morais e boas pr\u00e1ticas<\/strong><\/p>\n<p>Como template n\u00e3o existe mais, o que temos \u00e9 um componente em uma linguagem que tanto devs quanto designers entendem (parcialmente pelo menos).<\/p>\n<p>Por isso <a href=\"http:\/\/produtoreativo.com.br\/cursos\/react\" target=\"_blank\" rel=\"noopener noreferrer\">bato muito no curso de React<\/a> sobre evitar trazer as m\u00e1s pr\u00e1ticas da \u00e9poca do template pra o JSX, c\u00f3digo como o seguinte \u00e9 f\u00e1cil de entender e talvez at\u00e9 o designer que n\u00e3o saiba programar consiga com algum esfor\u00e7o.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/cmilfont\/60e77f8c7836aed63f98e4dbdd30fcc0\">https:\/\/gist.github.com\/cmilfont\/60e77f8c7836aed63f98e4dbdd30fcc0<\/a><\/p>\n<p>Em vez disso, escreveria como o seguinte.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/cmilfont\/52026518d75b846c56d335ccbc484280\">https:\/\/gist.github.com\/cmilfont\/52026518d75b846c56d335ccbc484280<\/a><\/p>\n<p>Parece bobagem a primeira vista, mas \u00e9 civilizat\u00f3rio, acredite.<\/p>\n<p>Quando um c\u00f3digo em sintaxe XML cresce voc\u00ea decomp\u00f5e em sub-componentes e tenta evitar dentro da marca\u00e7\u00e3o ter algum fluxo em outra sintaxe, apenas demarca\u00e7\u00f5es.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/cmilfont\/a0b374345882f9d2aa6fbf93d3b10c9b\">https:\/\/gist.github.com\/cmilfont\/a0b374345882f9d2aa6fbf93d3b10c9b<\/a><\/p>\n<p>Os seus containers mais avan\u00e7ados com ciclo de vida se tornam tamb\u00e9m mais limpos e claros para todos os envolvidos no projeto.<\/p>\n<p>Eu n\u00e3o consigo mais trabalhar com HTML fora do meu c\u00f3digo Javascript.<\/p>\n<p>Uso <a href=\"https:\/\/www.jetbrains.com\/webstorm\/\" target=\"_blank\" rel=\"noopener noreferrer\">WebStorm<\/a> (com essa <a href=\"https:\/\/github.com\/ifahrentholz\/webstorm-snippets\" target=\"_blank\" rel=\"noopener noreferrer\">extens\u00e3o pra React<\/a>) e Atom (no Atom o <a href=\"https:\/\/nuclide.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Nuclide<\/a> e a extens\u00e3o <a href=\"https:\/\/orktes.github.io\/atom-react\/\" target=\"_blank\" rel=\"noopener noreferrer\">React<\/a> por causa dos snippets dele).<\/p>\n<p>Experimenta e me diz o que achou do JSX.<\/p>\n<p>Ah, com o Babel, seja Webpack ou Browserify, voc\u00ea consegue usar em qualquer projeto.<\/p>\n<hr \/>\n<p>Ah, pra quem se incomodou com <strong>assucar<\/strong> essa \u00e9 a grafia correta. Jornais antigos demonstram isso.<\/p>\n<figure>\n<p><img decoding=\"async\" data-width=\"1279\" data-height=\"208\" src=\"https:\/\/cdn-images-1.medium.com\/max\/2560\/1*Nd2hF-at0DK94koxJmU3bw.png\"><br \/>\n<\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Uma pergunta do Kewerson Hugo no meu post &#8220;Os m\u00fasculos do Javascript&#8221; me lembrou de escrever sobre algo que parece t\u00e3o simples, mas esconde nuances importantes que menosprezamos e deixamos de explicitar. Respondendo diretamente: Template literals s\u00f3 resolve interpola\u00e7\u00e3o de strings e nada mais. Em vez de fazer coisas como o primeiro c\u00f3digo, pode interpolar [&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\/1854"}],"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=1854"}],"version-history":[{"count":0,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1854\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=1854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=1854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=1854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}