Buscar

Aula 15 - Introdução ao Redux

Prévia do material em texto

PROGRAMAÇÃO 
FRONT END II 
Vinícius Silveira Magnus 
Introdução ao Redux
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
 � Definir os conceitos básicos do Redux.
 � Listar as características do Redux.
 � Ilustrar a aplicação do Redux com o React.
Introdução
A biblioteca de código aberto Redux é amplamente utilizada com o 
React, para o gerenciamento de estado da sua aplicação.
Neste capítulo, primeiramente, abordaremos os conceitos que são a 
base para o uso da biblioteca, além de sua aplicação no Redux e em sua 
arquitetura, possibilitando uma visão ampla de tudo que acontece dentro 
dela. Também, ilustraremos uma aplicação utilizando o Redux, juntamente 
com o React, mostrando como o desenvolvedor pode trabalhar com as 
duas bibliotecas em conjunto para facilitar o seu trabalho.
Conceitos básicos do Redux
Redux é uma biblioteca JavaScript de código aberto, utilizada, comumente com 
o React, para gerenciar os dados da aplicação (REDUX..., 2019). Entende-se 
como dado qualquer entrada de informação — por exemplo, a alimentação de 
um formulário pelo usuário, o clique de um botão, o carregar de uma página, 
a chamada a uma API, etc. Assim, o Redux auxiliará com o comportamento 
da aplicação, de acordo com informações alimentadas no ambiente. 
Ele também pode ser utilizado por outras bibliotecas ou frameworks que 
têm compatibilidade com a arquitetura de componentes, como Angular e Vue. 
O Redux é uma implementação da arquitetura Flux, criada pelo Facebook 
para organizar uma forma de trabalhar com o React, usando de um conceito 
chamado fluxo unidirecional de dados (STEFANOV, 2016). 
A criação do Redux foi de responsabilidade de Dan Abramov e Andrew 
Clark, em 2015, quando buscavam uma implementação prática para a arqui-
tetura Flux.
Veja, a seguir, alguns benefícios do uso do Redux:
 � controle do estado da aplicação em um local centralizado;
 � tratamento de forma unificada do fluxo de dados da aplicação;
 � facilidade na troca de informações entre componentes;
 � controle dos “efeitos colaterais” da aplicação de forma simplificada.
Para o entendimento do Redux, é de fundamental importância que tenhamos 
o domínio de determinados conceitos que são utilizados para compor essa 
biblioteca ou utilizados juntamente com ela, como os de estado de componentes, 
hooks e arquitetura Flux. Também são necessários para o desenvolvedor front 
end que deseja entender e implementar o Redux de uma forma consciente e 
extrair o máximo de proveito dessa biblioteca.
Estados de um componente 
Quando trabalhamos no desenvolvimento de componentes, estamos cons-
tantemente trabalhando com estados — ou states —, que são as informações 
armazenadas em um local em um determinado instante de tempo. 
No React, a forma mais fácil de manipular componentes é por meio de 
hooks, sem a necessidade do uso de classes, mas, sim, de funções, o que tem 
se tornado um padrão no desenvolvimento com a arquitetura de componentes 
nos dias de hoje.
A seguir, um exemplo de um componente feito a partir de uma classe, 
cujo estado contém uma variável name com valor inicial (ou estado inicial) 
definido a partir de uma props chamada de name.
Introdução ao Redux2
Uma forma de simplificação é por meio do React 16.8, que tem os hooks 
incorporados, cujas funções possibilitam que o desenvolvedor adicione recursos 
de estado e ciclo de vida aos componentes de função. A seguir, um código 
utilizado para criar uma variável de estado chamada de name, sua função 
para evoluir seu estado setState, e a função que cria e inicializa o estado, 
o useState().
3Introdução ao Redux
Para saber mais sobre os hooks e sua implementação, acesse o link a seguir. Nele, você 
verá como o estado de um componente é gerenciado sem o uso de Redux e, conse-
quentemente, perceberá a importância e a facilidade que ele traz ao desenvolvedor.
https://qrgo.page.link/Hj5Ae
Usando estados com componentes classes ou funções, o grande desafio é 
a chamada “evolução do estado”, que é, por exemplo, a modificação de uma 
determinada informação em um componente — quando um nome é alterado, 
um número é incrementado. Dissemos que o estado evoluiu. Mas a grande 
dificuldade é que o estado do componente é interno e vinculado a ele. Uma vez 
que o componente é criado, precisamos acessar os métodos e as propriedades 
dele para que seu estado evolua. Para tanto, é necessário o “envio” de um 
representante do componente para onde desejamos que o estado seja evoluído. 
Veja o exemplo a seguir.
É exatamente nesse ponto que entra o Redux, chamando a responsabilidade 
do gerenciamento dos estados dos componentes da sua aplicação e abstraindo 
diversos processos que são necessários para a manipulação e evolução desses 
estados.
Introdução ao Redux4
Sempre é recomendado que o desenvolvedor que utilizará o Redux tenha um bom 
domínio dos conceitos de gerenciamento de estado do componente e de seu ciclo 
de vida sem ele. Saber o que acontece “atrás” das abstrações de uma biblioteca torna 
o uso dela muito mais sólido, gerando mais possibilidades ao desenvolvedor front end.
Arquitetura Flux
A arquitetura Flux foi criada com o objetivo de simplificar um processo de 
manipulação de estado, introduzindo o conceito de que os estados não são 
dos componentes, mas, sim, de toda a aplicação. Tecnicamente, os estados 
dos componentes são vinculados ao que se chama de store (FLUX..., 2019). 
Segundo o Facebook, na sua documentação de conceitos iniciais do Flux, a 
base da arquitetura está em quatro elementos (FLUX, 2019, documento on-line):
 � dispatcher — recebem as ações e envia às stores registradas nos res-
pectivos dispatchers, onde todas elas receberão as ações que acontecem 
na aplicação; 
 � store — são os locais que mantêm os dados da aplicação e fazem os 
registros nos dispatchers, a fim de receber as ações provenientes de 
toda a aplicação. Dados de uma store são alterados somente a partir 
de uma ação, que devem ter sua lógica para decidir a quais ações ela 
deve responder, pois uma aplicação geralmente possui inúmeras stores; 
 � action — também chamada de API interna do aplicativo, trata-se de 
descrições das ações que estão ocorrendo na aplicação, como o clique 
de um botão ou o carregamento de uma página;
 � view — onde os dados das stores são exibidos, por meio de uma inscrição 
em uma determinada store.
A Figura 1, a seguir, mostra o fluxo de dados que deve ser seguido por 
uma aplicação que implementa a arquitetura Flux. Resumindo, a view envia 
ações para o dispatcher, que as envia para todas as stores, que enviam dados 
à view. Existe outra entrada de ação que não é proveniente das views, mas que 
também é comum na arquitetura.
5Introdução ao Redux
Figura 1. Fluxo proposto pela arquitetura Flux.
Fonte: flux-concepts (2017, documento on-line).
A arquitetura serve como um padrão para quem deseja organizar o fluxo de 
dados em uma aplicação, a fim de se criar um processo organizado, trazendo 
inúmeros benefícios para quem implementa tal arquitetura. Nesse contexto, 
o Redux é uma biblioteca que segue a arquitetura Flux para realizar a sua 
implementação.
Principais características do Redux
O Redux chega para facilitar o gerenciamento de todo o estado da aplicação, 
por meio da base da arquitetura Flux, introduzindo alguns conceitos para 
implementação (REDUX..., 2019).
Action
Action são as ações que acontecem na aplicação e podem ser disparadas pelo 
próprio usuário ou pela aplicação. Cada action criada necessita da propriedade 
type, como forma obrigatória e única, que o Redux usa para distinguir a 
ação que foi executada. Veja o exemplo a seguir. 
Introdução ao Redux6
A mesma deve estar dentro de uma chamada action functions ou action 
creators, que, ao ser invocada, ativa os reducers, como mostrado no exemplo 
a seguir.
Store
Store é um local para acondicionamento do estado global para o Redux, onde 
fica armazenada a maioria das informações da aplicação. Ela é montada no 
formatode objeto, assim como a action. 
No seguinte exemplo, está montado um estado inicial em um objeto a ser 
carregado em uma store, cujo conteúdo possui uma array de objetos com 
título e texto a serem exibidos em um determinado local da aplicação e uma 
variável que define o conteúdo inicial.
7Introdução ao Redux
Quando temos valores que iniciam a aplicação, chamamos os mesmos de 
estado inicial, e podem ser colocados em uma constante e posteriormente 
enviados a uma função de reducer, como estado inicial. Veja o exemplo a seguir.
Reducer
Reducer é disparado pelas action functions, que recebem as informações 
e selecionam quais states serão modificadas dentro da store, conforme o 
seguinte exemplo.
A estrutura de seleção geralmente é colocada dentro de uma função reducer, 
que recebe o state e a action para realizar suas ações, como no trecho de 
código a seguir. Dentro do mesmo, colocaríamos a seleção do código anterior.
Introdução ao Redux8
O estado inicial é utilizado para definir o valor na primeira vez em que 
o reducer for utilizado. Posteriormente, quando os estados forem evoluindo, 
novos serão passados aos reducers que, por sua vez, atualizarão as stores e 
seus states.
Devemos, também, enviar nossas funções redutoras para “dentro” das 
stores. Na verdade, com isso, estamos possibilitando que os dispatchers possam 
dispará-las. Observe a seguir.
Conexão entre componente e Redux
Para realizarmos o vínculo dos componentes com o Redux, devemos seguir 
alguns passos. Primeiramente, devemos vincular um dispatch a uma view, 
usando o seguinte comando:
Precisamos que esse dispatch seja feito a partir de uma ação do usuário 
— por exemplo, no onClick — e passarmos para ele a função que definimos 
como action creator, para a mesma ser acionada, conforme segue.
Para que o componente seja atualizado, precisamos observar o que está 
acontecendo com o estado toda vez que a store é atualizada. Para isso, 
usamos as seguintes funções, sendo a primeira a maneira como realizamos o 
vínculo, e a segunda, como buscamos os valores. 
9Introdução ao Redux
Para que os valores de nossos componentes sejam atualizados, podemos 
fazer o uso de hooks, que facilitam a manipulação dos estados globais nos 
componentes. No exemplo a seguir, podemos observar como isso fica. Toda 
vez que alguma alteração ocorrer na store, uma função hooks setContent 
será disparada e atualizará a nossa variável de estado local, chamada con-
tent. Com ela, podemos buscar o conteúdo no estado global, dentro do array 
contents[], onde atualizaremos o título e o texto de nosso componente 
sempre que o valor for modificado. 
Ao final, o fluxo fica como mostrado na Figura 2, a seguir.
Figura 2. Fluxo do Redux.
Fonte: Fernandes (2018, documento on-line).
Introdução ao Redux10
Aplicação do Redux com o React
Para utilizarmos o Redux com o React, devemos fazer o processo de instalação 
a partir do terminal de comando em um projeto ou globalmente. Podemos 
criar a aplicação React a partir do pacote disponibilizado pelo Facebook com 
uma estrutura pré-configurada do ambiente necessário e, depois, iniciar a 
aplicação com três comandos:
npx create-react-app my-app-redux
cd my-app-redux
npm start
Depois, dentro de nossa aplicação, podemos fazer a instalação a partir do 
npm, que disponibiliza a biblioteca em um pacote, além de outro que faz a 
conexão entre o Redux e o React. Os comandos são, respectivamente: 
npm install redux
npm install react-redux
Exemplo de aplicação 
O código, a seguir, mostra a aplicação em um único arquivo dos conceitos 
vistos na sessão anterior. O conteúdo de um componente, denominado <Sec-
tion />, é alterado pelo clique dos botões que estão em outro componente, 
denominado <Nav />. Nesses processos, fazemos a importação da { crea-
teStore } do pacote da biblioteca redux para podemos criar nossa store e 
manipularmos os estados por meio das funções disponibilizadas pela biblioteca.
11Introdução ao Redux
Introdução ao Redux12
Primeiramente, realizamos as importações dos módulos que utilizaremos. 
Do React, importamos o modulo principal React e o módulo para usar os 
estados com hooks { useState }. Já do pacote do Redux, necessitamos 
importar o módulo para a criação e o gerenciamento das stores, que é o 
{ createStore }.
13Introdução ao Redux
O item objeto de estado inicial, chamado INITIAL_STATE, é montado 
para armazenar o índice do conteúdo atual que será exibido, na variável 
content, e um array contents com os conteúdos a serem utilizados, 
cada um com title e text.
A função redutora, chamada function content(), recebe um objeto 
com o estado atual — onde, na primeira execução, será o INITIAL_STATE 
— e realiza a ação baseada na action,type, que é o item que define o tipo 
de ação que deve ser tomada pela função redutora. Logo após, uma store é 
criada com o comando createStore(), passando a função redutora como 
parâmetro para a criação da mesma.
A action creator, ou função da ação, é definida com o type SET_CONTENT. 
A mesma garante que, quando essa ação for chamada, uma variável que define 
o conteúdo será passada por paramento, usada para alterar o conteúdo em 
questão. Essa função é uma espécie de tipagem das informações que a ação 
necessita para realizar as mudanças de estado de forma correta.
Posteriormente, criamos os componentes, sendo o <App /> o principal, 
que monta a view com o conteúdo de outros dois componentes: o <Nav /> e 
o <Section />. Esses são a demonstração maior de como o Redux facilita 
o desenvolvimento e gerenciamento de aplicações com estado global, pois, de 
forma simples, o clique nos botões do primeiro componente altera o conteúdo 
do segundo. 
No primeiro componente, simplesmente usamos no onClick de cada 
um a chamada {() => store.dispatch(setContent(0))}, que 
dispara na store a ação setContent() e envia o valor que setará a variável 
de estado global, chamada content. Essa varável está sendo monitorada pelo 
componente <Section /> por meio do comando store.subscribe(() 
=> setContent(store.getState().content)), que passou à store 
a função que seta a variável local, chamada content, cujo gerenciamento 
de estado está sendo feito pelos hooks.
Por fim, quando tivemos uma alteração na variável content no estado 
global da aplicação, a variável de estado local será alterada. Quando isso 
acontecer, os conteúdos do componente serão atualizados, pois usamos a 
função {store.getState().contents[content].title} para 
buscar título e texto que devem ser exibidos de acordo com o valor setado 
dessa variável.
Introdução ao Redux14
Para testarmos essa aplicação, basta substituirmos o conteúdo do arquivo 
scr/App.js em nossa arquitetura criada na pasta my-app-redux, feita 
pelos comandos anteriores. Nossa aplicação fica como mostrada na Figura 3, 
a seguir. Por mais simples que pareça, você está utilizando uma série de 
conceitos muito importantes para a formação de um desenvolvedor front end.
Figura 3. Interface criada pelo exemplo.
Quando iniciamos essa pequena aplicação, o estado inicial é definido 
como 0. Com essa informação, o componente consulta array do estado global 
da aplicação, buscando título e texto a serem exibidos naquele momento. 
O clique de cada botão faz a alternância de estados da variável content, 
que é utilizada para saber o índice do array usado para mostrar o conteúdo.
FERNANDES, R. F. Integrating semantic-ui modal with Redux. IT Next, Utrecht, 
16 Feb. 2018. Disponível em: https://itnext.io/integrating-semantic-ui-modal-with-
-redux-4df36abb755c. Acesso em: 6 nov. 2019.
FLUX. GitHub, [S. l.], 16 Oct. 2019. Disponível em: https://github.com/facebook/flux. 
Acesso em: 6 nov. 2019.
15Introdução ao Redux
FLUX — Application architecture for building user interfaces. Facebook Open Source, 
[S. l.], 2019. Disponível em: https://facebook.github.io/flux/. Acesso em: 6 nov. 2019.
FLUX-CONCEPTS. GitHub, [S. l.], 19 Jan. 2017. Disponível em: https://github.com/facebook/
flux/tree/master/examples/flux-concepts. Acessoem: 6 nov. 2019.
REDUX — A predictable state container for JavaScript apps. Redux, [S. l.], 2015. Disponível 
em: https://redux.js.org/. Acesso em: 6 nov. 2019.
STEFANOV. S. Primeiros passos com React: construindo aplicações web. São Paulo: 
Novatec, 2016. 248 p.
Leituras recomendadas
FLANAGAN, D. JavaScript: o guia definitivo. 6. ed. Porto Alegre: Bookman, 2013. 1080 p.
REACT — uma biblioteca JavaScript para criar interfaces de usuário. Facebook Open 
Source, [S. l.], 2019. Disponível em: https://pt-br.reactjs.org/. Acesso em: 6 nov. 2019.
Os links para sites da Web fornecidos neste capítulo foram todos testados, e seu fun-
cionamento foi comprovado no momento da publicação do material. No entanto, a 
rede é extremamente dinâmica; suas páginas estão constantemente mudando de 
local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade 
sobre qualidade, precisão ou integralidade das informações referidas em tais links.
Introdução ao Redux16

Continue navegando

Outros materiais