Introdução ao React: Como Começar
Introdução ao React: Como Começar
INTRODUZIONE
React é uma biblioteca JavaScript que nasceu para se tornar a solução para desenvolvedores frontend e aplicativos móveis baseados em
[Link] é uma biblioteca declarativa baseada em componentes.
Declarado porque o React permite desenvolver Interfaces de Usuário (UI) facilmente, tornando o código mais legível e fácil.
da debugar, projetar interfaces para cada estado da aplicação de modo que a cada mudança de estado React
atualizará apenas as partes da interface do usuário que dependem desses dados.
Icomponents sono simili a tag html, possono essere creati componenti singoli o composti con una struttura ad albero.
per UI complexas. As interações e a lógica para os componentes são implementadas em JavaScript e isso nos permite
facilmente di passare ed accedere struture datcomplesse in vari puntdella applicazione senza dover salvare
informações sobre o DOM.
Carregar React.
<scriptsrc="htps://[Link]/react@16/umd/[Link]" crossorigin></script>
<script src="htps://[Link]/react-dom@16/umd/[Link]" crossorigin></script>
Carregue nosso componente React.
<script src="[Link]"></script>
</body>
Verifique se a CDN que você está usando definiu o cabeçalho HTTP Access-Control-Allow-Origin: *:
Criar ReactApp
Criar Aplicativo Reacté
um ambiente confortável para aprender React, e é a melhor maneira de começar a construir uma
nova aplicaçãopágina únicaem React.
Isso configura o ambiente de desenvolvimento de forma a poder utilizar os recursos mais recentes do JavaScript, fornece
uma ótima experiência de desenvolvimento e otimiza a aplicação para a produção.
Estou solicitando a instalação deNode >= 8.10 e npm >= 5.6.
Para criar um projeto, execute:
npx create-react-app mia-app
cdmia-app
npm iniciar
[Link]
[Link]é um framework popular e leve para aplicações estáticas e renderizadas no lado do servidor feitas com
React. Includesoluzioni per il routng e l’applicazione degli stlie richiede l’utlizzo [Link] ambiente servidor.
Gatsby
Gatsbyè il miglior modo di crearesit statcicon React, consente di utlizzare componentReact, ma il suo output è
constituído inteiramente de código HTML e CSS pré-renderizado, de modo a garantir tempos de carregamento rápidos.
O arquivo [Link]
A pasta do projeto inclui um conjunto de pacotes já instalados, fazendo parte [Link], conteúdo dentro da
diretório node_modules.
Uma parte dos pacotes é necessária para a execução da aplicação e para que ela funcione.
Existem também outros pacotes, que fornecem ferramentas de suporte para a verificação do código, o lançamento de um servidor.
Web para depuração, execução de testes automatizados, montagem de arquivos e recursos para liberação em produção
e outra coisa. Portanto, eles não são indispensáveis em tempo de execução, mas apenas na fase de desenvolvimento.
O arquivo [Link]: trata-se de um arquivo presente nas aplicações e pacotes escritos para [Link], contém um
objetoJSONque resume as informações principais do pacote, como o nome (name) e a versão (version), as
dependências necessárias para o runtime (dependencies) e aquelas apenas para o desenvolvimento (devDependencies), além de uma série de
comandos que podem ser executados através npm, o gerenciador de pacotes do [Link], definido na propriedade scripts.
Eu comando react-scripts
create-react-app inclui o pacote react-scripts que fornece uma série de scripts já prontos capazes de executar diversas
operações a partir do Prompt de Comando.
Aprendo o Prompt e deslocando-se para a pasta do projeto, é possível executar os scripts com
npm Comando.
Os comandos disponíveis são:
- npm start segue a transpilação do código-fonte da aplicação, mostrando eventuais erros. Al
Ao final do processo, o servidor Web é ativado para depuração e o navegador é aberto para visualizar a
pagina iniziale dell’applicazione all’indirizzolocalhoste alla porta predefinita (3000). Se il browser non
mostre o conteúdo esperado, verifique quaisquer erros no painel do Console.
- npm build: executes the build of the project, creating the same directory and generating the files inside it.
assemblada da aplicação, otimizada para o lançamento em ambiente de produção. As ferramentas de empacotamento agrupam
e empacotam os arquivos necessários para o funcionamento da aplicação, e iniciam o processo de diminuição para
reduzir o peso dos arquivos que o navegador terá que baixar, maximizando o desempenho.
- npmtest:prepara a suíte de testes para a execução. Geralmente, a ferramenta permanece ativa e em escuta para
executar novamente os testes em face de modificações nos fontes da aplicação.
- npm eject: comando irreversível que se executa quando se deseja abrir mão do suporte do create-react-app.
comando remove do projeto a dependência da ferramenta e extrai os arquivos de configuração para Webpack, Babel e
as outras ferramentas nas quais se baseia, deixando o controle completo nas mãos do desenvolvedor.
No React, os elementos de um componente devem ter um único elemento pai, por exemplo:
<div> </div>
<h1> Olá Mundo</h1>
<div> </div>
<h2> Primeiro exemplo<h2>
Neste caso, ocorreria um erro. Se quisermos escrever o código anterior, retornando mais elementos,
corretamente e sem inserir o segundo elemento no elemento pai div, ou criar outro div, é possível
envolvê-los em <[Link]>...</[Link]> que permite devolver elementos múltiplos como
resultado de um metodorender() sem precisar criar um elemento DOM adicional para contê-los.
In pratca é possibile scrivere gli element dei component diretamente in Javascript, infat, JSX è opzionale
e não é necessário para utilizar o React, uma vez que ele será convertido em Javascript, mas é muito mais
confortável, simples e legível. A ferramenta Babel converte, na verdade, o código JSX em JavaScript, em chamadas para
[Link], por exemplo:
const user = {
firstName: 'Giuseppe',
lastName: 'Verdi'
};
function formatName(user) {
return [Link] + ' ' + [Link];
}
[Link](element, [Link]('root'));
É possível utilizar JSX dentro de instruções if, ciclos for, atribuí-lo a variáveis, utilizá-lo como argumento de
uma função e retorná-la como resultado de uma função.
Não adicione as aspas ao redor das chaves ao incluir uma expressão JavaScript em um atributo.
Deveria usar ou as aspas (para as strings) ou as chaves (para as expressões), mas nunca ambas ao mesmo tempo.
mesmo atributo.
React DOM utlizza laconvenzionecamelCase na atribuição do nome aos atributos, em vez do que foi utilizado
normalmente no HTML, modifica o nome de alguns atributos, por exemplo, o atributo class se tornaclassName em
JSX etabindexdiventatabIndex.
I componentReact implementano unmetodorender()che riceve datin input e ritorna cosa deve visualizzare.
arquivo [Link]
<div id="root"></div>
Arquivo html que contém a tag root e representa o elemento pai do DOM em c0u65Zzzi será redirecionado e
visualizada toda a aplicação.
file [Link]
Este arquivo contém o componente Relógio
function Orologio() {
const oraMillisecondi = [Link]();
const ora = new Date(oraMilissegundos);
retornar (
<p> {[Link]()}</p>
)
}
export default Orologio;
Vem importada a biblioteca React, em seguida é criado o componente Relógio através de uma função. Com
[Link]() obtém a hora atual em milissegundos, depois cria um objeto do tipo Date. O componente retorna um
elemento p em que recebe o objeto oraetoLocaleTimeString() o visualiza em formato horas/minutos/segundos. Por fim é
exportado o componente.
arquivo [Link]
função App() {
retornar (
<div className="App">
<h1>Hora Atual</h1>
<Orologio/>
</div>
)
}
é o componente pai de toda a aplicação, importa todos os componentes filhos, neste caso só o componente
Relógio e retorna a estrutura de todos os componentes da aplicação.
Vemos que, importado o componente Relógio, este pode ser inserido na aplicação através de um
simples tag <Orologio/>.
Os nomes dos componentes devem sempre começar com letra maiúscula, ao contrário dos tags JSX.
arquivo [Link]
importar React de 'react';
importar ReactDOM do 'react-dom';
import App from './App';
função orario() {
[Link](<App/>, [Link]('root'));
}
setInterval(orario, 1000)
Data a função:
função App() {
retornar (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p> Prima App React </p>
</cabeçalho>
</div>
);
}
COMPONENTES E PROPS
Os componentes permitem dividir a UI em partes independentes reutilizáveis. Conceitualmente, os componentes
Funções JavaScript: recebem como entrada dados chamados de 'props' e retornam elementos que descrevem
o que deve aparecer na tela.
Props representa um objeto que contém as propriedades de um componente.
Tomemos o exemplo anterior do relógio e, além da hora atual local, adicionemos outro componente relógio.
que atravesso a fusos horários mostra a hora de 6 horas mais adiante.
o arquivo [Link] se torna:
function App() {
retornar (
<div className ="App">
<h1>Ora Attuale</h1>
<Orologio fusoorario = "0"/>
<Orologio fusoorario = "6"/>
</div>
)
}
Vejamos que a props fusoorario é passada para o componente como um atributo deltag.
function Orologio(props) {
const oraMillisecondi = [Link]() + [Link] * 3600 * 1000;
const ora = new Date(oraMilissegundos);
retornar (
<p> {[Link]()}</p>
)
}
export default Orologio;
o componente da função recebe como parâmetro props. À hora atual em milissegundos é adicionado o fuso horário.
chamado por props e convertido em milissegundos (* 3600 * 1000).
No componente untag pode-se indicar quantas props se deseja e depois chamá-las no componente (que recebe
como parâmetro sempre apenas props) através de [Link].
CLASSI E PROPS
Para chamar e usar em uma classe as propriedades props, vamos pegar o exemplo do relógio convertido em classe:
arquivo [Link]
importar React de 'react';
Podemos estender a classe tanto com Component, importando-o no react, ou simplesmente com
[Link].
Para chamar as props na classe: define-se o método constructor(), antes do método render(), e nele se
passaprops, que é definido depois no metodosuper().
Para utilizar as props na classe (no método render()) faz-se referência a elas com:
[Link]
O método getTime() é um método do objeto Date, igual a now(), que retorna a hora atual em milissegundos.
Esta classe é redirecionada com
[Link](<App/>, [Link]('root'));
Portanto, por enquanto, retorna a hora de forma estática (os segundos não fluem).
Um componente, em seu ciclo de vida, executa em ordem alguns métodos. Esses métodos têm o objetivo de gerenciar o ciclo.
di vita di un componente React e cominciano con will quando precedono un evento e con did quando seguono un
evento.
Temos acesso a esses métodos que poderemos usar para executar determinadas ações quando um componente é
criado, atualizado ou destruído ou, até mesmo, decidir se um componente deve ser modificado em consequência da
variação de pelo menos uma das propriedades contidas em seu objeto State ou ao receber novas Props.
Inicialização de um componente (MONTAGEM)
- O construtor é o primeiro método que é chamado para uma correta inicialização, serão atribuídos valores de
os props padrão definidos através do objeto defaultProps e, portanto, o objeto state será inicializado.
- O segundo método a ser invocado é componentWillMount() que é chamado antes que o componente
venga reindirizado (método render).
O React recomenda usar o construtor em vez deste método para cada inicialização.
- render() é o único método obrigatório quando se quer definir um componente. Deve retornar pelo menos um React
Elemento ou nulo ou falso, se não quisermos mostrar nada na tela para esse componente. Deve ser uma
função pura, não deve modificar diretamente o objeto props state.
- ComponentDidMount() é o método que é invocado após a execução do render(). Este é o método a ser usado para
manipular o DOM ou para recuperar eventuais dados de um servidor.
-O primeiro é shouldComponentUpdate() que recebe como argumentos os objetos nextProps e nextState que
representam o próximo valor do objeto Propse do objeto State e devolvem um valor booleano. Se falso, os
métodos sucessivos não serão invocados, por padrão retorna true, permitindo a atualização do componente
a cada modificação dos props e estados. Por isso, pode ser usado para determinar se o componente deve
estar atualizado com os próximos valores de PropseState. Dentro deste método é possível comparar os valores
atualiza os oggetState e Props com os de nextState e nextProps, permitindo assim decidir se efetuar
a atualização do componente.
-SeshouldComponentUpdate()resttuiscetrue, verrà invocatocomponentWillUpdate(). In questo metodo, non è
consentir modificar o objeto State através [Link](), pode ser utilizado para preparar o componente
antes que a atualização do objeto State ou do objeto Props aconteça.
-Após o metodorender(), é invocado o componentDidUpdate() que pode ser usado para baixar dados atualizados
da um servidor ou para operar no DOM.
componentDidMount() {
[Link] = setInterval([Link], 1000);
}
aggiornaTempo = () => {
[Link]({
orario : new Date()
});
}
Para realizar uma atualização do estado, utiliza-se o método setState() que recebe as propriedades do estado que devem ser
atualizadas. Neste caso, temos a propriedade horário, mas se houvesse outras no objeto [Link] estas
não seriam consideradas.
setState() faz uma confrontação das propriedades do objeto que recebe com aquelas do [Link] e se foram modificadas,
ele sobrescreve. No nosso caso, a propriedade horário é simplesmente redefinida com um novo Date() mais recente,
che setState() confronta com o que está em [Link] e o sobrescreve.
Dessa forma, o relógio dispara a cada segundo.
Vamos recapitular o que acontece e a ordem em que os métodos são invocados:
1 Quando <Orologio /> é passado para [Link](), React invoca o construtor do componente que
inicializa [Link] com um objeto que inclui a hora atual. Em seguida, este estado é atualizado.
2 O React invoca o método render() do componente Orologio e aprende o que deve ser exibido na tela.
tela. O React cuida de atualizar o DOM para que corresponda à saída de renderização.
3 Quando a saída da renderização do O relógio é inserida no DOM, o React invoca o método
componentDidMount(). Dentro dele, é configurado um timer que invoca atualizaTempo uma vez por segundo.
4 A cada segundo, dentro dele, o componenteOrologioimplementa uma atualização da UI
invocandosetState() com um objeto que contém a nova hora corrente. Com a chamada asetState(), React é
informe do fato de que o estado mudou e invoca novamente o método render() para saber o que deve ser
mostrado na tela. Desta vez, [Link] metodorender() terá um valor diferente e a saída da
A renderização incluirá o horário atualizado. O React atualiza o DOM de acordo.
componentWillUnmount() {
clearInterval([Link]);
}
GESTÃO DE EVENTOS
Os eventReact são declarados como para o html, com a diferença de que devem ter uma sintaxe:
camelCase = {[Link]}
Vamos pegar o exemplo do Relógio e inserir um botão que para e reinicia o tempo.
É necessário gerenciar o estado do componente, e nele inicializamos uma propriedade start: true:
[Link] = {
orario: new Date(),
start: true
}
Dopodiché inseriamo nel return di render() un tag bottone:
<button>Parar</button>
Para gerenciar este botão, é necessário inserir um evento que chame uma função:
<buttononClick={[Link]}>Parar</button>
Até agora, implementamos o relógio de forma que, uma vez que o componente esteja montado no DOM, parte
o intervalo a cada segundo em componentDidMount() e o desmontamos em componentWillUnmount().
Neste caso, deve-se lidar com o evento e a função que chama se:
- o relógio está parado, é preciso fazê-lo funcionar novamente;
- o relógio NÃO está parado, é preciso pará-lo desmontando-o.
Criamos um metodostart(), com o setInterval(), e chamamos [Link]() no componentDidMount().
Creiamo un metodostop(),con clearInterval(), e chiamiamo [Link]() in componentWillUnmount().
Quando se define um componente de classe, é comum usar um método da classe como manipulador de eventos:
gestTime() {
[Link]((state) => {
[Link] ? [Link]() : [Link]();
vinculante
O método anterior, no entanto, desta forma, gera ERRO, pois não é possível ler setState(). Isso porque
em JavaScript, os métodos das classes não sãoassociarpor padrão. No método gestTime o thisappartene ao método
mesmo, mas não faz referência à classe, então é preciso fazer o binding, ou seja, associar o método à classe.
O binding vai fazer o construtor() com:
[Link] =[Link](this)
no nosso caso:
[Link] = [Link](this);
mas se temos muitos métodos, é preciso escrever isso para cada método no constructor(). Outra maneira equivalente
está em declarar o método como uma função de seta:
gestTime = () => {
[Link]((estado) => {
[Link] ? [Link]() : [Link]();
return {start: ![Link]};
})
}
Isso porque as arrow functions não implementam o this, então neste caso o this fará referência à classe.
aggiornaTempo = () => {
[Link]( {
orario : new Date()
});
}
gestTime = () => {
[Link]((state) => {
[Link] ? [Link]() : [Link]();
iniciar(){
[Link] = setInterval([Link], 1000);
}
parar(){
clearInterval([Link]);
}
componentDidMount() {
[Link]();
}
componentWillUnmount() {
[Link]();
}
ARRAY DE ELEMENTOS
Dado o exemplo de [Link]:
. . .
<Orologio paese = 'Italia' fusoorario = '0'/>
<Orologio paese = 'Usa' fusoorario = '-6'/>
. . .
vamos ver que contém apenas dois elementos <O relógio>, mas pode acontecer que em um componente haja muitos elementos
dello stessotpo e per questo possono essere gesttin array di elemented essere implementatdinamicamente.
Na classe ou fora dela, declaramos uma variável array const e nela vamos inserir tantos objetos quanto
são os elementos, que conterão as propriedades dos elementos. Para o nosso exemplo:
const clocks = [
{
paese: 'Italia',
fusoorario: 0
},
{
paese: 'Usa',
fusoorario: -6
}
]
Ora para pegar os dados do array e implementar dinamicamente os elementos<O relógio>, criamos no componente
classe um método que o gerencia e retornará tantos elementos<Orologio> quantos são os elementos disponíveis.
getOrologi(){
Usamos o metodomap() que executa uma função em cada elemento que recebe do array que o chama (clocks).
Finalmente chamamos o método no ponto em que os elementos devem ser listados, com:
{[Link]()}
Dessa forma, o método getOrologi() retorna um erro, pois em react, para cada elemento de um array, se espera
um valor único chave. Tipo um ID que o React usa para distinguir os elementos, então podemos adicionar um valor id
único ou usarei um valor do qual temos certeza de que seja único para cada elemento. No nosso exemplo, podemos usar o
proprietàpaesecome id:
getOrologi(){
return [Link]((clock) => {
retornar <Orologiokey = {[Link]}paese = {[Link]} fusoorario = {[Link]}/>
})
}
O arquivo [Link] no final será:
importar React de 'react';
import Orologio from './Orologio';
const clocks = [
{
paese: 'Italia',
fusoorario: 0
},
{
paese: 'Usa',
fusoorario: -6
}
]
getOrologi(){
retornar reló[Link]((relógio) => {
retornar <Orologio chave = {[Link]} paese = {[Link]} fusoorario = {[Link]}/>
})
}
renderizar() {
retornar (
<div className="App">
<h1>Hora Atual</h1>
{[Link]()}
</div>
)
}
}
REACT ROUTER
ReactRouter é uma biblioteca que permite criar aplicações React com várias páginas, onde a transição entre uma
a página e a outra ocorrem de forma dinâmica através do Javascript, sem precisar recarregar a página a cada vez.
No React, o Router não é nada mais do que um componente que roteiriza outros componentes.
Nelfile [Link] importamos dois componentes: BrowserRouter, que renomeamos por simplicidade para Router e Route.
importar {BrowserRouter como Router, Rota} de 'react-router-dom';
Envolvemos com o elemento <Router> todo o componente e uma série de elementos <Route> enclausurados em um <div>.
Os elementos <Route> têm um atributo path que indica para qual URL um certo componente deve ser exibido.
<Roteador>
<div>
<Route exact path="/" component={Home} />
<Route strict path="/team/" render={() => <h1>Team</h1>} />
</div>
</Roteador>
Dentro do componente Team, inserimos um Link que levará ao endereço localhost:3000/stagionee e não será
recarregar a página do navegador.
NavLink é uma versão particular de Link. Ele pode receber propriedades como activeClassName e activeStyle.
activeClassName="nomeClasse" dá um estilo quando um link está ativo.
ConactveStyle podemos passar um objeto através do qual podemos especificar o estilo que será aplicado
ao elemento NavLink quando a URL atual é igual ao valor do atributo 'to', ou seja, quando [Link] é
igual ao caminho especificado no atributo 'to'.
FUNÇÃO PURA
Uma função pura é uma função normal com duas características:
1 Dado um conjunto de entradas, a função deve sempre retornar a mesma saída.
2 Não produz efeitos colaterais.
Per esempio, una funzione é quella che resttuisce la somma di due numeri.
As funções puras dão uma saída estável e são determinísticas. Uma função se torna impura quando executa
algo diferente de calcular seu valor de retorno.
OS TRÊS PRÍNCIPES
A complexidade na gestão do estado de uma aplicação está na modificabilidade e na assíncrono. A solução de
Redux visa a remover esses dois aspectos, baseando-se em três princípios fundamentais:
1 existe uma única fonte de verdade
o estado de toda a aplicação é armazenado em um único objeto
2 o estado é somente leitura
não é possível modificar diretamente as informações armazenadas no estado do aplicativo; apenas
por meio de ações explícitas
3 as modificações ao estado devem ser feitas com funções puras
o estado atual é substituído por um novo estado gerado por funções exclusivamente com base em uma
ação e ao estado anterior
A aplicação desses princípios define a arquitetura do Redux e os limites que uma aplicação deve respeitar.
entende gerir o estado de acordo com esta abordagem.
VANTAGGI
Com Redux, as variações do estado de uma aplicação se tornam analisáveis e reproduzíveis, e é mais simples
compreender como se chegou a uma determinada situação
O Redux obriga a organizar o código seguindo um padrão específico, o que define indiretamente um
padrão de codificação.
É possível definir um estado inicial e fazer a aplicação partir desse estado, de modo a facilitar o
renderização de aplicações JavaScript a partir do servidor
É possível acompanhar as transições de estado tanto para depuração quanto para implementar ações.
INSTALAÇÃO
Se usarmos [Link], podemos instalar o Redux simplesmente com o seguinte comando:
npm install --save redux
che scarica ilpaccheto npm di Reduxe lo rende disponibile per poter essere importato nella applicazione.
Se não utilizamos um ambiente de desenvolvimento [Link], podemos sempre baixar a [Link]ão de
distribuzionedo pacote npm e inserindo uma referência dentro da página HTML da aplicação
<script src="[Link]"></script>
Neste caso, o Redux será acessível como uma variável global [Link].
Portanto, o fluxo geral para modificar o estado atual de uma aplicação segue os seguintes passos:
1 viene individuata unaAção, eventualmente generata tramite unCriador di Ação
2 taleActonviene inviata alloStoretramite unDispatch
3 Dentro da loja, um Reducer substitui o estado atual pelo novo estado identificado, se houver.
baseando-se na análise da Acton
Loja
O store é um grande objeto JavaScript que representa o estado atual da aplicação, e sempre que o estado
é atualizado, a visualização é revisualizada.
O estado completo da aplicação está dentro do objeto store.
A loja tem três métodos para se comunicar com o restante da arquitetura. São:
[Link]() para acessar a árvore do estado atual da aplicação.
[Link](action) para iniciar uma mudança de estado com base em uma ação.
[Link](listener) para ouvir qualquer alteração no estado. Será chamado toda vez que
uma ação é enviada.
[Link]
importar { criarLoja } de "redux";
Agora ouviremos quaisquer alterações na loja e, em seguida, com [Link](), o estado atual da loja.
[Link](() => {
[Link]("State has changed" + [Link]());
})
Acton/Criadores de Acton
Leactonsono são objetos JavaScript simples que enviam informações da aplicação para a loja. Se você tiver um
contador simples com um botão de incremento, ao pressioná-lo resultará em uma ação que é ativada, que se assemelha
a isto:
{
type: "INCREMENT",
payload: 1
}
O estado da loja só se modifica em resposta a uma ação. Cada ação deve ter uma propriedade de tipo (type) que
descreva o que pretende fazer a ação.
É aconselhável manter a ação pequena, pois representa a quantidade mínima de informações necessárias para
transformar o estado da aplicação.
No exemplo anterior, a propriedade type é definida como "INCREMENT", e uma propriedade adicional está incluída.
Carga que poderia ser renomeada para algo mais significativo.
Durante a escrita de código Redux, normalmente não se utilizam as ações diretamente, mas serão chamadas as
funções que retornam as ações chamadas criador de ações.
O criador do ato anterior de incremento será:
Portanto, para atualizar o estado do contador, é necessário enviar a ação incrementCount assim:
[Link](incrementarContagem(1));
Então, precisamos dos reducers para converter as informações fornecidas pela ação e transformar o estado da loja.
Redutores
O redutor utiliza as informações das ações para atualizar efetivamente o estado.
Um reducer deve ser uma função pura. Dado um conjunto de entradas, deve sempre retornar a mesma saída.
Além disso, não deveria fazer mais nada.
il reducer per il nostro contatore.
REDUX E REACT
Vimos que com Redux enviamos ações e recuperamos o novo estado utilizando [Link]() e
[Link]().
Agora vamos aprender a conectar uma loja Redux com o React, com a biblioteca react-redux veremos
come:
1 organizar os componentes de contêiner e os componentes de apresentação
Como conectar React e Redux utilizando connect()
3come spedire le azioni utilizzandomapDispatchToProps
4como recuperar o estado utilizando mapStateToProps
2) A biblioteca react-redux
Para conectar o React ao Redux, será necessário instalar uma biblioteca suplementar chamada react-redux.
npm instalar --save react-redux
A biblioteca exporta apenas duas APIs que é necessário lembrar, um componente <Provider/> e uma função de
ordem superiorconnect().
3) Il componente Provider
Toda a aplicação deve poder acessar a loja. O Redux precisa tornar acessível a loja dos
dá a toda a árvore do componente react a partir do componente principal. O Provider permite
passar os dados de cima para baixo adicionando o estado a todos os componentes.
[Link](
<Provider store={store}>
<Aplicativo />
</Fornecedor>,
[Link]('root')
)
Envolvemos o provedor em torno do componente do aplicativo e assim os descendentes do componente têm acesso
ai dati.
4) O método connect()
Colocamos o store à disposição da aplicação, precisamos conectar o react com o store. O único
O modo como é possível comunicar com a loja é enviando ações e recuperando o estado.
connect() permite, portanto, conectar o React com o store, e com a ajuda de dois métodos:
mapDispatchToProps, mapStateToProps, para mapear e passar, apenas as dispatch e a parte do store
interessati al componente dumb React come props.
Vamos agora a um exemplo concreto de uma aplicação de Agenda Telefônica com as seguintes características:
. visualizar todos os contatos
. adicionar um novo contato
. remover contato
componentes: conterrá i componentedumb di React, a cui non importa se si sta utlizzando Redux o meno.
containers: conterrá i componentsmart di React che invia azioni allo store di Redux. L'associazione tra
redux e react ocorrerá aqui.
actons: conterrá gli acton creators.
reducers: cada reducer tem um único arquivo, este diretório conterá toda a lógica dos reducers.
arma: conterrá a lógica para a inicialização do estado e a configuração da loja.
Este modelo de estrutura é adequado para aplicações pequenas e médias. Quando o aplicativo cresce, pode
é mais conveniente considerar o modelo de domínio, onde cada funcionalidade terá um diretório próprio, e tudo
o que diz respeito a essa funcionalidade estará dentro dela.
3) Inicialização da loja
É uma boa prática esboçar imediatamente, mesmo no papel e caneta, um esquema do estado, em um único objeto, com os
propriedade de que precisa.
Em seguida, na diretório Store, criamos o arquivo [Link] e inicializamos a loja:
const initialState = {
contactList: [],
newContact: {
name: '',
email: '',
tel: ''
}
}
Notamos que ele recebe dois parâmetros: o rootReducer e o estado inicial initialState (opcional)
Importamo initalState creato precedentemente.
Os reducers criados deverão se tornar as propriedades do combineReducers e, por isso, devem ser importados.
inserir com o mesmo nome da propriedade da peça de estado que diz respeito a
5) Criação do rootReducer
Este será o reducer principal que unirá em um único reducer todos os reducers da aplicação.
Na pasta reducers, criamos um arquivo [Link], com combineReducers vazio que unirá os reducers que
criaremos posteriormente.
}
)
E uma vez criado, nós o importamos no arquivo [Link] para passá-lo ao createStore.
[Link](
<Provider store={store}>
<App />
</Provedor>,
[Link]('root')
)
dopodiche’ com
export default connect(mapStateToProps, null)(ContactsList)
Um elemento que nos permite salvar dentro do navegador informações relevantes para a navegação do site é
icookies. Mas o maior problema dos cookies é que, para lembrar das informações salvas, o navegador deve
trocar mensagens de estado com o servidor a cada nova página que o usuário visita; esta característica, sobretudo
nei sitdove è possibile prenotare viaggi o abitazioni, si traduce in un grande spreco di risorse che potevano essere
utilize para acelerar o tempo de resposta dos sites.
Graças ao advento do HTML5, foram introduzidos objetos que nos permitem salvar os dados fornecidos pelo usuário.
dentro de seus navegadores: sessionStorage e localStorage.
Ambos compartilham as mesmas propriedades e funções, as diferenças entre os dois são que: o sessionStorage perderá todos
quando a janela do navegador for fechada.
Enquanto tudo o que salvamos dentro de um objeto localStorage será mantido dentro do navegador e
resistirá também ao desligamento do computador.
Dentro deste objeto, podemos salvar apenas strings de texto, assim como para os cookies, mas indo para
utilizar o localStorage e o sessionStorage atende às necessidades, não será necessária nenhuma comunicação com o
servidor dado que a página web poderá interrogar diretamente o navegador.
Vamos ver especificamente o localStorage, mas será o mesmo para o sessionStorage.
setItem() aceita dois parâmetros. O primeiro será o índice e permitirá chamar posteriormente o valor que
abbiamo impostato, il secondo è il valore vero e proprio che vogliamo salvare all’interno del browser.
Os dados poderão ser visualizados na inspeção do navegador
Vejamos que a ação lançada por [Link]() passa por uma série de Middleware. Para que a Ação
vem enviado ao Middleware seguinte, ou ao Reducer no caso do último Middleware, é necessário invocar a função
next(action) que é passado pelo Redux para cada Middleware.
In Redux sono partcolarmente importantperche rappresentano il punto dell'applicazione in cui e’ possibile fare
ações assíncronas como: chamadas de API, tempo limite, etc.
Uma característica importante, como pode ser visto na imagem, é que podem ser inseridos mais middleware em cadeia.
e executem na ordem um após o outro.
Dada uma pilha de middleware em cadeia, quando se realiza uma dispatch, na prática é chamado o primeiro
middleware. Em geral, um middleware verificará se a ação é de um tipo específico que lhe interessa, semelhante a como
faria um redutor. Se for do tipo certo, pode executar uma lógica personalizada, caso contrário, passa a ação ao
próximo middleware na pilha.
A diferença de um reducer, um middleware pode ter efeitos colaterais internos, incluindo pausas e outras lógicas.
assíncrono.
Uso de middleware
1) Defina a função middleware
Para usar middleware no Redux, primeiro é necessário definir a função middleware, que deve ter uma definição precisa
segnatura.
// ou de maneira equivalente
função mioMiddleware(loja) {
retornar função (próximo) {
retornar função (ação) {
// corpo da função Middleware
};
};
};
Dentro do middleware temos acesso ao Actonlanciata [Link](acton). Podemos usar a função
next(acton) para fazer passar o Acton ao longo da cadeia de middleware, invocará o próximo middleware, se não
quando a função é invocada, a ação não é passada para o próximo middleware.
Dentro de cada middleware, também temos acesso aos métodos [Link]() para recuperar o objeto State
corrente e [Link]() che è la funzionedispatch()originale. Utlizzando questa funzione, potremo far
recorrer ao objeto toda a cadeia de middlewares já atravessados antes do middleware atual.
In questo caso specifico atendiamo l’esecuzione di eventualimiddlewaresuccessivi prima di scrivere sulla console il
novo estado. Se não fizermos assim, obteremos o estado atual, em vez do seguinte.
Uma vez definido o middleware, tornamo-lo disponível para o Redux com
Isso fará com que cada transição de estado seja rastreada no console do navegador:
No caso de tivermos mais middleware para executar antes do reducer, podemos passá-los como parâmetros da
função aplicarMiddleware():
A ordem de execução dos middleware seguirá a ordem em que as funções são passadas como parâmetro.
adapplyMiddleware().
CHAMADAS ASSÍNCRONAS COM REACT REDUX
Vamos agora ver como fazer chamadas assíncronas a um servidor com React Redux.
Podemos simular um servidor local com json-server, disponível para download no Npm, com os dados em json para servir. Uma vez
instalado, é necessário criar o arquivo json para servir ([Link]) lançar o servidor com:
json-server --watch [Link] --port3005--nc
Agora precisamos conectar nosso aplicativo para ler os dados deste servidor.
Até agora, vimos ações síncronas onde o objeto payload com os dados ia para o armazenamento, mas neste caso os dados
eles estarão no servidor e, portanto, é necessário fazer uma chamada assíncrona ao servidor para obter os dados.
Para gerenciar chamadas assíncronas, o React utiliza middlewares, para facilitar o trabalho existem diferentes pacotes, incluindo
redux-promise-middleware. Isso permite gerenciar criadores de ações assíncronas, com a diferença de que, neste
caso, o payload recebe uma promise:
const asyncAction = () => ({
type: ‘PROMISE’,
payload: new Promise(…)
})
Dada uma ação com um payload assíncrono, o middleware transforma a ação em uma ação pendente ou uma ação
cumprido/rejeitado, que representa os estados da ação assíncrona.
Após descarregar o pacote, no index é necessário importá-lo e passá-lo para o store:
Para dialogar com o servidor, usamos o fetch(), ou outros pacotes, que permitem uma gestão das chamadas.
asincrona baseada em promessas
REACT HOOKS
Sono statintrodotcon React 16.8 e in pratca sono funzioni che consentono di inserire uno stato hai componentdi
tpo functon, mais simples do que aqueles ditpo classe.
useState()
Para adicionar um estado a um componente do tipo função, usa-se useState que deve ser importado de
React. useState é uma função que é definida com:
const[variavel, setVariavel] = useState(valorInicial);
ou seja,essa retorna um par de valores: o valor do estado atual e uma função que permite
atualizá-lo(dispatch).
É semelhante a [Link] de uma classe.
O único parâmetro do useState é o seu estado inicial.
useEffect()
Dice a React che il componente deve fare qualcosa dopo il rendering. React ricorderà la funzione passata e la
Ele ligará mais tarde, após ter executado as atualizações DOM, a cada modificação.
Desempenha as mesmas funções componentDidMount, componentDidUpdate e componentWillUnmount.