{"id":2679,"date":"2020-04-10T17:29:42","date_gmt":"2020-04-10T20:29:42","guid":{"rendered":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/?p=2679"},"modified":"2025-09-02T15:06:02","modified_gmt":"2025-09-02T18:06:02","slug":"flux-arquitetura-para-desenvolvimentos-de-aplicacoes-web","status":"publish","type":"post","link":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/2020\/04\/10\/flux-arquitetura-para-desenvolvimentos-de-aplicacoes-web","title":{"rendered":"Flux: Arquitetura para desenvolvimentos de aplica\u00e7\u00f5es web"},"content":{"rendered":"\n<section id=\"h.5e466c2fc68333b0_12\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_9\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">No PET-Reda\u00e7\u00e3o dessa semana, vamos tentar entender a arquitetura Flux, comparando-a com o famigerado MVC. Ent\u00e3o pega o teu caf\u00e9 e nos acompanha nessa reda\u00e7\u00e3o descontra\u00edda.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Flux \u00e9 a arquitetura que o Facebook criou para melhorar o desenvolvimento de aplica\u00e7\u00f5es\u00a0<em>web<\/em><em><strong>\u00a0<\/strong><\/em>nos tempos modernos. Mas antes de entrarmos no assunto, temos que entender o porqu\u00ea da exist\u00eancia dessa arquitetura e como ela facilita o desenvolvimento de aplica\u00e7\u00f5es.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Antes de utilizar o Flux, o Facebook utilizava o MVC, a arquitetura mais famosa e conceituada quando o assunto \u00e9 desenvolvimento de aplica\u00e7\u00f5es. Essa fama vem da separa\u00e7\u00e3o de interesses que essa arquitetura oferece de forma a otimizar a compreens\u00e3o e escrita de c\u00f3digo. S\u00f3 que, como tudo na vida, o MVC n\u00e3o \u00e9 s\u00f3 flores, e um dos aspectos negativos \u00e9 a complexidade que a aplica\u00e7\u00e3o toma quando pensamos em escalabilidade. Ou seja, para aplica\u00e7\u00f5es menores, com meia d\u00fazia de funcionalidades, o MVC serve muito bem. Mas para pra pensar, quantas funcionalidades tem o Facebook? Tem o sistema de chat (Messenger), posts, grupos, galeria de fotos e v\u00eddeos,\u00a0<em>stories<\/em>, eventos, servi\u00e7os de\u00a0<em>streaming<\/em>, etc. Agora vamos tentar imaginar um cen\u00e1rio em que isso est\u00e1 modelado em cima do MVC.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_16\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-R6PoUb JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-EehZO purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_13\" class=\"hJDwNd-AhqUyc-EehZO jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter wp-image-2790 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux1.jpg\" alt=\"\" width=\"745\" height=\"417\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux1.jpg 745w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux1-300x168.jpg 300w\" sizes=\"(max-width: 745px) 100vw, 745px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-R6PoUb JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_20\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_17\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">\u00c9 praticamente imposs\u00edvel identificar alguma anomalia em um diagrama nesse estado. E se existe um loop infinito nessas comunica\u00e7\u00f5es, como vamos saber a partir desse diagrama? Foi por conta disso que o Facebook criou o Flux para tentar resolver esses tipos de problemas.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Como eu falei anteriormente, o Flux \u00e9 uma arquitetura para o desenvolvimento de aplica\u00e7\u00f5es\u00a0<em>web<\/em>\u00a0com o prop\u00f3sito de evitar a comunica\u00e7\u00e3o amb\u00edgua que existe entre as\u00a0<em>views<\/em>\u00a0e os\u00a0<em>models<\/em>, ou seja, criar um fluxo de dados unidirecional.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">A arquitetura \u00e9 dividida nas seguintes camadas:<\/p>\n<ul class=\"n8H08c UVNKR\">\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><strong><em>Actions<\/em><\/strong>: s\u00e3o objetos contendo o identificador do elemento que queremos mudar e a informa\u00e7\u00e3o que ser\u00e1 atualizada no <em>store<\/em>;<\/p>\n<\/li>\n<\/ul>\n<ul class=\"n8H08c UVNKR\">\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><strong><em>Dispatcher<\/em><\/strong>: funciona como o controlador do tr\u00e1fego que entra na aplica\u00e7\u00e3o, gerenciando as <em>actions<\/em> que entram no sistema;<\/p>\n<\/li>\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><strong><em>Store<\/em><\/strong>: serve como a camada de dados que atualiza cada vez que uma a\u00e7\u00e3o \u00e9 realizada;<\/p>\n<\/li>\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><strong><em>Views<\/em><\/strong>: que \u00e9 a camada de visualiza\u00e7\u00e3o e realiza a re-renderiza\u00e7\u00e3o cada vez que o <em>store<\/em> muda de estado.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_24\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-R6PoUb JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-EehZO purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_21\" class=\"hJDwNd-AhqUyc-EehZO jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img decoding=\"async\" class=\"aligncenter wp-image-2791 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux2.jpg\" alt=\"\" width=\"739\" height=\"418\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux2.jpg 739w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux2-300x170.jpg 300w\" sizes=\"(max-width: 739px) 100vw, 739px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-R6PoUb JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_28\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_25\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Com o diagrama fica mais f\u00e1cil de ver o fluxo de dados. Ainda, \u00e9 poss\u00edvel enviar uma\u00a0<em>action<\/em>\u00a0a partir da\u00a0<em>view<\/em>, acionando o\u00a0<em>dispatcher<\/em>\u00a0para receber essa a\u00e7\u00e3o.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Deu pra perceber que o\u00a0<em>Dispatcher<\/em>\u00a0\u00e9 o cora\u00e7\u00e3o dessa arquitetura, n\u00e9? Ele acaba sendo a parte mais importante da arquitetura na medida em que a aplica\u00e7\u00e3o cresce, pois \u00e9 respons\u00e1vel por todo o gerenciamento das a\u00e7\u00f5es e das depend\u00eancias que essas geram na camada de dados.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Implementando essa arquitetura, eu consigo lembrar de dois exemplos que est\u00e3o sendo bastante visados no mercado de trabalho, o React,\u00a0<em>framework<\/em>\u00a0de c\u00f3digo aberto que hoje \u00e9 mantido pelo Facebook, e o Vue, outro\u00a0<em>framework<\/em>\u00a0de c\u00f3digo aberto que \u00e9 mantido pela comunidade. Essas ferramentas t\u00eam um sistema de &#8220;gerenciamento de estados&#8221; que utiliza a arquitetura Flux. Para o React, esse sistema se chama Redux, e no Vue, ele \u00e9 chamado de Vuex.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Essas duas bibliotecas implementam o Flux de forma a otimizar o fluxo de dados, diminuindo a troca de mensagens entre o cliente e o servidor, e a escrita de c\u00f3digo, criando uma camada exclusiva para os dados precisam ser persistidos em v\u00e1rias camadas do sistema.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">No Redux, n\u00e3o temos a camada do\u00a0<em>Dispatcher<\/em>, pois a biblioteca depende de fun\u00e7\u00f5es puras ao inv\u00e9s de emissores de evento, eliminando essa camada de gerenciamento das a\u00e7\u00f5es. Outra diferen\u00e7a do Redux para o Flux, \u00e9 que n\u00e3o existe &#8220;mudan\u00e7a&#8221; nos dados. O que realmente acontece \u00e9 uma nova inst\u00e2ncia daquele dado com outro valor, pois a ferramenta funciona com uma pol\u00edtica de objetos imut\u00e1veis para garantir a consist\u00eancia dos dados.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">O funcionamento da ferramenta tem o diagrama mais ou menos como na imagem abaixo:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_32\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-OiUrBf purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_29\" class=\"hJDwNd-AhqUyc-OiUrBf jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img decoding=\"async\" class=\"aligncenter wp-image-2792 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux3.png\" alt=\"\" width=\"678\" height=\"526\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux3.png 678w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux3-300x233.png 300w\" sizes=\"(max-width: 678px) 100vw, 678px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_36\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\"><span style=\"font-size: inherit\">Como mencionei anteriormente, n\u00e3o existe um <\/span><em style=\"font-size: inherit\">Dispatcher<\/em><span style=\"font-size: inherit\">, ao inv\u00e9s disso, existem os\u00a0<\/span><em style=\"font-size: inherit\">reducers<\/em><span style=\"font-size: inherit\">\u00a0que fazem o papel dessa outra funcionalidade, gerenciando o que acontece com os estados do sistema, por exemplo, quais mudan\u00e7as precisam ser realizadas.<\/span><\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_33\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Podemos tentar entender com o template exemplo quando criamos um react-app com a flag &#8211;template redux:<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\"><code>npx create-react-app my-app --template redux<\/code><\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Acessando o projeto ap\u00f3s a sua cria\u00e7\u00e3o, podemos ver a base de um aplicativo em React com o Redux embutido. O exemplo \u00e9 bem simples, um acumulador de clicks, mas d\u00e1 pra ver e entender todo o fluxo do Redux.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">A p\u00e1gina Main.js tem o seguinte template:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_40\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-OiUrBf purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_37\" class=\"hJDwNd-AhqUyc-OiUrBf jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2793 size-medium\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux4-300x233.png\" alt=\"\" width=\"300\" height=\"233\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux4-300x233.png 300w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux4-1024x795.png 1024w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux4-768x596.png 768w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux4.png 1116w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_44\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_41\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Para os bot\u00f5es de somar (+), diminuir (-) e adicionar uma quantia (Add Amount), existe um evento <em>onclick<\/em> sendo emitido, dessa forma:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_48\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-c5RTEf JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-qWD73c purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_45\" class=\"hJDwNd-AhqUyc-qWD73c jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2794 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux5.png\" alt=\"\" width=\"524\" height=\"573\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux5.png 524w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux5-274x300.png 274w\" sizes=\"(max-width: 524px) 100vw, 524px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-c5RTEf JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_52\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_49\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Batendo o olho, vemos a palavra-chave\u00a0<em>dispatch<\/em>\u00a0sendo chamada como uma fun\u00e7\u00e3o, e passando como par\u00e2metro uma outra fun\u00e7\u00e3o, seja ela a\u00a0<em>increment()<\/em>\u00a0ou\u00a0<em>decrement()<\/em>. A aplica\u00e7\u00e3o est\u00e1 acessando o\u00a0<em>store<\/em>\u00a0com a chamada do dispatch, e passando como par\u00e2metro, a a\u00e7\u00e3o que ela quer realizar.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Mas onde est\u00e3o esses m\u00e9todos\u00a0<em>increment()<\/em>\u00a0e\u00a0<em>decrement()<\/em>?<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Eles est\u00e3o l\u00e1 no arquivo\u00a0<strong>counterSlice.js<\/strong>, onde s\u00e3o definidos os\u00a0<em>reducers<\/em>, ou a\u00e7\u00f5es. Essas a\u00e7\u00f5es que fazem atualiza\u00e7\u00e3o nos estados da aplica\u00e7\u00e3o. Nesse exemplo simples, o \u00fanico estado que est\u00e1 mudando \u00e9 o valor do acumulador na tela. Cada vez que clicamos para somar ou subtrair desse acumulador, \u00e9 realizada uma a\u00e7\u00e3o no sistema para ajustar esse estado.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_56\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-OiUrBf purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_53\" class=\"hJDwNd-AhqUyc-OiUrBf jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2795 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux6.png\" alt=\"\" width=\"745\" height=\"505\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux6.png 745w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux6-300x203.png 300w\" sizes=\"(max-width: 745px) 100vw, 745px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_60\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_57\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Os\u00a0<em>reducers<\/em>\u00a0sempre recebem dois par\u00e2metros, o\u00a0<em>state<\/em>, que se refere ao estado atual, e um segundo par\u00e2metro, o\u00a0<em>action<\/em>, que pode ser uma quantia a ser incrementada, como est\u00e1 sendo realizado no\u00a0<em>incrementByAmount<\/em>.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Por outro lado, o Vuex \u00e9 implementado bem na proposta do Flux, contendo essas camadas bem definidas, como d\u00e1 pra ver no diagrama abaixo:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_64\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-OiUrBf purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_61\" class=\"hJDwNd-AhqUyc-OiUrBf jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2796 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux7.png\" alt=\"\" width=\"701\" height=\"502\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux7.png 701w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux7-300x215.png 300w\" sizes=\"(max-width: 701px) 100vw, 701px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\"><span style=\"font-size: inherit\">Vou utilizar um trecho de c\u00f3digo que foi feito para uma oficina pr\u00e1tica, podemos ver como o <\/span><em style=\"font-size: inherit\">store<\/em><span style=\"font-size: inherit\">\u00a0\u00e9 implementado no Vue. No objeto do\u00a0<\/span><em style=\"font-size: inherit\">store<\/em><span style=\"font-size: inherit\">, temos as propriedades\u00a0<\/span><em style=\"font-size: inherit\">state, getters, mutations, actions e modules<\/em><span style=\"font-size: inherit\">. Seguindo o fluxo do diagrama acima, conseguimos ver o fluxo da aplica\u00e7\u00e3o abaixo:<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_68\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_65\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Na tela de Login dessa aplica\u00e7\u00e3o, temos os m\u00e9todos para realizar o login do usu\u00e1rio:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_72\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-OiUrBf purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_69\" class=\"hJDwNd-AhqUyc-OiUrBf jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2797 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux8.png\" alt=\"\" width=\"596\" height=\"310\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux8.png 596w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux8-300x156.png 300w\" sizes=\"(max-width: 596px) 100vw, 596px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_76\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_73\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Conseguimos ver que o m\u00e9todo est\u00e1 chamando\u00a0this.$store.dispatch(), a mesma palavra-chave utilizada no Redux, porque o que est\u00e1 acontecendo \u00e9 exatamente a mesma coisa. A aplica\u00e7\u00e3o est\u00e1 realizando uma a\u00e7\u00e3o no\u00a0<em>store<\/em>. No lado do\u00a0<em>store<\/em>\u00a0da aplica\u00e7\u00e3o, a\u00a0<em>action<\/em>\u00a0<em><strong>login<\/strong><\/em> ser\u00e1 executada.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_80\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-OiUrBf purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_77\" class=\"hJDwNd-AhqUyc-OiUrBf jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2798 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux9.png\" alt=\"\" width=\"766\" height=\"667\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux9.png 766w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux9-300x261.png 300w\" sizes=\"(max-width: 766px) 100vw, 766px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"hJDwNd-AhqUyc-ibL1re JNdkSc L6cTce-purZT L6cTce-pSzOP\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_84\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_81\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Essa\u00a0<em>action<\/em>\u00a0recebe dois par\u00e2metros, tamb\u00e9m. O primeiro \u00e9 o\u00a0<em>context<\/em>, contexto atual da aplica\u00e7\u00e3o, ou seja, os valores atuais do sistema. Esse objeto est\u00e1 sendo desestruturado para pegar apenas o m\u00e9todo\u00a0<em>commit<\/em>\u00a0do store, que serve para uma a\u00e7\u00e3o realizar uma\u00a0<em>mutation<\/em>\u00a0no store, o que, de fato, ir\u00e1 mudar o valor do estado.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Nesse caso, acontece um\u00a0<em>commit<\/em>\u00a0de\u00a0<strong>\u2018auth_success\u2019\u00a0<\/strong>ou\u00a0<strong>\u2018auth_error\u2019<\/strong>\u00a0dependendo da resposta da API. Caso o login for realizado, a muta\u00e7\u00e3o de sucesso ser\u00e1 realizada, caso contr\u00e1rio, ser\u00e1 realizada a muta\u00e7\u00e3o de erro.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">As muta\u00e7\u00f5es trocam o valor do estado, literalmente. Recebem os valores vindos das a\u00e7\u00f5es e sobrescrevem aquele valor atual com esse valor recebido.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_88\" class=\"yaqOZd\">\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-qWD73c purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_85\" class=\"hJDwNd-AhqUyc-qWD73c jXK9ad D2fZ2 OjCsFc wHaque\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd baZpAe\">\n<div class=\"t3iYD\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2799 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux10.png\" alt=\"\" width=\"395\" height=\"453\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux10.png 395w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/09\/flux10-262x300.png 262w\" sizes=\"(max-width: 395px) 100vw, 395px\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"h.5e466c2fc68333b0_92\" class=\"yaqOZd\">\n<div class=\"yaqOZd IFuOkc\">\u00a0<\/div>\n<div class=\"mYVXT\">\n<div class=\"LS81yb VICjCf\">\n<div class=\"hJDwNd-AhqUyc-uQSCkd purZT-AhqUyc-II5mzb pSzOP-AhqUyc-qWD73c JNdkSc\">\n<div class=\"JNdkSc-SmKAyb\">\n<div class=\"\">\n<div class=\"oKdM2c Kzv0Me\">\n<div id=\"h.5e466c2fc68333b0_89\" class=\"hJDwNd-AhqUyc-uQSCkd jXK9ad D2fZ2 OjCsFc wHaque GNzUNc\">\n<div class=\"jXK9ad-SmKAyb\">\n<div class=\"tyJCtd mGzaTb baZpAe\">\n<p class=\"zfr3Q\" dir=\"ltr\">Para acessar esse projeto inteiro, vou deixar<a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fgithub.com%2Fpet-si%2Foficina-vuejs&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH9oVHvgkLqQEQStEhvn6ZNdV7WWA\" target=\"_blank\" rel=\"noopener noreferrer\">\u00a0<\/a><a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fgithub.com%2Fpet-si%2Foficina-vuejs&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH9oVHvgkLqQEQStEhvn6ZNdV7WWA\" target=\"_blank\" rel=\"noopener noreferrer\">aqui<\/a>\u00a0o link para o reposit\u00f3rio do c\u00f3digo dessa aplica\u00e7\u00e3o. Nos commits, eu tentei deixar organizado e em ordem, como se fosse um tutorial passo-a-passo. Seguindo os commits, ser\u00e1 poss\u00edvel implementar essa aplica\u00e7\u00e3o e ver ela funcionando.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Os dois\u00a0<em>frameworks<\/em>\u00a0t\u00eam as suas particularidades, mas o conceito \u00e9 o mesmo, pois os dois s\u00e3o baseados na mesma arquitetura.<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Para ver e entender melhor, tanto Vuex, quanto Redux, eu recomendo<a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fmedium.com%2Fjavascript-in-plain-english%2Fi-created-the-exact-same-app-in-react-and-vue-here-are-the-differences-e9a1ae8077fd&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNGzRVhct3SGWM5qKv547P-W4OJxPw\" target=\"_blank\" rel=\"noopener noreferrer\">\u00a0<\/a><a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fmedium.com%2Fjavascript-in-plain-english%2Fi-created-the-exact-same-app-in-react-and-vue-here-are-the-differences-e9a1ae8077fd&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNGzRVhct3SGWM5qKv547P-W4OJxPw\" target=\"_blank\" rel=\"noopener noreferrer\">este artigo<\/a>. O Sunil Sandhu implementa a mesma aplica\u00e7\u00e3o em React e em Vue, utilizando Redux e Vuex, mostrando o passo-a-passo e as diferen\u00e7as de cada um.<\/p>\n<p dir=\"ltr\">\u00a0<\/p>\n<p class=\"zfr3Q\" dir=\"ltr\">Refer\u00eancias:<\/p>\n<ul class=\"n8H08c UVNKR\">\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Ffacebook.github.io%2Fflux%2F&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEzWxGHn-KRaN3_jfCi2QgmUPjApw\" target=\"_blank\" rel=\"noopener noreferrer\">Documenta\u00e7\u00e3o do Flux<\/a>;<\/p>\n<\/li>\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fvuex.vuejs.org%2F&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFFc3YjKwLx5PbxTtCuojVLvLk-Iw\" target=\"_blank\" rel=\"noopener noreferrer\">Documenta\u00e7\u00e3o do Vuex<\/a>;<\/p>\n<\/li>\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fredux.js.org%2F&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNGuftHhoZ5W08xziuJUvVZR6dlAVg\" target=\"_blank\" rel=\"noopener noreferrer\">Documenta\u00e7\u00e3o do Redux<\/a>;<\/p>\n<\/li>\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fmedium.com%2Fjavascript-in-plain-english%2Fi-created-the-exact-same-app-in-react-and-vue-here-are-the-differences-e9a1ae8077fd&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNGzRVhct3SGWM5qKv547P-W4OJxPw\" target=\"_blank\" rel=\"noopener noreferrer\">Mesma aplica\u00e7\u00e3o React vs Vue<\/a>;<\/p>\n<\/li>\n<li class=\"TYR86d zfr3Q\">\n<p class=\"zfr3Q\" dir=\"ltr\"><a class=\"XqQF9c\" href=\"https:\/\/www.google.com\/url?q=https%3A%2F%2Fgithub.com%2Fpet-si%2Foficina-vuejs&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH9oVHvgkLqQEQStEhvn6ZNdV7WWA\" target=\"_blank\" rel=\"noopener noreferrer\">Reposit\u00f3rio da aplica\u00e7\u00e3o em Vue<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>No PET-Reda\u00e7\u00e3o dessa semana, vamos tentar entender a arquitetura Flux, comparando-a com o famigerado MVC. Ent\u00e3o pega o teu caf\u00e9 e nos acompanha nessa reda\u00e7\u00e3o descontra\u00edda. Flux \u00e9 a arquitetura que o Facebook criou para melhorar o desenvolvimento de aplica\u00e7\u00f5es\u00a0web\u00a0nos tempos modernos. Mas antes de entrarmos no assunto, temos que entender o porqu\u00ea da exist\u00eancia [&hellip;]<\/p>\n","protected":false},"author":2948,"featured_media":2680,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[124,112],"tags":[203,149,192],"class_list":["post-2679","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-destaques","category-redacao","tag-frameworks","tag-redacao","tag-web-e-front-end"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/2679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/users\/2948"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/comments?post=2679"}],"version-history":[{"count":0,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/2679\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media\/2680"}],"wp:attachment":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media?parent=2679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/categories?post=2679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/tags?post=2679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}