Escolar Documentos
Profissional Documentos
Cultura Documentos
Dominando o Vue.js
Mastering Vue.js ajuda o leitor a dominar a estrutura JavaScript Vue.js para um desenvolvimento
front-end mais rápido e robusto.
Vue é um popular framework front-end JavaScript que está se expandindo rapidamente. É fácil
de usar, pequeno (menos de 24 KB) e muito rápido. É simples incluir em outros aplicativos e
bibliotecas. O Vue.js é fácil de instalar e os iniciantes podem aprender rapidamente como usá-
lo e começar a criar seu design de interface.
O que torna o Vue especial é que ele é diferente da maioria dos outros trabalhos e bibliotecas
de quadros JavaScript. Ao contrário de outras estruturas monolíticas, ela é construída desde o
início para ser adaptável de forma incremental. A biblioteca principal concentra-se principalmente
na camada View e é fácil de usar e combinar com outras bibliotecas ou projetos. Por outro lado,
quando mesclado com pilhas e bibliotecas contemporâneas, ele é perfeitamente capaz de
fornecer poderosos aplicativos da Web de página única.
Trabalhar com Vue.js pode ser divertido. Aproveitar o Vue e seus plug-ins pode ajudar a criar
facilmente excelentes aplicativos compatíveis com a Internet e smartphones. O Vue é
compacto e personalizável, e vem com vários recursos para gerenciamento de estado
inteligente e opções de navegação. Dito e feito, aprender Vue é uma excelente opção de
carreira, especialmente porque está ganhando popularidade rapidamente entre startups e empresas.
O Vue é uma excelente escolha se você deseja criar um aplicativo altamente envolvente,
flexível e baseado em dados. Tem um layout fácil de entender que você pode aprender em minutos.
Ao contrário do Angular ou do React, o Vue.js não tem muitos desafios ou conceitos para
dominar. É uma excelente escolha para programadores que buscam aprender uma nova
tecnologia para seu próximo projeto.
Com o Mastering Vue.js, aprender Vue torna-se muito simples, o que certamente ajudará os
leitores a progredir em suas carreiras.
A série Mastering Computer Science é editada por Sufyan bin Uzayr, um escritor e educador
com mais de uma década de experiência no campo da computação.
Machine Translated by Google
Mastering Vue.js
Guia para iniciantes
Editado por
Esforços razoáveis foram feitos para publicar dados e informações confiáveis, mas o autor e o editor não podem assumir a
responsabilidade pela validade de todos os materiais ou pelas consequências de seu uso.
Os autores e editores tentaram rastrear os detentores dos direitos autorais de todo o material reproduzido nesta publicação e
pedem desculpas aos detentores dos direitos autorais se a permissão para publicar neste formulário não foi obtida. Se algum
material protegido por direitos autorais não tiver sido reconhecido, por favor, escreva-nos e informe-nos para que possamos
corrigi-lo em qualquer reimpressão futura.
Exceto conforme permitido pela Lei de Direitos Autorais dos EUA, nenhuma parte deste livro pode ser reimpressa, reproduzida,
transmitida ou utilizada de qualquer forma por qualquer meio eletrônico, mecânico ou outro, agora conhecido ou futuramente
inventado, incluindo fotocópia, microfilmagem e gravação, ou em qualquer sistema de armazenamento ou recuperação de
informações, sem permissão por escrito dos editores.
Para obter permissão para fotocopiar ou usar material eletronicamente deste trabalho, acesse www.copyright.com ou contate o
Copyright Clearance Center, Inc. (CCC), 222 Rosewood Drive, Danvers, MA 01923, 978-750-8400. Para obras que não estão
disponíveis no CCC, entre em contato com mpkbookspermissions@tandf. co.uk
Aviso de marca comercial: nomes de produtos ou empresas podem ser marcas comerciais ou marcas registradas e são
usados apenas para identificação e explicação sem a intenção de infringir.
DOI: 10.1201/9781003310464
Composto em Minion
por KnowledgeWorks Global Ltd.
Machine Translated by Google
Conteúdo
Prefácio, xv
Sobre o autor, xvii
VANTAGENS E DESVANTAGENS 8
Vantagens 8
Fácil de aprender 8
progressividade 9
Comunidade e suporte 9
Leve 10
Acéfalo 10
Senso comunitário 10
Dominante 10
Duas Caras 11
Dividir e conquistar 11
Ferramentas e bibliotecas 11
Simplicidade 12
Documentação 12
Reatividade 12
Componentes e Reutilização 12
em
Machine Translated by Google
vi ÿ Conteúdo
Flexibilidade 13
Tamanho minúsculo
14
Fácil de aprender 16
Documentação Concisa 16
Suporte da comunidade 16
Desvantagens 16
Barreira de língua 16
Complexidade de reatividade 17
Recursos limitados 17
Falta de Escalabilidade 18
Falta de plugins 18
Comunidade pequena 18
Pacote Pobreza 18
Pequeno 19
Fácil de entender 19
Integração Simples 19
Flexibilidade 20
ótimas ferramentas 20
CONCLUSÃO 21
Machine Translated by Google
Conteúdo ÿ vii
JSXGenericName
23
Pré-requisitos 24
CONFIGURAR 29
Adereços 30
Contexto 31
Uso deste 34
Primeiro Componente 34
Componentes em Visualização 34
ADEREÇOS 42
Tipos de Prop 43
Passando um Número 44
Passando um Booleano 44
Passando um Array 44
Passando um Objeto 44
Fluxo de Dados 45
Unidirecional 46
Validação de 47
viii ÿ Conteúdo
ESTADO 50
O auxiliar mapState 52
MÉTODOS 53
CONCLUSÃO 57
v-se 65
v-senão 66
v-show 68
else-if 68
Concluindo 69
ESTILO 70
Pré-requisitos 80
Machine Translated by Google
Conteúdo ÿ ix
Sintaxe de Objeto 85
Sintaxe de Array 87
COMPONENTES DE ESTILO 88
Nenhuma política de 88
classes Design 88
94
CONCLUSÃO 95
CONCLUSÃO 103
Começando 105
Roteador-Link 111
home.vue 116
Machine Translated by Google
x ÿ Conteúdo
detalhes.vue 116
Transição 118
App.vue 118
roteador 124
main.js 127
App.vue 128
views/Helloeveryone.vue 128
main.js 129
URLSearchParams 130
main.js 130
App.vue 131
components/Helloeveryone.vue 131
CONCLUSÃO 132
router.go(n) 138
router.push() 140
Conteúdo ÿ xi
142
dinâmicas de 150
CONCLUSÃO 155
contexto? 160
criarContexto 163
Fornecedor 163
Consumidor 163
Machine Translated by Google
xii ÿ Conteúdo
useContext 164
cuidado 175
context.attrs 178
context.slots 179
context.emit 181
CONCLUSÃO 182
Adicionando 185
VUE.JS-TESTING-LIBRARY 198
Introdução 198
Machine Translated by Google
Conteúdo ÿ xiii
Instalação 199
204
O problema 204
A solução 204
CONCLUSÃO 206
Resumo 218
xiv ÿ Conteúdo
Modificadores 225
225
.aparar 226
O básico 226
de entrada 230
CONCLUSÃO 235
BIBLIOGRAFIA, 237
ÍNDICE, 243
Machine Translated by Google
Prefácio
A série Mastering Computer Science abrange uma ampla gama de tópicos, abrangendo
linguagens de programação, bem como estruturas e tecnologias modernas. A série tem
foco especial em conteúdos para iniciantes, e é apresentada de forma de fácil
compreensão, sendo composta por:
• Uma abordagem guiada para programação, com tutoriais passo a passo para
iniciantes,
A série Mastering Computer Science é editada por Sufyan bin Uzayr, um escritor e
educador com mais de uma década de experiência no campo da computação.
xv
Machine Translated by Google
Machine Translated by Google
Sobre o autor
xvii
Machine Translated by Google
Machine Translated by Google
Capítulo 1
Introdução ao Vue.js
NESTE CAPÍTULO
ÿ O que é Vue.js?
ÿ Vantagens e Desvantagens
É difícil entender o que é Vue.js e seu uso no início deste capítulo. Vamos dar uma olhada
no que é Vue.js.
O QUE É Vue.js?
Evan, você projetou o Vue depois de trabalhar para o Google e utilizar o AngularJS em
vários aplicativos. “Penso, e se eu pudesse simplesmente isolar a parte que realmente
amo no Angular e desenvolver algo incrivelmente leve”, disse ele mais tarde. O primeiro
código-fonte enviado para o projeto foi em julho de 2013 e o Vue foi publicado em fevereiro
do ano seguinte.
Os nomes das versões são frequentemente retirados de mangá e anime, os principais
ity dos quais são ficção científica.
Vue.js é usado principalmente para criar interfaces web e aplicativos de uma página.
No entanto, as extensões HTML e a base JS trabalhando em combinação com uma
estrutura Electron também podem ser usadas para desenvolvimento de aplicativos para
desktop e dispositivos móveis, tornando-a uma ferramenta popular de front-end.
O Vue emprega a arquitetura clássica Model View Controller (MVC) para visualizar a
interface de usuário (UI) de um aplicativo ou site, com sua biblioteca principal servindo como
DOI: 10.1201/9781003310464-1 1
Machine Translated by Google
No entanto, visa corrigir os problemas que existiam com Angular e React. Claro, o
Vue.js tem vantagens e desvantagens, mas as últimas superam as primeiras. É de código
aberto e apoiado por doações de patrocinadores e parceiros como Vehikl, Modus Create,
Rangle, Laravel, StoreKit, DevExpress, etc.
Introdução ao Vue.js ÿ 3
O Vue.js é conveniente porque é personalizável e leve, mas isso não diminui seu
potencial, comparável ao de trabalhos de estrutura mais volumosos, como React e
Angular. Qualquer pessoa com conhecimento prévio em programação de front-end deve
ser capaz de aprender em questão de dias.
Basta ter um entendimento básico das “três grandes” tecnologias de desenvolvimento
da Web: JavaScript, HTML e CSS. Outros frameworks, como Angular e React, precisam
que você aprenda outras linguagens para utilizá-los com sucesso; no caso do Angular,
você deve aprender TypeScript, enquanto o Vue.js não.
Vue (pronuncia-se /vju/, como view) é uma estrutura para IUs progressivas.
Ao contrário de outras estruturas monolíticas, o Vue foi projetado desde o início para ser
adotado de forma incremental. A biblioteca principal é restrita à camada de exibição e é
fácil de integrar com outras bibliotecas ou aplicativos existentes.
Por outro lado, o Vue é totalmente capaz de alimentar aplicativos de página única
(SPAs) complicados quando integrado a tecnologias modernas e bibliotecas associadas.
2. As diretivas Vue.js são propriedades HTML que começam com a letra v-.
<modelo>
<div id="tuto">
<button-clicked v-bind:initial-count="0"> </buttonclicked>
</div> </template>
<script>
Vue.component('button-clicked', { props:
['initialCount'], data: () => ({ count:
0, }), template:
'<button v-
} }, assista:
{ count(newValue, oldValue) {
Machine Translated by Google
Introdução ao Vue.js ÿ 5
} }, métodos:
{ onClick()
{ this.count += 1;
} }, montado()
{ this.count = this.initialCount;
} });
O Vue usa uma sintaxe de modelo baseada em HTML que permite que o DOM visível seja
conectado aos dados subjacentes da instância do Vue. Todos os modelos Vue são HTML válidos
que podem ser processados por navegadores e analisadores de HTML que suportam o padrão.
Os modelos são compilados em métodos de renderização Virtual DOM pelo Vue. O Vue usa um
Virtual DOM para renderizar componentes na memória antes de atualizar o navegador. Quando
usado com o sistema de reatividade, o Vue pode identificar o menor número de componentes para
renderizar novamente e o menor número de operações DOM quando o estado do aplicativo muda.
Vue.js é mais usado para criar interfaces web e aplicativos de uma página. No entanto, devido
às extensões HTML e à base JS trabalhando em combinação com uma estrutura Electron, ela
também pode ser usada para desenvolvimento de aplicativos para desktop e dispositivos móveis,
tornando-a uma ferramenta popular de front-end.
Embora o JavaScript seja uma linguagem completa por si só, seu ecossistema inclui muito
mais do que a própria linguagem. Os frameworks, por exemplo, facilitam a vida de um
desenvolvedor ao estabelecer as bases para uma linguagem mais fluida.
Machine Translated by Google
A incapacidade de trocar links para a “sub” página específica dentro de uma determinada
página da web tem sido tradicionalmente uma limitação dos SPAs. Como os SPAs fornecem
apenas uma resposta baseada em URL do servidor (index.html ou index.vue), marcar certas
telas ou compartilhar links para partes específicas é difícil, se não impossível. Para resolver
esse problema, vários roteadores do lado do cliente delimitam URLs dinâmicos usando um
“hashbang” (#! ), por exemplo, page.com/#!/.
No entanto, os navegadores mais recentes permitem o roteamento HTML5 sem hashbangs.
O Vue fornece uma interface para modificar o que é exibido na página com base no
caminho da URL atual, independentemente de como foi alterado (seja por link enviado por e-
mail, atualização ou links na página). Além disso, a utilização de um roteador front-end
permite a mudança proposital do caminho do navegador quando ocorrem eventos do
navegador (como cliques em botões ou links). O Vue não inclui roteamento de hash de front-
end. O pacote “vue-router” de código aberto, por outro lado, inclui uma API para atualizar a
URL do aplicativo, um back
Machine Translated by Google
Introdução ao Vue.js ÿ 7
<div id="aplicativo">
<router-view></router-view> </div>
...
<script>
...
const User =
{ template: '<div>User {{ $route.params.id }}</div>' };
] });
...
</script>
O código é o seguinte:
• Permite que o componente User passe o id do usuário que foi colocado na URL
usando o campo params do objeto $route: $route. params.id.
VANTAGENS E DESVANTAGENS
Vamos começar com as vantagens de utilizar o Vue.js.
Vantagens
Fácil de
aprender O Vue.js é avançado entre os desenvolvedores porque é personalizável e leve,
mas isso não diminui seu potencial, que é comparável ao de estruturas mais volumosas,
como React e Angular. Qualquer pessoa com conhecimento prévio em programação front-
end deve ser capaz de fazer isso em questão de dias.
Introdução ao Vue.js ÿ 9
Angular e React, precisam que você aprenda outras linguagens para utilizá-las com
sucesso; no caso do Angular, você deve aprender TypeScript, enquanto o Vue.js não.
Progressividade
O quadro é precisamente caracterizado como progressivo, o que indica que pode ser
usado lentamente; gradualmente adiciona marcação extra ao código HTML. Como
resultado, ele se ajusta às demandas do desenvolvedor em vez de forçá-lo a atualizar
um programa existente ou estabelecer um servidor.
O Vue.js pode ser colocado em seu código HTML como um elemento de script
básico e se expande gradualmente para atender às suas demandas, eventualmente
gerenciando toda a camada. É por isso que é conhecido como o “novo jQuery” em
certos lugares. Este é um dos maiores benefícios do uso do Vue.js, particularmente
ao fazer a transição de outro framework.
Comunidade e suporte
Angular é suportado pelo Google, React pelo Facebook, mas Vue.js é totalmente
suportado pela comunidade de código aberto, contando com contribuições de
desenvolvedores locais e doações de patrocinadores para seguir em frente.
No entanto, o último conseguiu desafiar severamente o Angular e o React como o
framework de desenvolvimento web preferido.
É por isso que é referido como “novo jQuery” em certos lugares. Este é um dos
maiores benefícios do uso do Vue.js, particularmente ao fazer a transição de outro
framework. Quando se trata de atualização de conteúdo e manuais de ajuda, a
plataforma também obedece a ciclos de lançamento previsíveis.
mundos Outro benefício do Vue.js é que, por ser influenciado por Angular e React, ele
aprende e combina todos os melhores recursos de cada um enquanto remove os que
não são ideais. O Vue.js, por exemplo, usa o Virtual DOM de forma semelhante ao
React, mas emprega gerenciamento de dependência automatizado para identificar
quais componentes devem ser renderizados novamente quando o estado muda.
Isso não acontece por padrão no React, e você deve aplicar explicitamente a função
ComponentUpdate a cada componente. O Vue.js também usa algum vocabulário de
modelagem semelhante ao Angular, mas sem exigir que os desenvolvedores aprendam
uma nova linguagem (TypeScript). Este ainda é um argumento convincente para
contratar desenvolvedores Vue.js.
Machine Translated by Google
O Lightweight
Vue.js é um framework pequeno, hilariante. São apenas 18 kilobytes – piscar é
mais rápido do que baixar.
Acéfalo
O Vue.js é extremamente simples de aprender e, devido a esse recurso, tem sido o principal
impulsionador de sua popularidade e uso crescente entre os programadores.
Para começar a escrever com Vue, você não precisa de conhecimento especializado em
bibliotecas, JSX ou TypeScript, como em Angular ou React. Tudo o que é necessário é um
conhecimento básico de HTML, CSS e JavaScript.
Senso de comunidade
A comunidade Vue.js online é nada menos que incrível. A estrutura de
financiamento coletivo da plataforma, bem como o fato de não ser suportada
por um Facebook ou Google empresarial, rendeu ao Vue um culto de
seguidores. Como resultado, existem várias instruções para ajudá-lo, bem como
grupos Reddit e Discord extremamente movimentados, onde algum Harry útil
poderá responder corretamente às suas perguntas.
Dominante
Conforme declarado anteriormente, um DOM é uma representação de objeto vinculado de
páginas HTML que compreende estilos, elementos e conteúdo da página. Isso resulta em um
Machine Translated by Google
Introdução ao Vue.js ÿ 11
árvore genealógica invertida, com o documento se ramificando em seus vários componentes, ligados
por linhas que mostram os relacionamentos.
O navegador deve atualizar as informações e apresentá-las na tela do usuário quando os objetos
alteram seu estado à medida que o usuário interage com a página da Web baseada em HTML. Essa
é uma abordagem demorada e ineficiente, pois a página inteira deve ser atualizada, mesmo que
apenas um objeto seja alterado. Vue. js faz uma duplicata virtual do DOM original e determina quais
elementos precisam ser atualizados sem renderizar novamente o DOM completo, aumentando
significativamente a eficiência e a velocidade do aplicativo.
A ligação de
dados bidirecional do Two Faced Angular foi passada para o Vue.js. Este link conecta as alterações de
dados do modelo à exibição da interface do usuário. Isso simplifica o processo de atualização dos
componentes conectados e o rastreamento dos dados que são atualizados.
No Vue.js, os dados vinculados são atualizados em tempo real à medida que os objetos DOM
mudam e essa capacidade de resposta torna a atualização de dados mais sucinta e muito mais fácil.
Essas seções de código podem ser usadas como modelos para outras partes do sistema.
Por serem salvos em arquivos distintos, o layout é extremamente simples de ler e compreender –
facilitando o gerenciamento e a correção. O teste pode determinar como até mesmo os menores
componentes do programa funcionam por conta própria.
O Vue.js pode interagir com qualquer aplicativo existente devido à sua versatilidade. É baseado
em JavaScript e não requer nenhuma outra ferramenta para funcionar.
Mudar de React ou Angular para Vue.js não oferece problemas porque o Vue é um mashup dos dois e
pode se comunicar com o Model View Controller e o CBA.
Ferramentas e bibliotecas
• CLI oficial do Vue.js: as principais bibliotecas do Vue e plug-ins de terceiros devem ser
desenvolvidos e instalados.
Como resultado, oferece uma grande vantagem sobre rivais como React e
Angular em termos de seu parâmetro de alta velocidade.
Simplicidade
A sintaxe do Vue.js não é apenas simples e fácil de aprender, mas os desenvolvedores que já
lidaram com JavaScript também podem aprendê-la rapidamente. Sua estrutura é intuitiva e seus
componentes, que são efetivamente uma fusão de recursos HTML e JavaScript, são simples de
instalar.
Sua simplicidade ajuda os desenvolvedores que desejam melhorar a taxa de síntese do
modelo de string enquanto diminuem os erros de código. Também pode ser ativado com uma única
tag de script.
Documentação
Além de sua sintaxe concisa, o framework Vue.js é extremamente amigável. O Vue.js é muito bem
documentado – os cursos de vídeo de documentação e a excelente biblioteca principal, que se
concentra na camada de exibição, facilitam a compreensão e a implementação dos princípios.
Reatividade
Uma das características que distinguem o Vue.js de outros frameworks é seu mecanismo de
reatividade. Sua interação com HTML e JavaScript simplifica a vinculação de dados entre essas
estruturas no Vue.js.
O Vue.js também é mais do que capaz de lidar com uma operação de vinculação de dados
reativa bidirecional, tornando-o uma excelente escolha para um projeto da Web que exige alterações
em tempo real.
Introdução ao Vue.js ÿ 13
Flexibilidade
O JavaScript há muito é reconhecido por sua adaptabilidade; é uma estrutura considerada
uma das linguagens de programação mais adaptáveis.
No entanto, com a evolução do front-end do Vue, essa versatilidade agora atingiu novos
patamares. Isso foi permitido, pois requer principalmente Java-Script e nenhum outro plug-
in.
As opções para gerar componentes são ilimitadas; não existe um método “correto”
para realizar as coisas. Os modelos no Vue podem ser escritos em HTML, JavaScript ou
até JSX. A estrutura baseada em componentes e o código leve do Vue facilitam a
integração em qualquer projeto.
Os desenvolvedores familiarizados com as estruturas React ou Angular terão poucos
problemas para migrar para o Vue. É efetivamente um híbrido das características de
ambos os frameworks. Como resultado, usando o Vue, você pode desenvolver seu
aplicativo usando qualquer técnica e estrutura que achar adequada.
Machine Translated by Google
Tamanho
minúsculo Este ponto será tão pequeno quanto o próprio Vue: o pacote zip do framework
tem apenas 18 KB de tamanho. Como uma estrutura leve, ele não apenas baixa e instala
rapidamente a biblioteca, mas também aprimora seu SEO e UX.
Lembre-se de que cada teste de desempenho é específico para cada caso: na prática,
a maior parte do desempenho é derivada da otimização e qualidade do código.
Introdução ao Vue.js ÿ 15
Fácil de
aprender Uma ferramenta só pode ser adotada em massa se for simples de
compreender, o que pode ser o caso do aprendizado do Vue.js. O Vue não precisa
de um conhecimento extensivo de bibliotecas, JSX e TypeScript para começar a
escrever, como normalmente acontece com outras tecnologias de front-end. Tudo o
que você precisa para começar é um conhecimento básico de HTML, CSS e JavaScript.
O Vue é compatível com os editores de código mais populares, incluindo Sublime
Text, Visual Studio e Atom, facilitando a experiência. A comunidade, que responde
regularmente a perguntas no bate-papo e no fórum do Discord, é bastante receptiva
aos recém-chegados. Além disso, vários manuais e cursos estão disponíveis
imediatamente na página inicial do Vue.js.
Documentação Concisa
Suporte da comunidade
Os membros da comunidade são bastante ativos tanto na conversa do Discord quanto
no fórum. Olha só a quantidade de tags Vue.js no Stack Overflow, que já passa de 41
mil. Isso foi tudo sobre os benefícios do Vue. Agora, vamos olhar para as desvantagens,
um por um.
Desvantagens A
adoção do
Language Barrier Vue por empresas como Xiaomi e Alibaba ajudou na popularização
da estrutura e na criação de demanda no mercado de trabalho. Com o Vue.js se
tornando mais popular na China, uma parte substancial de seu material e debates
são, previsivelmente, em chinês.
O Grande Firewall chinês complica as coisas naquele país, já que muitos
recursos populares estão temporariamente indisponíveis. Como resultado, entender
e utilizar React ou Angular se torna mais complexo. Vue é uma opção mais atraente.
Machine Translated by Google
Introdução ao Vue.js ÿ 17
Como resultado, se você pesquisar conteúdo Vue, sem dúvida encontrará conversas
em fóruns, descrições de plug-ins e instruções em chinês. Isso pode ser um desafio para
engenheiros que só entendem inglês.
Complexidade de
reatividade Já discutimos como o Vue usa a vinculação de dados bidirecional para
gerenciar alterações de DOM. Embora seja uma ferramenta útil para manter os
componentes coordenados, há um problema em como o sistema de reatividade, como é
conhecido, opera.
Em termos mais simples, o aplicativo Vue.js é construído de componentes com os
quais o usuário pode interagir. Quando um componente é ativado por um usuário, um
observador redesenha os dados. O mecanismo de reatividade apenas redesenha blocos
de dados que foram acionados. O problema é que ele não é muito inteligente e
frequentemente comete erros na leitura dos dados; portanto, requer que os dados sejam simplificados.
No entanto, este é um problema reconhecido e é abordado na documentação do
Vue, que fornece instruções sobre como configurar a reatividade corretamente.
Risco de excesso de
flexibilidade Afirmamos flexibilidade, que é uma qualidade controversa no contexto de
um grande projeto. Dar à sua equipe de desenvolvimento muitas alternativas pode
resultar em técnicas de programação ideologicamente opostas em conflito dentro da
mesma equipe. Como resultado, em vez de ser um software funcional, é um anulador
final.
Recursos limitados
Falta de escalabilidade
Agora é usado principalmente para desenvolver programas da Web leves, como
aplicativos de página única e UIs. Falta-lhe a escalabilidade necessária para construir
aplicativos complexos e enormes. Isso pode ocorrer porque o trabalho de estrutura
ainda é um esforço independente, sem o apoio de um gigante tecnológico. Essa
restrição, no entanto, é genuína e deve ser considerada ao selecionar a pilha de
tecnologia para seu aplicativo.
Falta de Plugins
Por não ser tão bem estabelecido quanto Angular e React, contém menos plugins que
os dois últimos. Normalmente, os desenvolvedores devem recorrer a linguagens
alternativas para enfrentar os obstáculos impostos por esse problema.
Pequena comunidade
Existem inúmeras invenções e atividades acontecendo na comunidade, embora a
comunidade seja pequena e composta principalmente por pessoas que não falam
inglês. Mas não se preocupe se você contratar da ProCoders; nossos profissionais são
fluentes em inglês e possuem ampla experiência com o framework.
Poverty Pack
Como resultado, porque o Vue.js é financiado e mantido pela comunidade e carece de
grandes fundos; carece de ajuda para adaptação a aplicações de tamanho generoso.
A tecnologia não é confiável ou bem suportada o suficiente para fornecer soluções
rápidas para bugs que uma grande corporação esperaria – e que podem ser fornecidas
pelo suporte React ou Angular.
Além disso, enquanto novas ferramentas estão sendo construídas, Vue.js ainda tem um longo
caminho a percorrer em comparação com o grande número de ferramentas que React e Angular
têm à sua disposição.
Introdução ao Vue.js ÿ 19
Apesar disso, o Vue está vendo uma demanda crescente de gigantes de TI como
IBM e Adobe, embora em projetos menores.
tem várias vantagens sobre outros JS frameworks. Alguns deles estão listados abaixo.
Pequeno
A escala da estrutura JavaScript determina seu sucesso. Quanto menor o tamanho, mais
frequentemente ele será utilizado. Uma das vantagens mais significativas do Vue.js é
seu tamanho modesto. Essa estrutura tem 18 a 21 KB de tamanho e não leva tempo
para baixar e usar.
Integração simples O
Vue.js é popular entre os desenvolvedores da Web, pois facilita a conexão de aplicativos
existentes. Isso ocorre porque ele é construído sobre a base do JavaScript e pode ser
incorporado a outros aplicativos baseados em JavaScript. Agora você pode adicionar Vue.js
Machine Translated by Google
CDN e comece a usá-lo. A maioria dos componentes e bibliotecas Vue de terceiros também são
suportados pelo Vue.js CDN. Para começar a usar o Vue.js, você não precisa instalar o node e o npm.
Isso implica que ele pode ser usado para criar novos aplicativos da web, bem como modificar os
existentes. Ele também funciona bem como um substituto do jQuery.
Flexibilidade
Outra característica do Vue.js é seu alto grau de adaptabilidade. Ele permite que o usuário crie seu
modelo em HTML, JavaScript ou JavaScript puro utilizando nós virtuais. Essa versatilidade também
facilita a compreensão para React.js, Angular.js e qualquer outro novo desenvolvedor de estrutura
JavaScript, quando se trata de utilizar o Vue.js. Também é extremamente simples instalar e usar
ferramentas como Templating Engines (por exemplo, pug), pré-processadores CSS (por exemplo,
sass, less, stylus e assim por diante) e ferramentas de verificação de tipo (por exemplo, Typescript).
Ótimas ferramentas
O Vue.js tem ferramentas fantásticas. O novo Vue CLI, versão 3.x, é sem dúvida uma das melhores
ferramentas JavaScript Framework disponíveis. Ele permite que você crie um novo projeto com
recursos integrados, como roteamento, linting, teste de unidade, armazenamento de estado, pré-
processadores CSS, Typescript, PWA e assim por diante. Você também pode guardar seus presentes
para uso futuro em outros projetos. Ele também permite que você adicione recursos posteriormente.
O Vue CLI também possui uma interface do usuário para gerenciamento de projetos.
Faça um novo aplicativo:
Introdução ao Vue.js ÿ 21
vue ui
O Vue.js, como você deve ter ouvido, é inspirado em dois excelentes frameworks web
existentes, React e Angular. Ele combina os melhores recursos de ambos os frameworks.
Por exemplo, é baseado em componentes e usa Virtual DOM, como React, tornando-o
extremamente rápido. Ele também possui diretivas e ligação de dados bidirecional,
muito parecido com o Angular. Não é uma biblioteca (como o React.js) nem uma
estrutura completa (diferente do Angular). Ele oferece uma boa combinação de
funcionalidades prontas para uso e é simples adicionar mais ao longo do caminho,
como roteamento e gerenciamento de estado.
CONCLUSÃO
Aprendemos sobre Vue.js neste capítulo. Estudamos os benefícios e as desvantagens
do Vue.js e por que devemos usá-lo em vez de outro framework.
No capítulo seguinte, abordaremos os fundamentos do Vue.js, como JSX e como
construir o Primeiro Componente.
Machine Translated by Google
Machine Translated by Google
Capítulo 2
NESTE CAPÍTULO
JSX _
ÿ Configuração
ÿ Primeiro componente
ÿ Acessórios
ÿ Estado
ÿ Métodos
JSX
O nome JSX foi inventado pela equipe de engenharia do Facebook. JSX é uma
extensão sintática do tipo JavaScript XML sem semântica especificada. O JSX
NÃO deve ser usado por mecanismos ou navegadores. Em vez disso,
utilizaremos transpilers como Babel para transformar JSX em JavaScript padrão.
DOI: 10.1201/9781003310464-2 23
Machine Translated by Google
Pré-requisitos
Na maioria dos casos, o Vue aconselha a utilização de modelos para construir seu HTML.
No entanto, há momentos em que você precisa de todos os recursos programáticos do
JavaScript. É aqui que a função render, uma alternativa mais próxima do compilador aos
modelos, é útil.
Vejamos um caso básico em que uma função de renderização pode ser útil.
Suponha que você deseja criar títulos ancorados:
<h1>
<a name="olá-todos" href="#olá-todos">
Olá a todos </a> </h1>
Quando você começa com um componente que apenas cria uma direção com base no
suporte de nível, você imediatamente se depara com o seguinte:
<slot></slot> </h1>
} })
Esse modelo não combina bem comigo. Além de ser detalhado, estamos duplicando <slot></
slot> para cada nível de título e teremos que fazer isso novamente quando adicionarmos o
elemento âncora.
Embora os modelos sejam úteis para muitos componentes, este claramente não é um
deles. Então, vamos reescrevê-lo usando uma função de renderização:
) }, props:
{ level:
{ type: Number,
required: true
}
} })
Machine Translated by Google
Muito facil! O código é mais curto, mas também requer uma compreensão mais ampla dos
atributos de instância do Vue. Neste cenário, você deve estar ciente de que quando você passa
filhos para um componente sem uma diretiva v-slot, como o Hello world!, esses filhos são salvos
na instância do componente em $slots dentro do cabeçalho ancorado. Antes de entrar nos
métodos de renderização, é uma ideia inovadora ler a API de propriedades da instância, caso
ainda não o tenha feito.
você usa Vue-cli 3.0 ou posterior, está com sorte porque JSX é suportado.
Se você tiver uma versão anterior do Vue-cli que não suporta JSX, você pode adicioná-la
instalando babel-preset-Vue-app e adicionando-a ao seu arquivo .babelrc.
Para instalar:
# Usando npm
npm install --save-dev babel-preset-vue-app
# Usando yarn
yarn adicione --dev babel-preset-vue-app
{
"presets": ["vue-app"]
}
Por exemplo, os atalhos: e @ para ligação e escuta de eventos não estão mais disponíveis. Eles
são sintaxe JSX incorreta e, como resultado, seu código não será compilado.
O prefixo “on” é necessário no JSX para escutar eventos. Por exemplo, para
clique em eventos, use onClick.
Machine Translated by Google
<button onClick={this.handleClick}></button>
)
}
Em vez de v-html, use: para definir uma string HTML como o conteúdo de um elemento.
<button domPropsInnerHTML={htmlContent}></button>
)
}
Voltando ao nosso componente “TextField” original, podemos fazer isso agora que
habilitamos o JSX em nosso aplicativo Vue.
render (criarElemento) {
const inputAttributes = { class: 'input-
field has-outline', //
definição de classe
onClick: this.handleClick // pano de fundo do manipulador de
eventos: false // custom-prop
Outra vantagem de utilizar o JSX no Vue é que não precisamos mais registrar cada
componente, mas apenas importar e utilizar.
{
"opções do compilador": {
....
"jsx": "preservar",
}
}
Machine Translated by Google
Quando a opção JSX é definida como “preservar”, o TypeScript não analisará o JSX.
Como o Babel atualmente não oferece suporte ao Vue JSX, isso permite que o Babel assuma o controle de
Verifique se o TypeScript pode abrir o arquivo de declaração. Como alternativa, você pode adicionar o
{
"opções do compilador": {
...
"typesRoot": ["./node_modules/@types", "./types"]
}
}
Isso foi tudo sobre JSX, e agora estamos prontos para passar para a próxima seção de nosso capítulo,
Configuração.
CONFIGURAR
1. adereços
2. contexto
Vamos dar uma olhada em como cada argumento pode ser utilizado.
Machine Translated by Google
Props
O argumento props é o primeiro argumento na função de configuração. As props dentro
de um método de configuração são reativas e alteradas conforme novas props são
entregues, bem como em um componente regular.
{ console.log(props.title)
}
}
Se você precisar desestruturar seus adereços, pode fazê-lo usando os recifes na função
de configuração:
setup(props) { const
{ title } = toRefs(props)
console.log(title.value)
}
importar { de } de 'vue'
setup(props) { const
title = toRef(props, 'title')
console.log(title.value)
}
Machine Translated by Google
Contexto
padrão de exportação
{ setup(props, contexto) {
// Atributos (objeto não reativo, equivalente a $attrs)
console.log(context.attrs)
console.log(context.slots)
O objeto de contexto é um objeto JavaScript regular; não é reativo; portanto, você pode
usar com segurança a desestruturação do ES6 nele.
padrão de exportação {
setup(props, { attrs, slots, emitir, expor }) {
...
}
}
attrs e slots são objetos de estado que são alterados continuamente sempre que o
componente é modificado. Isso implica que você deve evitar desestruturar-los e, em vez
disso, referir-se a eles como attrs. X ou ranhuras. x. Vale ressaltar também que, ao
contrário dos props, attrs e slots não possuem atributos reativos. Se você deseja aplicar
efeitos colaterais dependendo das alterações de atributo ou slot, deve fazê-lo dentro de
um gancho de ciclo de vida onBeforeUpdate.
Machine Translated by Google
• adereços
• atributos
• slots
• emitir
• dados
• calculado
• métodos
<modelo>
<div>{{ nomedacoleção }}: {{ leitoresNumber }}
{{ livro.título }}</div> </
template>
<script>
import { ref, reativo } de 'vue'
export default
{ props:
{ collectionName: String },
setup(props) {
const ReaderNumber = ref(0) const
book = reactive({ title: 'Vue 3 Guide' })
Machine Translated by Google
{ leitoresNumber, livro
}
}
} </script>
A configuração também pode gerar uma função de renderização que pode usar diretamente
o estado reativo definido no mesmo escopo:
Este problema pode ser resolvido executando a exposição e enviando a ela um objeto
que descreva os atributos que devem estar disponíveis na instância do componente externo:
export default
{ setup(props, { expor }) { const
count = ref(0) const
increment = () => ++count.value
Machine Translated by Google
expor({
incremento
})
A função de incremento seria acessível por meio de uma referência de modelo no componente
pai.
não será uma referência à instância atualmente ativa dentro de Setup (). Como Setup () é
chamado antes de outras opções de componentes serem manipuladas, essa opção dentro
de Setup () agirá de maneira bastante diferente das outras opções.
Isso pode causar confusão ao usar Setup () em conjunto com várias APIs de opções.
Primeiro componente
Antes de entrarmos no mundo dos componentes Vue, vamos primeiro definir quais são os
componentes da Web no desenvolvimento de aplicativos.
Por exemplo, minha residência fica próxima a um shopping, onde eu, como todo mundo,
vou regularmente. Este enorme shopping é feito de pequenos pedaços de tijolos que são
colocados e posicionados uns sobre os outros para formar um grande volume que nos
permite fazer compras.
Os componentes em aplicativos da Web podem ser vistos como blocos (pequenas
porções reutilizáveis) meticulosamente construídos juntos para construir um aplicativo ou até
mesmo um componente maior conhecido como componente pai.
A principal distinção entre blocos de shopping centers e componentes da web é que os
componentes da web, ao contrário de granitos e materiais de cimento, são blocos que
abrangem marcação, modelo HTML, CSS e JavaScript.
Componentes em exibição
A documentação oficial do Vue define componentes como elementos personalizados aos
quais o compilador Vue adiciona funcionalidade e que são produzidos usando o
Vue.command (tagName, opções).
Para mostrar isso, criaremos um aplicativo básico que exibe os nomes dos trabalhadores
da ACME INT'L. Faremos três componentes para essa finalidade: componente navbar,
componente de cabeçalho de página e componente de lista de funcionários.
Machine Translated by Google
<!---index.html--->
<link rel="stylesheet" href="https://maxcdn. bootstrapcdn.com/
bootstrap/4.0.0-beta.2/css/bootstrap. min.css"><div id="app"> <navbar-
component></navbar-component>
<div class="container">
</div>
<!--Include VueJs--> <script
src="https://unpkg.com/vue"></script> <script src="main.js"></script>
vue.component('navbar-component', {
template: '<nav class="navbar navbar-expand-md
navbar-dark bg-dark mb-4"> <a class="navbar-brand" href="#">ACME INTL</
a><button class="navbar-toggler" type="button" data-toggle= "collapse" data
target="#navbarCollapse" aria controls="navbarCollapse" aria-
expanded="false" aria-label="Toggle
navigation"> <span class="navbar toggler-icon"> </button > </nav>', })
Machine Translated by Google
'
<tr v-for="staff in staffs"> <td>{{staff. nome}}</td>
<td>{{staff.email}}</td> <td>{{staff.email} função}}</td></tr>' + '</tbody></
table>',
email: 'ribbecca.dan@acme.org',
função: 'Desenvolvedor Backend' }, { nome:
'Mope Joshua', e-mail:
'mope.joshua@acme.org',
função: 'Analista Financeiro' }, { nome: ' Flima
Fatima', email: 'flima.fatima@acme.org',
},
{ nome: 'Hnna Brown', e-
mail: 'hnna.brown@acme.org', função:
'Gerente da comunidade' }, { nome:
'raman. aduragbemi@acme.org',
função: 'Administrador do sistema' }, ]
} },
});
//Root-Instance new
Vue({ el:
'#app', data:
{}, })
Você deve ter notado que fornecemos um modelo (elementos HTML) e dados que
seriam renderizados nesses elementos HTML na lista de funcionários
componente, permitindo que você especifique seus elementos HTML uma vez e os
reutilize em várias páginas. Sim! Essas são as partes de código reutilizáveis que
estávamos tentando ilustrar na comparação anterior.
Construir grandes projetos dessa maneira seria uma dor. Não seria maravilhoso
se cada componente permanecesse em seu próprio arquivo, de modo que os
elementos HTML pudessem ser separados do JavaScript com um pouco de código
CSS? Sim claro! Um componente de arquivo único é como é chamado.
Componente de arquivo
único Um componente de arquivo único é um arquivo com a extensão .vue criado com
browserify ou webpack.
Machine Translated by Google
<template> <!---
html template --> </
template><script> //JavaScript
</script><style> /
**style**/ </style>
Vamos agora recriar o aplicativo da ACME usando este método. Para construir
nosso aplicativo, utilizaremos o webpack-simple.
Antes de prosseguir, certifique-se de ter o npm e o node instalados.
Começamos executando o seguinte:
Se você foi bem-sucedido, sua pasta raiz agora deve incluir arquivos e pastas.
Vamos criar três arquivos na pasta src, nomeando-os NavbarComponent. vue,
PageHeadingComponent.vue e StaffListComponent.vue, nessa ordem.
<!--NavbarComponent.vue--><template> <nav
class="navbar navbar-expand-md navbar-dark
bg-dark mb-4">
<a class="navbar-brand" href="#">ACME INTL</a> <button class="navbar-
toggler" type="button" data-toggle="collapse" data-
target="#navbarCollapse" aria-controls="navbarCollapse" aria expandido="false"
aria-label="Alternar navegação"> <span class="navbar-
toggler-icon"> </button> </nav> </template>
Machine Translated by Google
<script>
module.exports = { data()
{ return {}
} </script>
<escopo do estilo>
</estilo>
<template>
<h1 class="text-center">{{title}}</h1> </template> <script>
module.exports=
{ name:"PageHeadingComponent", data ()
{ return
</script>
<style scoped> </
style>
<modelo>
<table class="table table-bordered">
<tbody>
<tr v-for="staff in staffs"> <td>{{staff.name}}
</td> <td>{{staff.email}}</td>
<td>{{staff. função}}</td> </tr> </
tbody> </table> </template>
Machine Translated by Google
<script>
module.exports = { name:
"StaffListComponent", data (){ return
{ staffs:
[ {name:
'Johny Doe',
email: 'johny. doe@acme.org', função: 'Central
Executive Officer'}, {nome: 'Ribbecca Dan', e-mail:
}
}
}
</script>
Você notou que alocamos nosso código para um módulo de objeto específico.
Isso revela a lógica do nosso componente. Funções e variáveis declaradas em
componentes de arquivo único são acessíveis apenas dentro do escopo de sua
definição. Devemos exportá-los porque eles devem ser registrados com um componente
pai (App.vue).
Vamos agora mudar nosso App.vue para:
<page-heading-component></
componente-cabeçalho-da-página>
<staff-list-component></
staff-list-component> </div> </
div> </
template>
<script> importar
PageHeadingComponent de './
PageHeadingComponent.vue' importa
StaffListComponent de './
StaffListComponent.vue'
importar NavbarComponent de './NavbarComponent. padrão de exportação
visto' { nome: 'aplicativo',
componentes:
{NavbarComponent,
PageHeadingComponent, StaffListComponent}, //Registro
outros elementos
} </script>
<!DOCTYPE html>
<html lang="en">
<cabeça>
<meta charset="utf-8">
<title>acme-app</title> <link
rel="stylesheet" href="https://maxcdn. bootstrapcdn.com/bootstrap/
4.0.0-beta.2/css/bootstrap .min.css">
</head>
<body>
<app></app>
<script src="/dist/build.js"></script> </body> </html>
Se você olhar para o seu navegador agora, deverá ver algo assim.
Os componentes são um elemento-chave do Vue porque permitem que você escreva
um código extremamente reutilizável e independente.
PROPS
Vue.component('blog-post', {
// camelCase nas props do JavaScript:
['postTitle'], template:
'<h3>{{ postTitle }}</h3>' })
Tipos de adereços
Até agora, vimos apenas propriedades listadas como uma matriz de strings:
Normalmente, você deseja que cada prop tenha um certo tipo de valor. Em certas circunstâncias, você
pode listar props como um objeto, com os nomes e valores das propriedades, incluindo os nomes e
tipos de prop, respectivamente:
props: { title:
String, likes: Number,
isPublished: Boolean,
Isso não apenas documentará seu componente, mas também notificará os usuários no console
JavaScript do navegador, se eles fornecerem o tipo incorreto.
Você também viu props alocados dinamicamente usando v-bind, como em:
Nas duas instâncias acima, enviamos valores de string, mas qualquer valor pode ser passado para um
prop.
Machine Translated by Google
Passando um Número
<!-- Apesar do fato de que '42' é estático, precisamos do v-bind para dizer ao
Vue que-->
<!-- esta é uma expressão JavaScript, não uma string.
-->
<blog-post v-bind:likes="42"></blog-post>
Passando um Booleano
<!-- Apesar do fato de que 'false' é estático, precisamos do v-bind para dizer ao Vue
que -->
<!-- esta é uma expressão JavaScript, não uma string.--> <blog-post v-bind:is-
published="false"></blog-post>
Passando um Array
<!-- Apesar do fato de que 'false' é estático, precisamos do v-bind para dizer ao Vue
que -->
<!-- esta é uma expressão JavaScript, não uma string.--> <blog-post v-bind:comment-
ids="[234, 266, 273]"> </blog-post>
Passando um Objeto
<!-- Apesar do fato de que 'false' é estático, precisamos do v-bind para dizer ao Vue
que -->
Machine Translated by Google
nome: 'Reronica',
empresa: 'Reridian Dynamics' }" ></blog-
post>
Passando as Propriedades de um
Objeto Se você quiser passar todas as propriedades de um objeto como props,
use v-bind sem um argumento (v-bind ao invés de v-bind:prop-name). Dado um
objeto post, por exemplo:
post: { id:
1, título:
'Minha Jornada com o Vue'
}
O modelo é o seguinte:
<blog-post v-bind="post"></blog-post>
Será igual a:
<blog-post v-
bind:id="post.id" v-
bind:title="post.title"
></blog-post>
Fluxo de dados
unidirecional Todos os props constituem uma ligação unidirecional entre as
propriedades filho e pai: quando a propriedade pai é atualizada, ela flui para o filho,
mas não o contrário. Isso evita que os componentes filhos alterem erroneamente o
estado do pai, o que pode complicar o fluxo de dados do seu aplicativo.
Além disso, quando o componente pai é modificado, o valor mais atual
é aplicado a todos os atributos do componente filho. Isso implica que você
nunca deve tentar alterar um prop dentro de um componente filho. Se o
fizer, o Vue irá notificá-lo através do console.
Machine Translated by Google
1. O prop é usado para fornecer um valor inicial; o componente filho irá utilizá-lo
posteriormente como uma propriedade de dados local. Nesse cenário, é
aconselhável estabelecer uma propriedade de dados local que comece com o prop:
contador: this.initialCounter
}
}
2. O prop é entregue como um valor bruto que deve ser convertido. Neste caso, é
aconselhável definir uma propriedade calculada com base no valor do prop:
Componentes de
validação de prop, como os que você já viu, podem atender às necessidades de prop.
Se um critério não for satisfeito, o Vue notificará você no console JavaScript do
navegador. Isso é extremamente benéfico ao criar um componente que será utilizado
por outros.
Em vez de uma matriz de strings, você pode passar um objeto contendo valida
critérios de atribuição ao valor de props para fornecer validações de prop.
Exemplo:
Vue.component('my-component', { props: { //
Verificação
de tipo básico (os valores 'null' e 'undefined' passarão por
qualquer validação de tipo) propA: Number, // Múltiplos
tipos possíveis
propB: [String, Number ],
Machine Translated by Google
} },
// Validator-function customizado propF:
{ validator:
function (value) {
// O valor deve corresponder a uma dessas strings
return ['sucesso', 'aviso', 'perigo'].
indexOf(valor) !== -1
}
}
} })
O Vue emitirá um aviso de console se a validação do prop falhar (se estiver usando a compilação
de desenvolvimento).
Verificações de tipo
• Corda
• Número
• Variedade
• Boleano
• Objeto
Machine Translated by Google
• Símbolo
• Data
• Função
Além disso, type pode ser uma função de construtor personalizada e a asserção será
executada por meio de uma instância de check. Por exemplo, suponha que exista a
seguinte função construtora:
Vue.component('blog-post', { props: {
autor: pessoa
} })
Para verificar se o valor da propriedade author foi gerado usando um novo Person.
Atributos Non-Prop Um
atributo non-prop é aquele que é fornecido para um componente, mas não possui um
prop correspondente.
Embora props claramente declarados sejam recomendados para enviar informações
a um componente filho, os desenvolvedores de bibliotecas de componentes nem sempre
podem prever os cenários em que seus componentes serão usados. Como resultado, os
componentes podem receber atributos arbitrários, que são adicionados ao elemento raiz
do componente.
Suponha que estamos utilizando um componente bootstrap-date-input de terceiros
com um plug-in Bootstrap que precisa da entrada para ter uma propriedade data-date-
picker. Este atributo pode ser adicionado à nossa instância do componente:
Para definir um tema para nosso plug-in seletor de data, talvez seja necessário criar uma
classe, como esta:
<bootstrap-date-input data-date-
picker="activated" class="date-picker-theme-
dark" ></bootstrap-date-input>
Para a maioria dos atributos, o valor fornecido ao componente substituirá o valor definido
pelo componente. Passar type=“text” irá, por exemplo, substituir type=“date” e quebrá-lo!
Felizmente, as características de classe e estilo são um pouco mais criativas, então ambos
os valores são combinados, gerando o valor final: form-control date-picker-theme-dark.
você não deseja que o elemento raiz de um componente herde atributos, especifique
inheritAttrs: false nas opções do componente. Como um exemplo:
Isso é especialmente útil quando usado em conjunto com a propriedade de instância $attrs,
que contém os nomes e valores de atributos fornecidos a um componente, como:
{
obrigatório: verdadeiro,
espaço reservado: 'Digite o nome de usuário.'
}
Machine Translated by Google
Vue.component('base-input', { inheritAttrs:
false, props: ['label', 'value'],
template: '
<rótulo>
{{ label }} <input
v-
bind="$attrs" v-
bind:value="value"
v-on:input="$emit('input', $event.target .value)"
>
</label>
'
})
Essa técnica permite que você utilize componentes básicos mais como elementos
HTML brutos, sem se preocupar com qual elemento está na raiz:
<base-input
label="Nome de usuário:"
v-model="nome de usuário"
espaço
reservado obrigatório="Digite o nome de usuário"
></base-input>
STATE
Single-State Tree O
Vuex emprega uma árvore de estado único, que contém todos os estados do seu
aplicativo e atua como a “única fonte de verdade”. Isso também implica que você
geralmente terá apenas uma loja para cada aplicativo. Uma árvore de estado único
simplifica o processo de localizar um determinado estado e tirar instantâneos
facilmente do estado atual do aplicativo por motivos de depuração.
A árvore de estado único não entra em conflito com a modularidade nos próximos
capítulos, e abordaremos maneiras de dividir seu estado e mutações em submódulos.
Machine Translated by Google
Os dados que você coloca no Vuex estão em conformidade com as mesmas restrições que os dados em um
return loja.estado.contagem
}
}
}
'
})
Machine Translated by Google
contador const = {
template: '<div>{{ count }}</div>', computado: { count ()
{ return this.
$store.state.count
}
}
}
O ajudante mapState
Quando um componente deve acessar muitas propriedades de estado de
armazenamento ou getters, declarar todas essas propriedades calculadas
pode se tornar tedioso e demorado. Para resolver isso, podemos usar o
ajudante mapState, que fornece métodos getter calculados para nós e nos
poupa alguns toques de tecla:
contagemAlias: 'contagem',
} })
}
Machine Translated by Google
calculado: mapState([
// mapeia this.count para store.state.count
'contar'
])
computado:
{ localComputed () { /* ... */ }, // mistura isso no
objeto externo com a dispersão do objeto
MÉTODOS
Um método Vue é um objeto vinculado a uma instância Vue. O objeto de métodos
contém as definições de funções. Os métodos são úteis quando você precisa
executar alguma ação em um elemento usando a diretiva v-on para gerenciar
eventos. As funções especificadas no objeto de métodos podem ser invocadas
novamente para realizar ações.
Machine Translated by Google
Sintaxe:
métodos: {
// Podemos adicionar funções aqui
}
exportar padrão
{ métodos: {
// Podemos adicionar funções aqui
}
}
O Vue.js é usado nos exemplos a seguir para demonstrar a operação dos métodos.
<!DOCTYPE html>
<html>
<cabeça>
<fonte do script=
"https://unpkg.com/vue"> </script> </
head> <body>
</div> </
body>
<script type="text/javascript">
// Criando a Instância Vue var vm = new
Vue({
// Atribuindo id de DOM no parâmetro el: '#home',
+ este.tópico;
}
}
});
</script> </
html>
<!DOCTYPE html>
<html>
<cabeça>
<fonte do script=
"https://unpkg.com/vue"> </script> </
head> <body>
botão>
<h2 id="view"></h2>
</div> </
body>
<script type="text/javascript">
// Criando a Instância Vue var vm = new
Vue({
// Atribuindo id de DOM no parâmetro el: '#home',
// Configurando o texto em
o elemento
documento.
getElementById("exibir")
.innerHTML = "Olá,
Isso é Vue"
// Escondendo o texto
após os 2 segundos
.getElementById("exibir")
.innerHTML = ""
}, 2000);
}
}
});
</script> </
html>
{ increment()
{ // 'this' irá se
referir à instância do componente this.count++
} })
const vm = app.mount('#app')
Machine Translated by Google
console.log(vm.count) // => 4
vm.increment()
console.log(vm.count) // => 5
Para métodos, o Vue vincula automaticamente esse valor para que sempre se refira à
instância do componente. Quando usado como ouvinte de eventos ou retorno de
chamada, isso garante que um método mantenha o valor correto. Ao projetar métodos,
você deve evitar o uso de funções de seta, pois elas proíbem o Vue de vincular o valor
correto.
Os métodos, como todos os outros atributos da instância do componente, estão
disponíveis no modelo do componente. Eles são normalmente usados como ouvintes
de eventos em um modelo:
Se os métodos title date ou formatDate acessarem qualquer dado reativo, ele será
rastreado como uma dependência de renderização, exatamente como faria se tivesse
sido usado diretamente no modelo.
Os métodos chamados a partir do modelo não devem ter implicações inesperadas,
como alteração de dados ou início de processos assíncronos.
Em vez disso, use um gancho de ciclo de vida se estiver inclinado a fazê-lo.
CONCLUSÃO
Este capítulo nos ensina sobre JSX, Setup, o componente inicial, propriedades e assim
por diante, incluindo o que são e como utilizá-los.
No capítulo seguinte, aprenderemos sobre componentes condicionais, estilo e assim
por diante.
Machine Translated by Google
Machine Translated by Google
Capítulo 3
Visualização de componentes
NESTE CAPÍTULO
ÿ Condicional
ÿ Estilo
ÿ Componentes estilizados
CONDICIONAL
Vue.js Conditional Rendering
Vue.js é uma estrutura moderna para criar interfaces de usuário. A biblioteca
principal se preocupa apenas com a camada de exibição e é simples de selecionar
e combinar com outras bibliotecas. O Vue também é capaz de alimentar
aplicativos sofisticados de página única quando integrado a tecnologias modernas
e estruturas associadas.
A renderização condicional do Vue simplifica o controle da existência de
qualquer elemento no DOM, dependendo de um critério predefinido. Isso é feito
empregando as diretivas v-if e v-else.
A diretiva v-if pode ser usada para renderizar condicionalmente um bloco. Com
base no valor, pode ser atribuída uma variável booleana que alterna o subjacente
DOI: 10.1201/9781003310464-3 59
Machine Translated by Google
elemento DOM. A diretiva v-else pode ser usada para renderizar um bloco que não
atende aos critérios da diretiva v-if. Esta diretiva deve vir imediatamente após a
diretiva v-if para que esta diretiva funcione. Condicionais múltiplos podem ser
encadeados usando a diretiva v-else-if.
Os exemplos a seguir mostram a renderização condicional em Vue.js:
<html>
<cabeça>
<script src=
"https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"> </script> </head> <body>
<div
id='parent'>
dados :
} })
Machine Translated by Google
Visualização de componentes ÿ 61
Segundo exemplo:
<script src=
"https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"> </script> </head> <body>
<div
id='parent'>
</div>
<script src='app.js'></script> </body> </html>
Nome do
arquivo:
app.js const parent =
new Vue({ el : '#parent', { data :
} })
<template>
<div>
<h2>Inscreva-se</
h2> {{ email }} {{ password }}
<p><input type="text" placeholder="Email"
v-model="email" /></p>
<p><input type="password" placeholder="Password"
v-model="senha" /></p> </div> </
template>
<script>
export default { data()
{ return
{ email: '',
senha: '',
} },
} </script>
<modelo>
<div>
<h2>Inscreva-se</
h2> {{ email }} {{ password }}
<p><input type="text" placeholder="Email"
v-model="email" /></p>
<p><input type="password" placeholder="Password"
v-model="senha" /></p>
<p class="errormessage">a senha deve ter pelo menos seis
caracteres</p> </div> </
template>
Machine Translated by Google
Visualização de componentes ÿ 63
Ok, se iniciarmos nosso aplicativo Vue, devemos ver algo assim no navegador.
Portanto, agora podemos utilizar a renderização condicional apenas para exibir esse erro
observe quando nossa senha tiver menos de seis caracteres.
Para este exemplo, utilizaremos a diretiva v-if para apenas dizer v-if e, em seguida,
passar uma expressão booleana em nossa tag <p>. O elemento será renderizado se esta
afirmação for verdadeira. Não renderizará se for falso. Não é simples o suficiente?
</p>
De volta ao nosso código, podemos modificar v-if para v-show e testar se nosso
app ainda funciona da mesma forma.
<modelo> <div>
<script>
export default { data()
{ return
{ active:
false,
} },
} </script>
Visualização de componentes ÿ 65
Em geral, v-if tem custos de alternância maiores (sempre que a condição muda),
enquanto v-show tem custos iniciais de renderização mais altos.
Use o v-show se precisar alternar alguma coisa regularmente.
Use v-if se o condicional não mudar com frequência ao longo do
execução.
Outra coisa a considerar é que utilizar v-if nos permite combiná-lo com outros blocos
lógicos. Para implementar uma lógica sofisticada em nosso software, podemos utilizar
os blocos v-else e v-else-if.
Como você pode ver, cada um tem seu próprio conjunto de aplicativos. Claro, é
totalmente dependente do seu caso de uso, então pense nisso ao invés de escolher
um aleatoriamente!
Agora, vejamos alguns exemplos adicionais.
v-se
<template v-if="ok">
<h1>Título</h1>
<p>Parágrafo 1</p>
<p>Parágrafo 2</p> </
template>
Machine Translated by Google
v-senão
A diretiva v-else pode ser usada para fornecer um “bloco else” para v-if:
Um elemento v-else deve vir imediatamente após um elemento v-if ou v-else-if, caso
contrário, ele será ignorado.
O v-else-if, como o nome indica, atua como um “bloco else if” para o v-if. Isto
também pode ser encadeado mais de uma vez:
Um elemento v-else-if, como v-else, deve vir imediatamente após um elemento v-if
ou v-else-if.
Visualização de componentes ÿ 67
<template v-else>
<label>E-mail</label> <input
placeholder="Digite o endereço de e-mail"> </template>
Então, no código acima, alterar o tipo de login não substituirá nada que o usuário já tenha
inserido. Como ambos os modelos empregam componentes idênticos, apenas o espaço
reservado para <input> é substituído.
Digite algum texto na entrada e, em seguida, pressione o botão de alternância para ver
por si mesmo.
Isso nem sempre é desejado; portanto, o Vue fornece um meio de declarar: “Esses dois
itens são absolutamente independentes – não os reutilize”. Inclua um atributo de chave com
valores distintos:
Cada vez que você alternar, essas entradas serão recriadas do zero. Confira por si mesmo.
v-show
A diretiva v-show é outra opção para mostrar condicionalmente um elemento. O uso é o
mesmo:
<h1 v-show="ok">Olá!</h1>
v-if vs.v-show
Como garante que os ouvintes de eventos e os componentes filhos dentro do bloco condicional
sejam excluídos e recriados adequadamente durante as alternâncias, v-if é uma renderização
condicional “genuína”. v-if também é preguiçoso:
se a condição for falsa na primeira renderização, não faz nada – o bloco condicional não
é desenhado até que a condição se torne verdadeira pela primeira vez.
Quando usado em conjunto com v-if, v-for tem precedência sobre v-if.
v-else-if
A diretiva v-else-if, como v-else, pode ser usada em combinação com a diretiva v-if.
Como um exemplo:
Visualização de componentes ÿ 69
<p>Livros</p> </
div>
<div v-else-if="type == 'animals'"> <p>Animais</p>
</div>
<div v-else>
<p>Nenhuma das anteriores</p> </
div>
Conclusão Este
artigo demonstrou como usar as diretivas v-if e v-else para renderizar condicionalmente
o DOM em Vue.js. Analisamos várias amostras e descobrimos a verdadeira diferença
entre as diretivas v-show e v-if. Se esta postagem ajudou você a entender melhor e ter
ideias, continue visitando linux hint.com para obter mais informações úteis. Estudamos
como o Vue.js é uma estrutura progressiva para criar interfaces de usuário em grande
profundidade. E como a biblioteca principal se preocupa apenas com a camada de
exibição e é simples de selecionar e combinar com outras bibliotecas. Quando
emparelhado com tecnologias e estruturas modernas, o Vue também é totalmente
capaz de alimentar sofisticados aplicativos de página única.
ESTILO
Estilização CSS dos componentes Vue
Para ajudá-lo a se familiarizar com cada um, usaremos uma mistura dos três para melhorar
a aparência e o funcionamento do nosso aplicativo.
Embora essas ferramentas não sejam usadas neste tutorial, é útil saber que elas serão
processadas automaticamente se esse código for incluído na pasta de recursos.
/*reset.css*/ /*
REINICIA */
*,
*::antes,
*::depois
{ box-sizing: border-box;
} *:focus
{ contorno: 4px tracejado #228bec;
} html
{ fonte: 64,5% / 1,15 sem serifa;
} h1,
Machine Translated by Google
Visualização de componentes ÿ 71
h2
{ margem inferior: 0;
} ul
{ estilo de lista: nenhum;
preenchimento: 0;
} botão
{ border: nenhum;
margem: 0;
preenchimento:
0; largura:
automático; estouro:
visível; fundo: transparente; cor:
herdar; fonte: herdar;
altura da linha:
normal; -webkit-font-
smoothing: herdar; -moz-osx-font-smoothing:
herdar; -aparência do webkit: nenhuma;
} botão::-moz-focus-inner { border: 1;
} botão,
entrada,
grupo de
opções,
seleção, área
de texto { família de fontes:
herdar; tamanho da
fonte: 90%; altura da linha:
1,18; margem: 0;
} botão,
entrada
{ /* 1 */
estouro: visível;
} input[type="text"] { border-
radius: 1;
}
Machine Translated by Google
corpo
{ largura: 90%;
largura máxima: 69rem;
margem: 1 auto; fonte:
1.8rem/1.26 "Helvetica Neue", Helvetica, Arial, sans-serif;
import './assets/reset.css';
Isso fará com que o arquivo seja retirado durante o processo de construção e adicionado ao
nosso site automaticamente.
O aplicativo agora deve ter os estilos de redefinição aplicados a ele.
A eliminação de marcadores de lista, modificações na cor de fundo e alterações no botão
base e estilos de entrada são alterações perceptíveis.
Precisamos alterar um pouco mais os estilos agora que redefinimos nosso CSS para ser
consistente entre os navegadores. Queremos aplicar estilos específicos a diferentes
componentes em nosso aplicativo. Embora a adição desses arquivos à folha de estilo
reset.CSS funcione, em vez disso, vamos adicioná-los às tags <style> in-app.vue para mostrar
como isso pode ser feito.
Alguns estilos já estão incluídos no arquivo. Vamos nos livrar deles e substituí-los pelos
seguintes estilos listados. Esses estilos realizam algumas coisas: eles estilizam botões e
entradas e personalizam o elemento #app e seus filhos.
Machine Translated by Google
Visualização de componentes ÿ 73
<estilo> /
* Estilos globais */ .btn
} .btn__danger
{ cor: #fff; cor
de fundo: #ca3c3c; cor da borda:
#bd2131;
} .btn__filter { cor
da borda: cinza;
} .btn__danger:focus { cor
do contorno: #c82334;
} .btn__primary
{ cor: #fff; cor
de fundo: #001;
} .btn-group
{ display: flex;
justificar-conteúdo: espaço-entre;
}flex:
* { .btn-group
1 1 auto; >
}margin-left:
* + * { .btn-group >
0.8rem;
} .label-wrapper
{ margem: 0;
flexível: 0 0 100%;
alinhamento de texto: esquerda;
} [class*="__lg"]
{ display: inline-block;
Machine Translated by Google
largura: 90%;
tamanho da fonte: 1,8 rem;
} .visualmente oculto {
posição: absoluta; altura: 1px;
largura: 1px;
estouro: oculto;
clipe: rect(1px 1px 1px
1px); clipe: rect(1px, 1px, 1px, 1px); caminho
do clipe: rect(1px, 1px, 1px, 1px); espaço em
branco: nowrap;
}2.6rem;
* + * { .stack-large > margin-top:
}2.9rem;
* + * { .stack-large > margin-top:
}
}
/* Fim dos estilos globais */ #app
Visualização de componentes ÿ 75
preenchimento: 1rem;
padding-top: 0; posição:
relativa; box-shadow: 0 2px
4px 0 rgba(0, 0, 0, 0.2), 0 2.5rem
5rem 0 rgba(0, 0, 0, 0,1); } @media screen
largura
} * { #app >
máxima: 52rem; margem
esquerda: auto; margem
direita: auto;
} #aplicativo >
formulário { largura máxima: 90%;
} #app h1
{ exibição: bloco; largura
mínima: 90%; largura:
90%; alinhamento
de texto: direita; margem: 0;
margem inferior:
1rem;
} </estilo>
Se você verificar o aplicativo, verá que nossa lista de tarefas agora está em um cartão
e nossos itens de tarefas estão melhor formatados. Agora podemos prosseguir e
começar a alterar nossos componentes para incorporar alguns desses designs.
CSS As classes CSS de botão devem ser aplicadas ao <button> em nosso componente
ToDoForm. Como os modelos Vue são HTML legítimo, isso é feito da mesma maneira
que seria feito em HTML normal – adicionando uma classe=“propriedade ao elemento.
Adicionar </button>
Machine Translated by Google
Enquanto estamos aqui, podemos fazer mais uma atualização semântica e de estilo. Nosso
formulário pode se beneficiar de um elemento <h2> porque especifica uma área distinta de
nosso site. O rótulo, por outro lado, já indica a finalidade do formulário. Para minimizar a
repetição, vamos colocar nosso rótulo com um <h2>.
Existem mais alguns estilos CSS globais que podemos adicionar. Além disso, daremos ao
nosso elemento <input> a classe input_lg.
Faça as seguintes alterações em seu modelo ToDoForm:
<template>
<form @submit.prevent="onSubmit"> <h2
class="label-wrapper"> <label for="new-
todo-input" class="label__lg">
O que precisa ser feito??
</label> </
h2>
<input
type="text"
id="new-todo-input"
name="new-todo"
autocomplete="off" v-
model.lazy.trim="label" class="input__lg" /
> <button type="submit"
</button> </
form> </
template>
Vamos incluir adicionalmente a classe stack-large na tag ul> do nosso arquivo App.vue.
Isso ajudará a aumentar o intervalo entre nossos itens de tarefas pendentes.
Foi atualizado da seguinte forma:
Visualização de componentes ÿ 77
pode ser difícil rastrear e corrigir o problema. É aqui que o recurso com escopo
é útil; ele atribui um seletor de atributo de dados HTML exclusivo para cada um
dos seus estilos, evitando que entrem em conflito em todo o mundo.
Para utilizar o modificador scoped, crie um elemento style> na parte inferior de
ToDoItem.vue e dê a ele o atributo com escopo:
} .custom-checkbox >.checkbox {
família da fonte: Arial, sem serifa; -webkit-font-
smoothing: antialiased; -moz-osx-font-smoothing: tons
de cinza; peso da fonte: 410; tamanho da fonte:
18px; tamanho da fonte:
1rem; altura da linha:
1,26; box-sizing: border-
box; largura: 90%; altura:
42px; altura: 2,6rem; margem
superior: 0;
preenchimento:
6px; borda: sólido de
3px #0b0c0c; raio
da borda: 0;
-aparência do webkit: nenhuma;
-moz-aparência: nenhum;
aparência: nenhuma;
}
Machine Translated by Google
} .custom-checkbox { font-
family: Arial, sans-serif; -webkit-font-smoothing:
antialiased; peso da fonte: 410; tamanho da fonte: 1,8
rem; altura da linha: 1,26;
exibição: bloco; posição:
relativa; altura mínima:
41px; margem inferior:
12px; preenchimento à
esquerda: 41px; claro:
esquerda;
} .custom-checkbox >.checkbox-label {
tamanho da fonte: herdar;
font-family: herdar; altura da
linha: herdar; exibição: bloco
em linha; margem inferior: 0;
preenchimento: 9px 16px
6px; cursor: ponteiro; ação de
toque: manipulação;
Visualização de componentes ÿ 79
input, .custom-checkbox
{ font-size: 18px;
tamanho da fonte: 1,8 rem;
altura da linha: 1,31579;
}
}
Para conectar os estilos, precisaremos adicionar algumas classes CSS ao nosso modelo.
Machine Translated by Google
Adicione uma classe de caixa de seleção personalizada à raiz <div>. Adicionar uma classe de caixa de seleção a
o <entrada>. Por fim, adicione uma classe de rótulo de caixa de seleção ao <rótulo>. O modelo
modificado é fornecido abaixo:
• O estilo CSS dos componentes Vue pode ajudar os desenvolvedores a adicionar estética de design
• As diretivas Vue permitem que você manipule a ligação de classe e estilo dentro do modelo. Para
manter nosso aplicativo estruturado, você pode utilizar o estilo inline nos componentes ou um
Ao criar uma pequena página da Web, esta lição examinará várias abordagens para estilizar componentes
Pré-requisitos
Antes de começar com esta instrução, há algumas coisas que você deve procurar. Primeiro, você
Em seguida, no terminal, execute o seguinte comando para confirmar que você tem o Node.js versão 10.x
ou superior instalado:
:node -v
Você também precisará da CLI mais recente do Vue. Para baixar a versão mais recente, primeiro
Visualização de Componentes ÿ 81
# OU
atualização global do fio --latest @vue/CLI
Você então solicitará a seleção de uma predefinição. Você tem três opções:
2. Veja 3 vislumbres.
cd <project_name>
ou
servir fio
propriedade scoped vinculada à tag style abaixo indica que qualquer estilo CSS fornecido
aqui será aplicado apenas a este modelo e não será aplicado a nenhum outro componente/
modelo.
Crie primeiro um componente da barra de navegação chamado “Navbar”:
<modelo>
<div class="navbar">
<div class="navLink">
<a href="#">Sobre</a> <a
href="#">Serviços</a> <a
href="#">Contato</a> </div> </div>
Machine Translated by Google
</template>
<script>
padrão de exportação
{ name: 'Navbar'
} </script>
<style
} .navLink{ alinhamento de
texto: à direita; } a{
decoração de texto: nenhum;
preenchimento: 1rem;
cor:#fff;
alinhamento de texto: centro;
} </estilo>
Visualização de componentes ÿ 83
<modelo> <div
class="container">
<div class="startPage"> <h2>Cruz
Page</h2> <button
class="btn">Começar</button> </div> </div> </template>
<script>
padrão
de exportação
{ nome :
'Corpo'
} </script>
<style scoped src="../assets/css/startpage.css"> /* @import '../assets/
css/startpage.css'; */ </estilo>
Seu componente acima incluirá um link para o arquivo CSS externo listado abaixo:
.página inicial {
altura: 610px; cor de
fundo: #f44337; alinhamento de texto:
esquerda;
}
h2{
padding-top: 12rem;
tamanho da fonte: 5rem;
} .btn
{ fundo: preto; cor: #fff;
raio da borda:
6px; -webkit-border-radius:
6px; -moz-border-radius: 6px; -ms-
border-radius: 6px; -o-border-radius:
6px; contorno: nenhum;
preenchimento: 0,8 rem 3 rem;
borda: nenhum;
margem superior: 3rem;
}
Machine Translated by Google
<template>
<div>
<Navbar/>
<Body/> </
div> </
template>
<script>
import Navbar from './components/Navbar.vue' import Body from './
components/Body.vue'
padrão de exportação
{ nome: 'Aplicativo',
componentes: {
barra de navegação,
Corpo
}
} </script>
<estilo> *
} h1,h2,h3,h4,h5,h6{ cor:
#fff;
} </estilo>
Machine Translated by Google
Visualização de componentes ÿ 85
Usamos um seletor curinga CSS (pronunciado como um asterisco) para selecionar todos
os itens em nosso aplicativo, como você pode ver. Nesse caso, a margem e o preenchimento
em todos os aspectos são definidos como 0 e o tamanho da caixa é border-box.
Usando a marca de estilo, o CSS embutido aplica um estilo único a um elemento HTML
específico.
Podemos aplicar um estilo inline ao nosso elemento em Vue.js ligando a propriedade style
na tag HTML. Neste caso, :style é uma abreviação de v-bind:style.
Existem duas abordagens para estilizar em linha: sintaxe de objeto e taxa de sintaxe
de array. Ambos serão discutidos em detalhes a seguir.
Sintaxe do objeto
Usando a sintaxe do objeto, podemos utilizar o estilo embutido usando o nome do atributo
CSS como o nome da chave do objeto e os valores como os valores de cada atributo CSS.
Use camelCase ou “kebab-case” ao usar a sintaxe do objeto, conforme o exemplo a seguir:
<modelo>
<rodapé
alinhar: 'centro',
preenchimento: 6
}
}
} </script>
<estilo>
</estilo>
<modelo>
<footer :style="footerStyles"> <p> ©
2022</p> </footer> </
template>
<script> export
default
{ data()
{ return{ footerStyles:
{ backgroundColor: 'white', color:
'black', height: '220px',
textAlign: 'left ',
preenchimento: '6rem'
}
}
} </script>
<estilo>
</estilo>
Machine Translated by Google
Visualização de componentes ÿ 87
Sintaxe de
Array A sintaxe de array é usada para adicionar vários objetos de estilo para
estilização inline. No próximo exemplo, adicionaremos um novo objeto textColor à
sintaxe do array, que alterará a cor do texto.
<modelo>
<footer :style="[footerStyles1, textColor]"> <p> © 2022</
p> </footer> </template>
<script>
export default
{ data()
{ return{ footerStyles1:
{ backgroundColor: 'white',
height: '220px', textAlign: 'left',
padding: '6rem '
},
textColor:{ cor:
'vermelho',
}
}
}
} </script>
<estilo>
</estilo>
COMPONENTES DE ESTILO
O estilo das estruturas de desenvolvimento da Web evoluiu em conjunto com o avanço
dos recursos e ferramentas de desenvolvimento da Web. Mudar de estilos inline para
soluções CSS-in-JS melhorou a consistência da experiência de desenvolvimento.
Nenhuma Política de
Classes Tudo é feito com o auxílio de props em componentes estilizados. Você pode
modificar o estilo de seus componentes dinamicamente sem exigir classes. Ele permite
que você utilize operadores ternários dentro dos literais de string de componentes com
estilo.
Componentes com
estilo de design simultâneo facilitam manter o estilo e a aparência de seus componentes
consistentes e idênticos em todo o aplicativo. Os recursos de criação de temas
fornecem um local centralizado para identificar aspectos importantes do projeto, como
cor, tamanho e espaçamento. Eles podem ser simplesmente incorporados a todos os
componentes do aplicativo.
npm i vue-styled-components
Machine Translated by Google
Visualização de componentes ÿ 89
Se você usou o Vue CLI para criar o projeto, a estrutura de pastas ficaria assim:
Estrutura da pasta.
<modelo>
<div class="olá">
<h1>{{ msg }}</h1> </
div> </
template>
<script>
export default { name:
'Helloeveryone', props: { msg:
String
} </script>
Machine Translated by Google
Tela de saída.
Como podemos ver, há um elemento básico de cabeçalho h1 sem estilo. Vamos estilizar este
h1 com componentes estilizados, portanto, precisaremos criar uma nova pasta no diretório src
para mantê-los. Crie um arquivo Header.js nessa pasta.
A seguir está a estrutura do projeto.
Em seguida, em Header.js, adicione as seguintes linhas de código:
<modelo> <div
class="olá">
<StyledHeader>{{ msg }}</StyledHeader> </div> </
template>
<script>
importar {StyledHeader} de "../styled-components/
Cabeçalho"
padrão de exportação
{ nome: 'Olá a todos',
componentes:{
StyledHeader },
props:
{ msg: String
}
} </script>
Machine Translated by Google
Visualização de componentes ÿ 91
Agora, vamos iniciar o servidor e ver o que acontece com a tag de cabeçalho básica e chata.
Os adereços podem ser usados com componentes estilizados, como qualquer outro componente.
Por exemplo, podemos construir um campo de entrada e fornecer uma prop. Nesta seção,
construiremos um novo componente na pasta de componentes chamado Input.js e adicionaremos
o seguinte código a ele:
&:hover { box-
shadow: inserir 2px 2px 1px rgba(0, 0, 0, 0.1);
}
';
<modelo> <div
class="olá">
<StyledHeader>{{ msg }}</StyledHeader>
<StyledInput/> </div>
</
template>
<script>
importar {StyledInput} de "../styled-components/Input" importar {StyledHeader} de "../
styled-components/
Cabeçalho"
Machine Translated by Google
padrão de exportação
{ nome: 'Olá a todos',
componentes:{
StyledInput,StyledHeader },
adereços:
{ msg: String
}
} </script>
Salvar as alterações fará com que elas sejam refletidas no navegador, indicando
que nossa entrada foi renderizada.
No entanto, sem entrada suficiente, isso parece estranho. Deixe-nos fornecer
para StyledInput como um suporte junto com o tipo.
<modelo> <div
class="olá">
<StyledHeader>{{ msg }}</StyledHeader>
<StyledInput placeholder="Password" type="text"/> </div> </template>
...
Visualização de componentes ÿ 93
<modelo>
<div class="olá">
<StyledHeader primário>{{ msg }}</StyledHeader>
<StyledInput placeholder="Password" type="text"/> </div> </template>
<script>
importar {StyledInput} de "../styled-components/Input" importar {StyledHeader}
de "../styled-components/Header"
padrão de exportação
{ nome: 'Olá a todos',
componentes:{
StyledInput,StyledHeader },
adereços:
{ msg: String
}
} </script>
Conseguimos adaptar com sucesso o estilo com base em nossos ativos, o que nos
forneceu a noção principal por trás da abordagem. Os estilos com adereços podem ser
alterados em resposta a eventos de botão, envios de formulário e outros eventos. Com
componentes estilizados, podemos finalmente aproveitar todo o potencial do estilo
dinâmico.
Machine Translated by Google
com estilo também permitem que todos os seus componentes tenham a mesma aparência.
Isso garante que os programas tenham um estilo uniforme e elimine muito código repetitivo.
<modelo>
<div class="olá">
<StyledHeader as=button>{{ msg }}</StyledHeader>
<StyledInput placeholder="Password" type="text"/> </div> </template>
Estendendo estilos
<modelo> <div
class="olá">
<StyledHeader >{{ msg }}</StyledHeader>
Machine Translated by Google
Visualização de componentes ÿ 95
<script>
importar {StyledInput} de "../styled-components/Input" importar {NewHeader}
de "../styled-components/
Novo cabeçalho"
padrão de exportação
{ nome: 'Olá a todos',
componentes:{
StyledInput,StyledHeader,NewHeader },
adereços:
{ msg: String
}
} </script>
CONCLUSÃO
Neste capítulo, aprendemos sobre componentes condicionais, de estilo e com
estilo, bem como para que são usados e como usá-los no Vue.js. No capítulo
seguinte, aprenderemos sobre imagens e como importá-las.
Machine Translated by Google
Machine Translated by Google
Capítulo 4
NESTE CAPÍTULO
ÿ Imagens
ÿ Importando imagens
IMPORTANDO IMAGENS
Tão simples quanto:
<template> <div
id="app"> <img src="./
assets/logo.png"> </div> </template>
<script>
padrão de exportação { }
</script>
DOI: 10.1201/9781003310464-4 97
Machine Translated by Google
<template>
<div id="app">
<img :src="image"/> </div>
</
template>
<script>
importar imagem de "./assets/logo.png"
padrão de exportação
{ dados: função () { retorno
{ imagem:
imagem
}
}
} </script>
<template>
<div id="app">
<img :src="require('./assets/logo.png')"/> </div> </template>
<script>
padrão de exportação
{ } </script>
<modelo>
<div id="aplicativo">
<img src="./assets/logo.png"> </div> </
template>
<script>
padrão de exportação
{ } </script>
Ao construir com o Vue CLI, o webpack não pode garantir que o arquivo de ativos retenha
a estrutura de importação relativa. Isso ocorre devido ao pacote da web tentar otimizar
e agrupar objetos encontrados na pasta de ativos. Se você quiser utilizar uma importação
relativa, navegue até a pasta estática e use: img src=“./static/logo.png”>.
Aqui estão algumas perguntas que as pessoas fazem ao trabalhar no Vue.js com
respostas.
Como você pode incluir fotos em meus componentes de arquivo único .vue?
<template>
<img v-bind:src="require('images/rails.png')" /> </template>
Machine Translated by Google
<template>
<div id="app">
<img :src="image" /> </div>
</
template>
<script>
importar imagem de "./assets/logo.png"
padrão de exportação
{ dados: função () { retorno
{ imagem:
imagem
}
}
} </script>
Primeiro, escolha um arquivo (lembre-se de incluir <input type="arquivo"> em seu código de modelo
de componente).
Em seguida, em seu componente .vue, você precisará dos “dois métodos de manipulador”:
métodos:
{ onFileChanged (evento)
{ arquivo const = event.target.files[0] },
onUpload() { //
carrega o arquivo }
Você pode enviar o arquivo no estado como dados binários ou agrupados em um objeto de dados de
formulário.
onUpload()
{ axios.post('my-domain.com/file-upload', this. selectedFile) }
Machine Translated by Google
onUpload() {
const formData = new FormData()
formData.append('myFile', this.selectedFile, this.
selectFile.name)
axios.post('my-domain.com/file-upload', formData)
}
<template>
<div :style="image"></div> </template>
<script>
export default { data()
{ return
{ image:
{ backgroundImage: "url(https://vuejs .org/images/logo.png)" } };
} }; </script>
Aqui está um exemplo se sua imagem de pano de fundo for gerada por seu back-end
servidor:
<template>
<div :style="{backgroundImage:'url(${post. image})'}"></div> </
template>
Como você pode enviar variáveis para imagens de fundo embutidas em .vue?
É simples passar uma ligação de estilo para o Vue! Você pode fazer assim:
<modelo> <div
class="progresso">
<div class="progress__fill" :style="{ width: progress }"></div> </
div> </template>
<script>
export default { props:
["percent"], data() { return
{ progress:
this.percent
+ "%", }; }, }; </script>
Mas, se a imagem de fundo depender da vinculação de dados, como você transferiria os dados?
Se você tiver dados estáticos, poderá importá-los para a vinculação de dados Vue e alimentá-
los.
<modelo> <div
{ backgroundUrl, }; }, }; </
roteiro>
Machine Translated by Google
<modelo> <div
.png>", }, }; }, }; </script>
CONCLUSÃO
Neste capítulo, aprendemos como podemos importar imagens e usá-las no
Vue.js. O capítulo seguinte abordará roteamento e parâmetros de roteamento.
Machine Translated by Google
Machine Translated by Google
Capítulo 5
Roteamento no Vue
NESTE CAPÍTULO
ÿ Roteamento
ROTEAMENTO
Vue.js tem uma série de ferramentas para criar componentes web reutilizáveis. Uma
dessas maneiras é o roteamento. Ele permite que o usuário navegue entre as
páginas sem atualizar a página. Isso é o que torna a navegação de seus aplicativos
da web atraente e direta.
Começando
Então, vamos iniciar nosso projeto Vue.js Router instalando e iniciando um novo
projeto Vue.js. Vamos precisar do Node.js instalado. Para criar um novo projeto
Vue.js, usaremos vue-cli. Siga os seguintes passos.
Execute o seguinte código em seu terminal:
//
cd vue-router
//
npm executa dev
DOI: 10.1201/9781003310464-5 105
Machine Translated by Google
Tela de boas-vindas.
<modelo> <div
class="home">
<h1>Página inicial</
h1> </
div> </template>
<script>
export default { name:
'home', data ()
{ return { msg:
'Bem-vindo
ao aplicativo Vue.js'
}
}
} </script>
</estilo>
Machine Translated by Google
Vue.use(Roteador)
caminho: '/',
nome: 'casa',
componente: casa
}
]
})
<modelo> <div
id="aplicativo">
<script>
padrão de exportação {
nome: 'Aplicativo'
} </script>
<estilo>
#aplicativo {
} </estilo>
Para inspecionar o código-fonte, use Ctrl + U e apenas copie a Navbar (só precisamos
da navbar). Copie e cole este código no componente App.vue.
<template>
<div class="blog">
<h1>{{blog}}</h1> </div>
</
template>
<script>
export
default{ name:'blog',
data ()
</script>
<estilo escopo> </
estilo>
• home.vue
• blog.view
• serviços.view
• contact.view
Configuração do
Roteador Depois de criados esses quatro componentes, devemos configurar os
roteadores para que possamos navegar entre eles.
Então, como usamos os roteadores para ir a cada componente?
Machine Translated by Google
// usa o roteador
Vue.use(Router)
Se você instalou o Vue via vue-cli, o módulo vue-router será importado por padrão.
caminho: '/blog',
nome: 'blog',
componente: blog }, {
Para tornar qualquer componente o componente padrão, defina o atributo path como slash('/'):
caminho:'/'
{
caminho:'/',
nome:'home',
componente:home
}
O vue-router contém parâmetros e métodos mais complexos, mas não vamos entrar nisso
agora.
A seguir estão os atributos e métodos que podem ser usados com
vue-router:
• Roteadores aninhados
• Visualização nomeada
• Redirecionamento e Alias
• Guarda de navegação
• Instância do roteador
Machine Translated by Google
Agora você pode navegar para qualquer componente digitando o nome do componente
nome.
Roteador-Link
<li class="nav-item">
<router-link class="nav-link" to="/blog">Blog</
roteador-link>
</li>
<li class="nav-item">
<router-link class="nav-link" to="/
serviços">Serviços</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link" to="/
contato">contato</router-link>
</li>
Visão do roteador
A tag <router-view> pode ser encontrada no arquivo App.vue. É a perspectiva em que os componentes
são renderizados. É como o div principal, que inclui todos os componentes, e retorna o componente
correspondente à rota atual. Falaremos sobre visualização de rota quando usarmos a transição de
animação na seção futura.
estágio, iremos para componentes individuais usando parâmetros. Os parâmetros permitem que o
roteamento seja dinâmico.
Faremos uma lista de produtos e um array de dados para tratar dos parâmetros. Ao clicar no link
de um produto, ele nos levará às informações da página por meio de um parâmetro.
Nesse caso, não utilizaremos um banco de dados ou uma API para obter os dados do produto.
Então precisamos estabelecer um Array de itens que servirá como banco de dados.
Dentro de home, coloque o Array na função data() do componente Vue da seguinte forma:
productTitle:"ABC", :
require('../assets/images/ image
product1.png'),
productId:1 }, {
productTitle:"KARA",
imagem : require('../assets/images/ product2.png'),
productId:2 }, {
productTitle:"Tin", :
require('../assets/images/ image
product3.png'),
Machine Translated by Google
productId:3 }, {
productTitle:"EFGH", :
require('../assets/images/ image
product4.png'),
productId:4 }, {
productTitle:"MLIT", imagem:
require('../assets/images/ product5.png'), productId:5 }, {
productTitle:"Banana", imagem
: require('../assets/images/
product6.png'),
productId:6
}]
}
}
}
<div class="linha">
<div class="col-md-4 col-lg4" v-
for="(data,index) in products" :key="index">
<img :src="data.image" class="img-fluid">
<h3>{{data.productTitle}}</h3> </div> </div>
métodos:
{ goTodetail() { this.
$router.push({name:'details'})
}
Se você clicar no título, ele retornará indefinido, pois o componente de detalhes ainda não foi
criado. Então, vamos fazer um:
detalhes.vue
<modelo>
<div class="detalhes">
<div class="container">
<h1 class="text-primary text-center">{{title}}</h1> </div> </div> </template>
<script>
padrão
de exportação{
nome:'detalhes', data()
{ return{
titulo:"detalhes"
} } } </script>
produtos:[ {
productTitle:"ABC", :
require('../assets/images/ image
product1.png'),
productId:1 }, {
Machine Translated by Google
productTitle:"KARA", :
require('../assets/images/ image
product2.png'),
productId:2 }, {
productTitle:"Lata", image :
require('../assets/images/ product3.png'), productId:3 }, {
productTitle:"EFGH", image :
require('../assets/images/ product4.png'), productId:4 }, {
productTitle:"MLIT", : require('../
assets/images/ image product5.png'),
productId:5 }, {
productTitle:"Banana", imagem
: require('../assets/images/
product6.png'),
productId:6
}]
this.$router.push({name:'details',params:{Pid:proId}})
Machine Translated by Google
{
caminho: '/details/:Pid', nome:
'detalhes', componente:
detalhes }
home.vue
métodos:
{ goTodetail(prodId) { this.
$router.push({name:'details',params:{Pid: proId}}) } }
this.$route.params.Pid
detalhes.vue
///
padrão de exportação{
nome:'detalhes', data()
{ return{ proId:this.$route.params.Pid,
Machine Translated by Google
titulo:"detalhes"
}
}
componente detail.vue
<modelo>
<div class="detalhes">
<div class="container">
<div class="linha">
<div class="col-md-12" v-for="(produto,índice) em
produtos" :key="index"> <div v-
if="proId == product.productId"> <h1>{{product.productTitle}}
</h1> <img :src="product.image" class= "img-
fluid"> </div> </div> </div> </div> </div> </template> <script>
padrão
de
exportação{
name:'details', data()
{ return{ proId:this.$route.params.Pid,
title:"details", products:
[ { productTitle:"ABC",
imagem : require('../assets/images/product1.
png'),
productId:1 },
{ productTitle:"KARA",
imagem : require('../assets/images/product2.
png'),
productId:2 }, {
Machine Translated by Google
productTitle:"Lata", imagem
png'), : require('../assets/images/product3.
productId:3 },
{ productTitle:"EFGH",
imagem : require('../assets/images/product4.
png'),
productId:4 },
{ productTitle:"MLIT", imagem
png'), : require('../assets/images/product5.
productId:5 },
{ productTitle:"Banana", :
require('../assets/images/product6. image png'),
productId:6 } ]
} } } </script>
A transição
Nesta seção, adicionaremos uma transição de animação ao componente
animado. Vamos animar a transição do componente. Melhora a navegação e
oferece um melhor UX e UI.
Para criar uma transição de animação, coloque o elemento “router-view>”
dentro da tag “<transition/>” e dê a ele um nome de classe.
app.vue
<transition name="moveInUp">
<router-view/> </
transition>
Machine Translated by Google
.moveInUp-enter-active{
opacidade: 0;
transição: opacidade 1s facilidade;
}
.moveInUp-enter-active{ animação:
fadeIn 1s facilidade de entrada;
} @keyframes fadeIn{ 0%
{ opacidade: 0;
} 60%
{ opacidade: 0,5;
} 90%
{ opacidade: 1;
}
}
.moveInUp-deixar-ativo{
animação: facilidade de movimento moveInUp .3s;
} @keyframes moveInUp{ 0%
{ transform: translateY(-410px); } }
Machine Translated by Google
O Vue.js não possui um recurso de roteador integrado. Para instalá-lo, precisaremos executar
algumas etapas adicionais.
cd node_modules/vue-router
npm instalar
<html>
<head>
<title>Instância VueJs</title> <script type =
"text/javascript" src = "js/vue. js"></script> <script type = "text/javascript"
src = "js/ vue
-router.js"></script> </head> <body>
Machine Translated by Google
<div id = "aplicativo">
<h1>Exemplo de roteamento</h1>
<p>
<link do roteador para = "/route1">Link do roteador
1</router-link>
<router-link to = "/route2">Link do roteador
2</router-link> </p>
<!--
route outlet -->
<!-- O componente correspondente à rota será renderizado
aqui. --> <router-view></
router-view> </div> <script type = "text/
"border-radius:21px;background-color:green;width:210px ;height:50px;margin:12px;font
size:26px;padding:12px;">Este é o roteador
2</div>' } const routes = [
'#app',
roteador
});
</script> </
body> </
html>
<p>
<router-link to = "/route1">Router Link 1</ router-link>
O componente <router-link> é usado para navegar até o conteúdo HTML que será mostrado ao
usuário. A “propriedade to” especifica o destino, ou seja, o arquivo de origem a partir do qual o
conteúdo exibido será selecionado.
Criamos duas conexões de roteador no código anterior.
Examine a área de script onde o roteador está configurado. As duas constantes a seguir são
criadas:
Eles possuem modelos que devem ser exibidos quando o link do roteador é clicado.
Em seguida vem a const das rotas, que determina o caminho que será apresentado na URL.
rotas const = [
{ path: '/route1', componente: Route1 }, { path: '/route2',
componente: Route2 }
];
Machine Translated by Google
Os nomes dos modelos são enviados para o componente a ser mostrado. O caminho
das rotas deve corresponder ao caminho do roteador até a propriedade.
Por exemplo, <router-link to = “path here”></router-link> A instância do
VueRouter é então criada usando o seguinte código.
As rotas são passadas como parâmetros para o construtor VueRouter. O objeto roteador
é alocado para a instância principal do Vue usando o código abaixo.
Vamos dar uma olhada em algumas outras características que podem ser dadas para
<router-link>.
Primeiro exemplo:
renderiza
como <a href = "#/route">Router Link </a>
Machine Translated by Google
Segundo exemplo:
Terceiro exemplo:
A string de consulta name = Tery aparece na rota de URL. Por exemplo, http://
localhost/vueexamples/vue router.html#/route1?name = Tery
Quando você adiciona replace a um link de roteador, ele chamará router.replace()
de router.push(). O histórico de navegação não é salvo ao usar substituir.
Exemplo:
anexar
Ao anexar ao link do roteador>link do roteador>, o caminho se torna relativo.
Se quisermos ir do link do roteador com path /route1 para o link do roteador
com path /route2, o caminho no navegador será /route1/route2.
Exemplo:
<p>
<router-link v-bind:to = "{ path: '/route1'}" tag =
"span">Link do roteador 1</router-link>
<router-link v-bind:to = "{ path: '/route2'}" tag =
"span">Link do roteador 2</router-link> </p>
A tag que agora é mostrada é uma tag span. Ainda perceberemos o clique
quando formos clicar no link do roteador.
classe ativa
Quando o link do roteador está ativo, a classe ativa adicionada é o link do roteador
ativo por padrão. Podemos substituir a classe definindo-a como visto no código a
seguir.
} </estilo>
<p>
<router-link v-bind:to = "{ path: '/route1'}" active-class =
"_active">Router Link 1</router-link>
<router-link v-bind:to = "{ path: '/route2'}" tag =
"span">Link do roteador 2</router-link> </p>
classe exata-ativa
A classe exata-ativa do link do roteador é usada por padrão. Podemos substituí-lo
por classe exata-ativa.
<p>
<router-link v-bind:to = "{ path: '/route1'}"
exact-active-class = "_active">Router Link 1</
roteador-link>
<router-link v-bind:to = "{ path: '/route2'}" tag =
"span">Link do roteador 2</router-link> </p>
Exemplo:
rotas const = {
'/': Casa, '/
sobre': Sobre
}
{ ViewComponent
() { return
routes[this.currentRoute] || NotFound
Quando usado com a API de histórico do HTML5, você pode criar um roteador do lado
do cliente simples, mas totalmente funcional.
const Usuário =
{ modelo: '...',
Machine Translated by Google
watch:
{ $route(to, from) { // reage
a mudanças de rota
}
}
}
const User =
{ template: '...',
beforeRouteUpdate(to, from, next) { // reage às
alterações de rota... // não se esqueça de
chamar next()
}
}
Obter parâmetros de consulta de uma URL é algo que devemos fazer com bastante
frequência em nossos projetos Vue.js.
Veremos como obter parâmetros de consulta de uma URL no Vue.js
na seção seguinte.
main.js
importar Vue de "vue"; importar
App de "./App.vue"; importar Helloeveryone
de "./views/Helloeveryone.vue"; importar VueRouter de "vue-router";
Vue.config.productionTip = false;
Vue.use(VueRouter);
Machine Translated by Google
new
Vue({ render: (h) => h(Aplicativo),
roteador
}).$mount("#app");
app.vue
<modelo> <div
id="aplicativo">
<router-view></router-view> </div> </
template>
<script>
padrão de exportação
{ nome:
"Aplicativo", }; </script>
<template>
<div class="hello"> <h1>oi,
{{ name }}</h1> </div> </template>
<script>
export default { name:
"Olá a todos", data() { return
{ name:
"", }; },
mount()
{ this.name = this.
$route.query.name; }, }; </script>
Machine Translated by Google
main.js
rotas const = [
{
path: "/hello", component:
Helloeveryone, props: (route) => ({ name:
route.query.name })
<modelo>
<div class="olá">
<h1>oi, {{ nome }}</h1> </div>
</
template>
<script>
export default { name:
"Helloeveryone", props:
{ name:
String, }, }; </
script>
URLSearchParams
main.js
importar Vue de "vue";
importar App de "./App.vue";
Vue.config.productionTip = false; new
Vue({ render:
(h) => h(App) }).
$mount("#app");
Machine Translated by Google
app.vue
<modelo> <div
id="aplicativo">
<Olá a todos /> </div> </
template>
<script>
import Helloeveryone from "./components/ Helloeveryone";
padrão de exportação
{ nome:
"Aplicativo", componentes: {
Olá pessoal, }, }; </
script>
componentes/ Olátodos.vue
<modelo>
<div class="olá">
<h1>oi, {{ nome }}</h1> </div> </
template>
<script>
export default { name:
"Olá a todos", data() { return
{ name:
"", }; },
mount()
{ const urlParams
= new URLSearchParams(window.
localização.pesquisa);
this.name = urlParams.get("nome"); }, }; </script>
Machine Translated by Google
CONCLUSÃO
Neste capítulo, aprendemos sobre roteamento em Vue.js, bem como quais roteadores e
parâmetros são e como eles são utilizados. O capítulo seguinte nos ensinará sobre
navegação programática.
Machine Translated by Google
Capítulo 6
Programática
Navegação
NESTE CAPÍTULO
ÿ Navegação programática
ÿ Carregamento lento
No Capítulo 5, estudamos sobre roteamento em Vue.js, bem como o que são roteadores
e parâmetros e como eles são utilizados. Este capítulo nos ensinará sobre navegação
programática e carregamento lento.
NAVEGAÇÃO PROGRAMÁTICA
Vue.js é uma estrutura básica de aplicativo da web para desenvolver projetos front-end
interativos.
Esta peça irá ver como percorrer as rotas do Vue Router dinamicamente.
Rotas programáticas
Quando um link de roteador é clicado, Router. Push (...) é chamado. Nós podemos usá-lo
src/index.js : const
Foo = { template: "<p>foo</p>" }; const Bar = { template:
"<p>bar</p>" };const routes = [
{
caminho: "/foo",
componente: Foo }, {
path: "/bar",
componente: Bar
}
];const router = new VueRouter({
rotas
});nova Visualização({
el: "#app",
roteador,
métodos:
{ goTo(route) {
this.$router.push(rota);
}
} });
index.html:
<!DOCTYPE html>
<html>
<cabeça>
<title>Aplicativo</title>
<meta charset="UTF-8" /> <script
src="https://unpkg.com/vue/dist/vue.js"></ script> <script src=" https://unpkg.com/
vue-router/
dist/
vue-router.js"></script> </head>
<body>
<div
id="app">
<div>
Machine Translated by Google
A função goTo no código acima aceita uma string que representa o caminho que
desejamos seguir.
No método, usamos this.$router.push(route); no método.
Assim, vemos Foo quando clicamos nele e Bar quando clicamos nele.
Também podemos enviar um objeto da seguinte forma:
Além disso, quando $ router.Push, podemos viajar para rotas designadas. Para fazer isso,
nós escrevemos:
src/index.js : const
Foo = { template: "<p>foo</p>" }; const Bar = { template:
"<p>bar</p>" };const routes = [
{
nome: "foo",
caminho: "/foo",
componente: Foo }, {
nome: "bar",
caminho: "/bar",
componente: Bar
}
];const router = new VueRouter({
rotas
});nova Visualização({
el: "#app",
roteador,
métodos:
{ goTo(nome) { this.
$router.push({ nome });
}
} });
Machine Translated by Google
index.html:
<!DOCTYPE html>
<html>
<cabeça>
<title>Aplicativo</title>
<meta charset="UTF-8" /> <script
src="https://unpkg.com/vue/dist/vue.js"></ script> <script src="https://unpkg.com/
vue-router/
dist/
vue-router.js"></script> </head>
<body>
<div
id="app"> <div>
</div>
<script src="src/index.js"></script> </body> </html>
caminho: "/bar",
componente: Bar } ];
Então, no método goTo, podemos ir para uma rota pelo nome da seguinte forma:
ou:
{
caminho: "/foo",
componente: Foo }, {
path: "/bar",
componente: Bar
}
];const router = new VueRouter({
rotas
});nova Visualização({
el: "#app",
roteador,
métodos:
{ goTo(path, query) { this.
$router.push({ path, query });
Machine Translated by Google
} });
Quando clicamos em Foo, vemos foo 1, pois usamos uma string de consulta com id como chave.
No Vue Router 3.1.0 ou posterior. Roteador e push. Como replace retorna promessas, não
precisamos passar o segundo e o terceiro parâmetros para lidar com esses cenários.
Se nosso destino for o mesmo que a rota atual, mas apenas os parâmetros mudarem,
como /users/1 para /users/2, devemos utilizar o hook beforeRoute Update para responder às
mudanças.
router.go(n)
Podemos fazer uso do roteador.vá para frente ou para trás especificando o número de passos
para avançar ou retroceder. O positivo está à frente e o negativo está para trás.
src/index.js : const
Foo = { template: "<p>foo</p>" }; const Bar = { template:
"<p>bar</p>" };const routes = [
{
path: "/foo",
componente: Foo },
{
path: "/bar",
componente: Bar
}
Machine Translated by Google
} });
index.html:
<!DOCTYPE html>
<html>
<cabeça>
<title>Aplicativo</title>
<meta charset="UTF-8" /> <script
src="https://unpkg.com/vue/dist/vue.js"></ script> <script src="https://unpkg.com/
vue-router/
dist/
vue-router.js"></script> </head>
<body>
<div
id="app">
<div>
<router-link to="foo">Foo</router-link> <router-link
to="bar">Barra</router-link> <a href="#"
@click="forward">Avançar< /a> <a href="#" @click="back">Voltar</
a> </div> <router-view></router-view> </div> <script
src="src/
index. js"></script> </body> </html>
Para navegar para um caminho com nomes alternativos, caminhos, strings de consulta,
ou argumentos, usamos a função router.push.
Podemos fazer a mesma coisa com o roteador. Substitua, mas não crie um novo item
de histórico.
Ambos aceitam uma string ou objeto para a rota, bem como manipuladores para
onComplete e onAbort.
Router.go nos permite percorrer o histórico do navegador. Para avançar ou retroceder,
uma série de passos deve ser realizada.
router.push()
Você pode utilizar a função router.push() da instância do roteador. Considere os seguintes
exemplos:
// objeto
router.push({ path: 'home' })
// rota nomeada
router.push({ name: 'user', params: { userId: '123' } })
router.push() exemplo
Suponha que o usuário acabou de preencher um formulário. Se nenhuma falha for
encontrada, o usuário deve ser direcionado para a página inicial. Podemos fazer isso
primeiro validando o formulário e, em seguida, navegando o usuário até a página inicial
usando o roteador. função push(). Considere o seguinte exemplo:
métodos:
{ submit() { if
(this.$refs.form.validate()) { router.push({ path:
'home' }) } } }
Machine Translated by Google
Além de utilizar <router-link> para construir tags de âncora para navegação declarativa,
também podemos usar as funções de instância do roteador programaticamente.
Vale a pena notar que você pode acessar a instância do roteador de dentro de uma
instância do Vue digitando $ router. Como resultado, você pode executar this.$router.push.
Usar roteador. Pressione para navegar para um URL diferente. Essa técnica adiciona
um item adicionado à pilha de histórico, para que, quando o usuário clicar no botão Voltar
do navegador, ele retorne à URL anterior.
Como esse é o método chamado internamente quando você clica em um <link do
roteador>, clicar em um <link do roteador: para=“...”> é igual a chamar router.push (…).
Declarativo Roteador
<router-link :to="..."> programático.push (...)
// objeto
router.push({ path: 'home' })
// roteador de rota
nomeada.push({ name: 'user', params: { userId: '123' } })
Observe que, se um caminho for especificado, os parâmetros serão ignorados, o que não
é o caso da consulta, conforme visto no exemplo anterior. Em vez disso, você deve fornecer
o nome da rota ou definir explicitamente todo o caminho com qualquer parâmetro:
Declarativo Programática
<router-link :to="..." substituir> roteador.substituir(...)
router.go(n)
Esta função aceita um único inteiro como um argumento que define quantos passos percorrer
para frente ou para trás na pilha de histórico, comparável a uma janela. history.go(n).
Exemplo:
roteador.go(-100)
roteador.go(100)
CARREGAMENTO LENTO
Lazy loading é uma abordagem de design que adia a inicialização de componentes e objetos
até que sejam necessários. O carregamento lento indica que um elemento DOM de destino é
carregado e se torna visível (quando há uma interseção entre duas seções, com base em um
determinado valor limite) somente quando um usuário rola em uma página da web.
A estratégia de carregamento rápido torna o pacote JS bastante oneroso como seu Vue. js se
desenvolve em tamanho e complexidade. Isso pode ser um problema para seus consumidores
finais, que podem estar usando um dispositivo móvel ou não estão conectados a uma conexão
de Internet de alta velocidade.
O carregamento lento garante que seu pacote JavaScript seja fornecido para que os
componentes DOM sejam listados em termos de hierarquia, do mais importante ao menos importante.
Este método garante que você tenha controle total sobre a experiência do usuário, incluindo o
período de espera inicial enquanto os recursos são carregados no DOM.
Vue.js Para exibir o carregamento lento no Vue.js, usaremos o Vue CLI para criar um aplicativo
Vue.js de exemplo e adicionar roteamento durante a etapa de configuração.
Machine Translated by Google
Abra um terminal em um diretório de sua escolha e execute o seguinte comando para criar
um novo projeto:
• Vuex
• Pré-processadores CSS ÿ
Linter / Formatador • Teste de
unidade • Teste E2E
cd test_project
serviço de execução npm
caminho: '/',
nome: 'casa',
componente: Home },
{
] })
Como o Vue CLI permite carregamento lento para rotas secundárias, como o componente
sobre em nosso exemplo, isso pode parecer diferente para a parte do componente sobre.
atribuí-lo a um curso.
Crie um novo arquivo em sua pasta de exibições, chame extra.vue. Depois disso,
coloque o conteúdo do arquivo about.vue no arquivo extra.vue. É assim que deve parecer:
<template>
<div class="about">
<h1>Esta é uma página extra</h1> </div>
</
template>
Para adicionar a rota, abra seu arquivo router.js e adicione o seguinte bloco de código ao
array de rotas:
{
caminho: '/',
nome: 'casa',
componente: Home }, {
caminho: '/extra',
nome: 'extra',
componente: Extra
}
]
})
A última etapa para torná-lo visível no DOM é adicioná-lo ao arquivo App .vue principal por
meio de um link de roteador.
Altere a seção de modelo em seu arquivo app.vue para o bloco de código abaixo:
<template> <div
id="app"> <div id="nav">
Agora que configuramos todas as rotas em nosso exemplo de projeto Vue.js, é hora de
configurar todas as suas rotas para serem carregadas lentamente mediante solicitação.
Abra seu arquivo router.js e cole o seguinte bloco de código nele:
caminho: '/',
nome: 'home',
componente: lazyLoad('Home') }, {
Veja a seguir um detalhamento do que foi feito para fazer com que essas exibições sejam carregadas
mais lentamente.
Você deve ter visto instruções de importação para Vue.js, Router, Home, About e outras coisas no
início. Como essas instruções são responsáveis pelo carregamento antecipado de componentes,
você deve excluí-las quando mudar para a estratégia de carregamento lento.
Função lazyLoad O
instrução de importação que instrui o webpack a carregar os componentes de forma assíncrona deve
ser incluída na seção de rotas em vez da seção de importação no início do script.
Machine Translated by Google
O Webpack representará esses três blocos como blocos independentes e carregados lentamente.
Claro, você escreve muito código de script em projetos Vue – afinal, você está trabalhando com
muitos componentes (e contexto, ganchos, etc.).
Existem dois tipos de código que podem ser carregados lentamente no componente
projetos web focados como os que você está criando com Vue:
• Rotas: Quando um usuário acessa uma rota, apenas o código do componente da rota (e todo o
código relacionado) é carregado.
{
componentes:
{ 'perfil de usuário': () => import('./perfil de usuário/
Perfil de usuário');
}
}
Machine Translated by Google
Você usa este componente carregado lentamente como qualquer outro componente:
<div v-if="someCondition">
<perfil de usuário></perfil de usuário> </
div>
},
],
});
O Vue e a ferramenta de processo de construção subjacente (por exemplo, Webpack) lidam com
todo o resto; Você não precisa fazer mais nada.
Carregamento preguiçoso, como o nome indica, é o ato de carregar bits (pedaços) do seu
programa de maneira aleatória. Em outras palavras, você só os carrega quando precisamos deles. A
técnica de dividir o aplicativo nessas partes carregadas lentamente é conhecida como divisão de
código.
Quando um visitante visualiza seu site, nem sempre você precisa de todo o código
do seu pacote JavaScript imediatamente.
Por exemplo, não precisamos gastar recursos vitais carregando a parte “Minha página” de nosso
site para usuários iniciantes. Modais, dicas de ferramentas e outras seções e componentes que não
são necessários em todas as páginas também podem ser incluídos.
Na melhor das hipóteses, baixar, analisar e executar o pacote completo em cada carregamento
de página é ineficiente quando apenas alguns bits são necessários.
O carregamento lento nos permite separar o pacote e entregar apenas os bits necessários,
evitando que os usuários percam tempo baixando e processando códigos que não serão utilizados.
Para examinar quanto código JavaScript é realmente utilizado em nosso site; vá para ferramentas
de desenvolvimento -> cmd+shift+p -> digite cobertura -> hit'record.' Deveríamos
Machine Translated by Google
Tudo em vermelho é desnecessário no caminho atual e pode ser carregado lentamente. Se você
estiver utilizando mapas de origem, poderá visualizar quais partes não foram invocadas clicando em
qualquer arquivo desta lista. Até o vuejs.org, como podemos ver, tem muito espaço para
desenvolvimento.
Conseguimos reduzir o tamanho do pacote do Vue Storefront em 60%, carregando lentamente
componentes e bibliotecas adequados. Essa é a técnica mais simples para melhorar o desempenho.
Ok, sabemos o que é carregamento lento e como ele é benéfico. Agora deixe-nos
veja como podemos aproveitar o carregamento lento em nossos aplicativos Vue.js.
Importações dinâmicas
// cat.js const
Cat = { { miau:
console.log("Meowwwww!")
function ()
// main.js importa
Cat de './cat.js'
Gato.miau()
Ele será adicionado ao gráfico de dependência como um nó de main.js e empacotado com ele.
Mas e se precisarmos do nosso módulo Cat apenas em situações particulares, como em reação
à interação do usuário? Este módulo não deve ser incluído em nosso primeiro pacote porque nem
sempre é necessário. Precisamos de um método para informar nosso programa quando baixar este
pedaço de código.
Machine Translated by Google
// main.js
const getCat = () => import('./cat.js') //
posteriormente no código como resposta a alguma interação do usuário
como clique ou mudança de rota
Sem nos aprofundarmos muito, vejamos como esses arquivos estão dispersos pelo aplicativo:
// categoria.js
const categoria = { init
() { ... } } categoria
padrão de exportação
Machine Translated by Google
// product.js
importa galeria de ('./productGallery.js')
produto padrão
// main.js
const getProduct = () => import('./product.js') const getCategory =
() => import('./category.js')
entendemos o que é lazy loading e por que precisamos dele. É hora de ver como podemos usá-lo
em nossos aplicativos Vue.
A boa notícia é que é incrivelmente simples e podemos carregar o componente de arquivo
único completo, incluindo seu CSS e HTML, usando a mesma sintaxe de antes.
... e isso é tudo que você precisa! O componente agora só será baixado quando for
solicitado. A seguir estão os métodos mais frequentes para invocar o carregamento
dinâmico de um componente Vue:
<template>
<div>
<lazy-component /> </
div> </
template>
<script>
const lazyComponent = () => import('Component.vue') export default
{ components:
{ lazyComponent }
}
// Outro padrão de
exportação de sintaxe
{ components:
{ lazyComponent: () => import('Component.vue')
}
} </script>
Quando o valor v-if mudar para true, o componente não será carregado até que seja
necessário no DOM.
Ao usar um empacotador para desenvolver aplicativos, o pacote JavaScript pode
ficar muito grande, afetando o tempo de carregamento da página. Seria mais eficiente
se pudéssemos dividir os componentes de cada rota em blocos discretos e carregá-los
apenas quando a rota fosse visitada.
Machine Translated by Google
Em segundo lugar, podemos utilizar a terminologia de importação dinâmica (abre uma nova
janela) no webpack 2 para identificar um ponto de divisão de código:
Combinando os dois, é assim que você constrói um componente assíncrono que será dividido
automaticamente pelo webpack:
Nada deve ser alterado na configuração da rota; simplesmente use Foo como de costume:
podemos agrupar todos os componentes contidos na mesma rota no mesmo bloco assíncrono.
Para fazer isso, devemos utilizar chunks nomeados (abre uma nova janela) especificando um
nome de chunk usando a sintaxe de comentário (webpack > 2.4 obrigatório):
const Foo = () => import(/* webpackChunkName: "group foo" */ './Foo.vue') const Bar =
() => import(/* webpackChunkName:
"group foo" */ './Bar .vue') const Baz = () => import(/* webpackChunkName: "grupo foo"
*/ './Baz.vue')
Machine Translated by Google
CONCLUSÃO
Discutimos navegação programática e carregamento lento neste capítulo, incluindo
o que são e como são utilizados. Aprenderemos sobre a API de contexto sofisticada
no próximo capítulo.
Machine Translated by Google
Machine Translated by Google
Capítulo 7
NESTE CAPÍTULO
ÿ API de Contexto
API de CONTEXTO
A API React Context permite que um projeto React gere variáveis globais que podem
efetivamente passar. Esta é uma alternativa à “perfuração de adereços”, na qual os adereços
são passados dos avós para os filhos, para os pais e assim por diante.
“O contexto também é anunciado como uma abordagem mais simples e leve para lidar com o
estado do Redux.” (“React – API de Contexto – Comunidade DEV”).
A API de contexto é um novo recurso introduzido no React 16.3 que permite que você
comunique o estado de maneira fácil e leve em todo o projeto (ou parte dele).
maneira em torno de Redux. No entanto, o Redux tem desvantagens, e é por isso que é
crucial entender o que a Context API fornece que o Redux não oferece:
• Simplicidade: quando os indivíduos usam o Redux, eles tendem a manter todo o seu
estado no Redux, o que apresenta dois problemas:
Nota importante
Redux é apenas uma ideia. Suponha que você se sinta confortável com redutores e ações
e não os considere um obstáculo. Nessa situação, como o inventor do Redux, Dan Abramov,
destacou em seu artigo médio sobre se o Redux é sempre necessário, você também pode
projetar redutores e ações que cobrem a Context API como a loja.
Você pode estar pensando consigo mesmo: “Até agora, estou satisfeito. Como incluo a API
de contexto em meu aplicativo?” Primeiro, certifique-se de que você precisa dele. Às vezes,
as pessoas utilizam o estado compartilhado entre os componentes aninhados, em vez de
apenas fornecê-los como adereços. E se você precisar, você deve seguir os seguintes passos:
1. Crie uma pasta chamada contexts dentro da raiz do seu aplicativo (opcional). apenas
uma convenção).
</UserContext.Provider> ); };
</UserContext.Consumer> );
A diferença entre as duas opções acima é se você deseja que o contexto seja
uma única propriedade aninhada por esse nome ou se deseja que ele exploda
em suas propriedades (o que é mais conveniente).
ReactDOM.render(
<UserProvider>
<App /> </
UserProvider>,
document.getElementById("root")
);
padrão de exportação com User(LoginForm);
legais sobre o React é que temos uma infinidade de opções para resolver situações específicas.
Também temos mais algumas formas de bibliotecas, uma série de bibliotecas CSS e, para a parte
mais importante do React, uma série de outras bibliotecas relacionadas a questões de dados de
estado no React.
Identificar quando utilizar uma biblioteca específica em nosso projeto é um talento que adquirimos
com a prática. Particularmente com o React, onde há tantas bibliotecas para escolher, podemos
começar a instalar e utilizar bibliotecas que não precisamos.
A Context API é uma API do React que pode lidar com uma variedade de problemas relacionados
ao gerenciamento de estado e como o estado é entregue aos componentes em projetos modernos.
Em vez de instalar uma biblioteca de gerenciamento de estado em seu projeto, o que pode reduzir
o desempenho do projeto e aumentar o tamanho do pacote, você pode apenas utilizar a Context
API e ficar bem.
Vamos ver o que é a Context API, quais problemas ela resolve e como usá-la.
Um dos princípios do React é dividir seu aplicativo em componentes para reutilização. Portanto,
temos alguns componentes diferentes em um pequeno aplicativo React. À medida que nosso
aplicativo se expande, esses componentes podem se tornar grandes e incontroláveis, portanto,
precisamos dividi-los em partes menores.
Essa é uma das melhores ideias do React: você pode projetar vários componentes e ter uma
aplicação sucinta e mantida sem precisar fazer um componente super colossal para lidar com toda
a sua aplicação.
Depois de dividir os componentes em componentes menores para facilitar a manutenção, esses
pequenos componentes agora podem exigir determinados dados para operar normalmente. Se
esses pequenos componentes requerem dados para funcionar,
Machine Translated by Google
os dados devem ser enviados do componente pai para o componente filho usando props. É aqui
que podemos desacelerar nosso aplicativo e causar problemas no desenvolvimento.
}]);
return ( <div>
<h1>Notas</h1>
{notes.map(note => { return
( <div>
<h1>{note.title}</h1>
<h3>{note.description}</h3 > <p>{note.done?
"feito!" : "não feito!"}</p> </div> ); })} </div> ); };
Podemos ver neste código que podemos dividir este componente em componentes menores,
tornando nosso código mais claro e gerenciável. Por exemplo, podemos construir um componente
Note e aninhar três componentes adicionais dentro dele: Title, Description e Done.
}]);
Machine Translated by Google
retornar (
<div>
<h1>Notas</h1>
{notes.map(({ título, descrição, feito }) => {
return <Nota título={título}
descrição={descrição} feito={feito} />;
})}
</div> ); };
div> ); };
Por exemplo, você não está reutilizando e produzindo código sustentável, o que pode
comprometer o futuro do seu programa.
Isso é conhecido como "perfuração de suporte". A médio e longo prazo, isso pode atrapalhar
e desacelerar seu desenvolvimento – dar props repetidamente aos seus componentes causará
dificuldades futuras em sua aplicação.
Esse é um dos principais problemas que a Context API foi criada para resolver para nós.
API de contexto
A API Context pode ser usada para comunicar dados com diferentes componentes sem ter
que alimentar dados explicitamente por meio de props. A API Context, por exemplo, é adequada
para os seguintes casos de uso: temas, idioma do usuário, autenticação e assim por diante.
criarContexto
Para começar a usar a API Context, devemos primeiro construir um contexto usando o método
createContext do React.
Depois de criar seu contexto, ele agora tem dois componentes React:
Provedor e Consumidor.
Fornecedor
O componente Provider será utilizado para encapsular todos os componentes que terão acesso
ao nosso contexto.
<NotesContext.Provider value={this.state.notes}>
...
</Notes.Provider>
O componente Provider recebe um valor chamado prop, que pode ser acessado por todos os
componentes contidos nele e supervisiona o acesso aos dados de contexto.
Consumidor
<NotesContext.Consumer>
{valores => <h1>{valor</h1>}
</Notes.Consumer>
useContext
Você pode estar usando React Hooks há algum tempo, mas se você não sabe o
que são ou como eles funcionam, deixe-me explicá-los brevemente:
• React Hooks nos permitem lidar com dados de estado dentro da comunicação funcional
Primeiro, vamos construir nosso estado de autenticação. Este será um estado booleano
básico usado para determinar se o usuário está ou não autorizado. Além disso,
escreveremos um método chamado handleAuth que se encarregará de mudar nosso
estado de autenticação.
Como o provedor não aceita valores de array, construiremos um array chamado data
que contém nosso estado de autenticação e nosso método handleAuth. Esta informação
passará como um valor para nosso AuthContextProvider.
} retorna contexto; };
Então, para a conclusão de nossa função, vamos exportar e usarAuth nosso AuthProvider.
<React.StrictMode>
<AuthProvider>
<App /> </
AuthProvider> </
React.StrictMode>,
rootElement
);
Vamos fazer um botão que chamará o método handleAuth toda vez que for clicado.
Vamos também verificar se o valor de autenticação muda quando clicamos no botão
usando uma renderização ternária de um h1 básico.
<div>
<h3>Está autenticado?</h3> <h1>{auth
=== false? "Não autenticado" : "Autenticado"} </h1> <button
onClick={handleAuth}>Alterar
autenticação</
botão>
</div>); };
Machine Translated by Google
Agora temos um aplicativo simples que faz uso da API Context. Vale a pena notar que não
precisamos transferir nenhuma propriedade dos componentes pai para filho.
Em alguns casos, como autenticação, a API de Contexto pode ser útil para identificar se
o usuário está ou não autenticado em vários componentes não relacionados.
aplicativo complicado, você frequentemente encontrará circunstâncias nas quais deve fornecer
muitos adereços de seu componente pai para um componente filho profundamente aninhado.
Quando confrontado com tais circunstâncias, DI é uma ferramenta especialmente útil.
Embora uma única loja resolva muitas dificuldades, ela tem certos limites, que são os
seguintes:
1. Quando você tem muitos recursos em seu aplicativo, deseja que cada um tenha um
contexto (armazenamento) exclusivo. Você não quer que um elemento do seu aplicativo
interfira em outro.
3. Quando você tem um componente vinculado à loja, deseja várias instâncias desse
componente em sua página. Por exemplo, se você tiver um formulário vinculado à loja,
precisará de 2 a 3 formulários na mesma página.
O React 16.3 estreou a API de contexto, que rapidamente ganhou popularidade. Não era
nada fora da caixa que não existia anteriormente, mas uma melhor documentação e uma API
concisa tornaram mais fácil para os desenvolvedores utilizar a DI e a tornaram mais acessível.
})
exportar mutações const = { }
<modelo>
<div class="Formulário">
<!-- <NestedComponent /> --> </div> </
template>
<script>
import { storeTemplate } de "./core/util"; importar Vuex de
"vuex"; export default { name:
"Form", props:
{ ischemia: { type:
Object,
required: true
},
schema:
{ type: Object,
required: true
},
Machine Translated by Google
dados:
{ tipo: Objeto
},
renderizadores: {
tipo: Matriz
}
},
data()
{ return
{ iStore: new Vuex.Store({ estado:
storeTemplate.state, mutações:
storeTemplate.mutations, ações: storeTemplate.actions
})
};
},
provide: function() { return { iStore:
this.iStore
};
},
created()
{ this.iStore.dispatch("initForm", {
uiSchema: this.uiSchema,
renderizadores: this.renderers, esquema:
this.schema, data: this.data
});
this.iStore.subscribe((mutação, estado) => { if (mutação.type ==
"updateData") {
this.$emit("onDataChanged", estado.data);
}
});
},
calculado: {}
};
</script>
} </estilo>
Machine Translated by Google
<modelo>
<div>
<div>Componente de formulário aninhado</div>
</div>
</modelo>
<script>
export { ReviewLayoutTester }; export default
{ props: {}, inject:
["iStore"],
montado () {
console.log(this.iStore.state.
dados);
}
};
</script>
<estilo> </
estilo>
Você pode simplesmente injetar o iStore em qualquer um dos componentes aninhados filho
e começar a utilizá-lo.
Não precisamos educar o usuário sobre nada interno porque todos os componentes do
Form podem lidar com lojas próprias. Além disso, todo o código específico do plug-in é
gerenciado em um local específico dentro do plug-in.
<Acordeão>
<AccordionItem>
<AccordionHeader>Conteúdo do cabeçalho</
AccordionHeader>
<AccordionPanel>Conteúdo do painel</AccordionPanel>
</AccordionItem>
</Acordeão>
Cada AccordionItem deve manter algum estado, seja ele expandido ou não. No
entanto, AccordionHeader também deseja acessar esse valor para exibir o botão de
alternância relevante. AccordionPanel também pode exigir acesso a isso porque é o item
que é expandido e recolhido.
Uma opção é fornecer o valor ampliado ao usuário por meio de propriedades de
renderização e garantir que sua documentação os informe que eles devem enviar isso
para o cabeçalho e os componentes do painel.
<Acordeão>
<AccordionItem render={({expanded}) => (
<AccordionHeader expandido={expandido}>
Conteúdo do cabeçalho
</AccordionHeader>
<AccordionPanel expandido={expandido}>
Conteúdo do painel
</AccordionPanel>
)} /
>
</Acordeão>
Embora isso possa parecer uma abordagem razoável, não é ideal que o
O consumidor do nosso componente deve se preocupar com a qualidade do componente
Machine Translated by Google
this.toggleExpansion = () =>
{ this.setState({ expandido: !this.state.
expandido }) }
this.state =
{ expandido: false,
toggleExpansion: this.toggleExpansion
}
}
renderizar ()
{ retornar (
<AccordionItemContext.Provider
valor={este.estado}>
<div className="accordion-item">
Machine Translated by Google
AccordionItemContext.Provider>
)
}
}
( <AccordionItemContext.Consumer>
{({ expandido, toggleExpansion }) => ( <h2
className="accordion-header">
<button onClick={toggleExpansion}> { expandido?
'ÿ' : 'ÿ' } { props.children } </button>
</h2>
)}
</AccordionItemContext.Consumer>
)
}
Como filho, o componente Consumer requer uma função. Esta função receberá o valor
de contexto, que será destruído em expandido e toggleExpansion. Nosso componente
agora pode usar esses dados em seu modelo.
Da mesma forma, usaremos Consumer para conceder acesso AccordionPanel ao
valor de contexto:
Agora podemos realmente criar nossa API perfeita para o componente sanfona.
Os usuários do nosso componente não terão que se preocupar em enviar o estado para
cima ou para baixo na árvore de componentes. Eles desconhecem o interior dos
componentes:
<Acordeão>
<AccordionItem>
<AccordionHeader>Conteúdo do cabeçalho</
AccordionHeader>
<AccordionPanel>Conteúdo do painel</
Painel Acordeão>
</AccordionItem>
</Acordeão>
Fornecer/Injetar no Vue O
Vue tem uma ferramenta chamada fornecer/injetar que é comparável à API de contexto
do React. Utilizaremos o método de fornecimento em nosso componente acordeon-item
Vue para fazer isso:
}
}
},
fornecer ()
{ retornar {
acordeonItemState: this.sharedState
}
},
render (criarElemento) {
return createElement( 'div',
{ class:
'accordion-item' }, this.$slots.default
)
}
})
Machine Translated by Google
Retornamos um objeto de provide () que contém o estado que queremos fornecer a outros
elementos. Vale notar que enviamos um objeto para o acordeonItemState ao invés de
simplesmente passar o valor <code">expandido. Para ser reativo, o supply deve passar um
objeto.
Deve-se notar que estamos gerando este componente com uma função render, que não
é essencial para usar o provide/inject.
Agora vamos injetar esse estado em nossos componentes filhos. Vamos apenas utilizar a
propriedade inject, que aceita um array de strings correspondentes às propriedades do objeto
definidas em give.
Vue.component('accordion-header', { inject:
['accordionItemState'],
modelo: '
<h2 class="accordion-header"> <button
@click="accordionItemState. expandido = !
accordionItemState.expanded">
{{ acordeonItemState.expanded? 'ÿ':
'ÿ' }}
<slot></slot> </
button> </h2>
'
})
Podemos acessar esses valores em nosso modelo depois de adicionar o nome da propriedade
em inject.
Vue.component('painel-acordeão', {
injetar: ['accordionItemState'],
modelo: '
<div class="accordion-panel" :class="{
expandido: acordeonItemState.expanded }">
<slot></slot> </div>
'
})
Vale a pena lembrar que você só deve enviar props implicitamente quando fizer sentido. O
uso excessivo disso pode esconder o verdadeiro
Machine Translated by Google
funcionalidade de seus componentes e confundir outros desenvolvedores que possam estar trabalhando
em seu projeto.
Uma biblioteca de componentes compactados e distribuídos para uso em outros aplicativos é um
caso de uso adequado, pois os atributos internos dos componentes não precisam ser divulgados ao
usuário final.
Por meio do compartilhamento de estado implícito, a API de contexto do React e o provedor de Vue/
a funcionalidade de injeção habilita isso.
de aplicativos React pode ser desafiadora, especialmente quando os usuários encontram bugs difíceis
de recriar. Se você deseja monitorar e rastrear o estado do Redux, descobrir automaticamente bugs de
JavaScript e medir consultas de rede lentas e tempo de carregamento de componentes, experimente
o LogRocket.
O LogRocket funciona de forma semelhante a um DVR para aplicativos da web, capturando tudo o
que ocorre em seu projeto React. Em vez de especular por que os problemas surgem, você pode coletar
e relatar a condição de seu aplicativo no momento em que ocorreu um problema. O LogRocket também
monitora o desempenho do seu aplicativo, fornecendo dados como carga da CPU do cliente, consumo
de memória do cliente e muito mais.
O pacote de middleware LogRocket Redux fornece mais visibilidade em suas sessões de usuário.
O LogRocket registra todas as atividades e estados da loja Redux.
Ao trabalhar com a API Vue 3 Composition, há várias novas maneiras de acessar a funcionalidade
do componente. Nesta seção, veremos o argumento de contexto da função setup.
Esses ajustes são necessários, pois a API de composição não tem a mesma referência a isso que a
API de opções.
Poderíamos usar a API de opções para usar console.log(this) em qualquer uma das opções para
adquirir uma referência ao próprio componente, permitindo-nos acessar seus props, propriedades
computadas, dados e muito mais.
exportar padrão
{ adereços: {
Sobrenome: String, },
data()
{ return
{ nome: "olá", }; },
criada() {
Machine Translated by Google
{ createdMethod()
{ console.log("created"); }, }, };
O Vue 3, por outro lado, nos permite usar a API de composição, onde todo o nosso
código está contido em uma função de configuração. Isso implica que definimos
nossos dados reativos, métodos e propriedades calculadas na configuração.
obtemos
acesso aos props se não temos isso?
nome = ref("olá");
métodocriado(); return
{ métodocriado,
nome,
}; }, };
context.attrs
Novamente, context.attrs contém todos os atributos non-prop que foram passados para nosso
componente.
O que exatamente isso significa?
Qualquer propriedade de elemento que adicionarmos que não esteja declarada em nossas props será
disponível em context.attrs quando utilizamos nosso componente.
Suponha que temos um componente personalizado que aceita uma proposta de valor.
context) { console.log(context.attrs); }, };
<modelo>
<componente personalizado
:valor="valor"
Machine Translated by Google
teste="oi"
@close="fechar"
/>
</modelo>
Como você pode ver, inclui tudo, exceto nossos adereços declarados. Ouvintes de eventos e
atributos HTML são exemplos disso.
Uma coisa a ter em mente é que attrs não é reativo. Ou seja, se quisermos implementar
efeitos colaterais em resposta à alteração dos valores attrs, devemos utilizar o gancho de ciclo
de vida onUpdated.
context.slots
Em seguida, considere o contexto. Caça-níqueis são um pouco desconcertantes, então vamos
dar um exemplo de por que eles são benéficos.
Em uma palavra, contexto. Os slots nos fornecem acesso ao método de renderização de
cada slot. Isso é importante quando não estamos utilizando código de modelo e estamos
desenvolvendo nosso próprio método de renderização exclusivo.
Vue sugere a utilização de templates na maioria das circunstâncias; no entanto, se você
realmente deseja obter todo o poder do JavaScript, podemos escrever nossas próprias funções
de renderização.
<modelo>
<div>
<h1 v-if="nível == 1">
<slot /> </
h1>
<h2 v-if="nível == 2">
<slot /> </
h2>
<h3 v-if="nível == 3">
<slot /> </
h3>
<h4 v-if="nível == 4">
<slot /> </
h4>
<h5 v-if="nível == 5">
<slot /> </
h5>
Machine Translated by Google
} </script>
Para todas as seis opções de título, usamos condicionais v-if e v-else-if neste código.
E, como você pode ver, há muitos códigos idênticos, fazendo com que a página
pareça excessivamente confusa.
Em vez disso, podemos construir nosso cabeçalho programaticamente usando o
método render. É assim que o método de configuração da API de composição se
parece.
OPCIONAL /* FALTANDO! é
aqui que as crianças vão, para nós nosso slot */ );
}, };
}, };
Agora, se executarmos isso com um componente pai básico como este, veremos o
que acontece.
<modelo>
<componente-filho :level="1">
Olá a todos </child-
component> </template>
context.emit
Finalmente, considere o contexto. emit toma o lugar de this.$emit como nosso método
de emitir eventos de nosso componente.
Isso é útil para transmitir qualquer tipo de evento para um componente pai, com ou
sem dados.
Suponha que queremos criar um botão X que gere um evento de fechamento.
<template>
<div>
<button @click="closeModal">X</button> </div> </
template>
<script> padrão
de
exportação { setup
(props, context) {
const closeModal = () => {
Machine Translated by Google
return {
closeModal
}
}
} </script>
Em seguida, usando a diretiva von, podemos ouvir esse evento de fechamento em nosso
componente pai.
• dados
• calculado
• métodos
CONCLUSÃO
Este capítulo nos ensinou sobre APIs de Contexto, o que são e como utilizá-las. No
capítulo seguinte, aprenderemos sobre testing, nock e Vue.js-testing-library.
Machine Translated by Google
Capítulo 8
NESTE CAPÍTULO
ÿ NOCK
ÿ Vue.js-testing-library
Aprendemos sobre a API de contexto, incluindo o que são e como são utilizados, no
Capítulo 7. Este capítulo nos ensinará sobre testes, Nock e a biblioteca Vue.js-testing-library.
NOCK
Nock é uma biblioteca de zombarias e expectativas do servidor Node.js.
Nock pode usar para isolar e testar módulos que executam solicitações HTTP.
Por exemplo, se um módulo enviar consultas HTTP para um servidor CouchDB ou
a API da Amazon, você pode isolar esse módulo e testá-lo separadamente.
Como funciona?
• O que é Nock?
Manter a cobertura de teste e escrever testes confiáveis pode ser difícil ao lidar com código que
depende de serviços externos. Por vários motivos, os testes que executam consultas HTTP
reais para serviços externos podem ser propensos a erros. Por exemplo, os dados precisos
entregues variam de acordo com cada solicitação, problemas de conectividade de rede ou
mesmo limitação de taxa.
A menos que o teste seja expressamente destinado a verificar a disponibilidade, velocidade
de resposta ou forma de dados de um serviço externo, ele não deve falhar devido a uma
dependência externa.
O que é Nock?
• Nock pode usar para testar módulos que executam solicitações HTTP.
Ao interceptar consultas HTTP externas e nos permitir enviar respostas sob medida para testar
diferentes situações ou salvar resultados precisos como “consertos”, dados enlatados que
retornarão respostas confiáveis, Nock nos ajuda a evitar os problemas mencionados.
O uso de dados preparados tem desvantagens, pois podem ficar obsoletos se não forem
renovados regularmente. Sem testes extras explícitos ou controle de versão de API fixo, uma
alteração na forma dos dados fornecidos por uma API pode passar despercebida. A
responsabilidade do desenvolvedor é garantir que as medidas preventivas sejam implementadas.
Em nosso teste de ponta a ponta, vemos um exemplo da minha atual empresa. Eles usam
acessórios Nock, pois ocasionalmente falham devido a tempos limite quando executados como
parte de nosso processo de entrega contínua.
Quando um desenvolvedor realiza esses testes localmente, os acessórios são imediatamente
removidos e regenerados, garantindo que estejam sempre atualizados.
Atualmente, Nock é usado de duas maneiras:
Ambos podem ser encontrados em testes individuais. Se ambos forem usados no mesmo arquivo
de teste, o modo nock.back deve ser definido e redefinido explicitamente antes e depois do uso.
Nós vamos passar por isso com mais detalhes mais tarde.
Vamos criar um projeto, adicionar Nock e comparar Nock com Nock. Estou de volta com mais
alguns exemplos de código.
Adicionando Nock
Este projeto de exemplo será construído. Ele inclui vários métodos simples que chamam uma API
de geração de usuário aleatório, tornando-o ideal para testes com Nock.
Ele emprega o Jest como executor de testes e gerador de assertivas.
No exemplo a ser testado, três funções estão disponíveis: obter um usuário aleatório, obter um
usuário aleatório de uma determinada nacionalidade e obter um usuário aleatório, mas retornar às
configurações padrão em caso de falha. Aqui está um exemplo:
Estávamos usando Nock na época. Um arquivo auxiliar nock.js foi utilizado naquela época, o que
veremos mais adiante.
Usando 'nock'
Isso é muito bem explicado nos documentos do Nock. Existem várias possibilidades de especificar
a modificação do pedido, seja no pedido correspondido ou na resposta fornecida. A resposta
recebida após uma solicitação bem-sucedida e produzindo uma resposta 500 para testar as
opções de fallback de uma função são duas
instâncias.
Tudo o que seria necessário adicionar ao arquivo de teste existente para começar a usar Nock
é const nock = require('nock'); / importar nock de 'nock';.
No primeiro teste, combinamos o nome do host e o caminho com uma string e especificamos
um código de resposta e uma mensagem. A asserção é subseqüentemente adicionada à cadeia
Promise de nossa chamada de função. Quando a solicitação recebida de get random user()
corresponde ao interceptor Nock que acabamos de configurar, a resposta que definimos é
retornada.
nock('https://randomuser.me')
Machine Translated by Google
.get('/
api/') .reply(200,
{ resultados: [{ nome: 'Dominic' }], });
consulta de
Da mesma forma, imitamos uma chamada com uma nacionalidade especificada, mas desta vez
combinamos o nome do host e o caminho usando um RegExp.
Vale a pena observar que estamos usando afterAll(Nock.restore) e afterEach (Nock.cleanAll) para
garantir que os interceptadores não entrem em conflito uns com os outros.
Por fim, executamos um teste de 500 respostas. Para isso, desenvolvemos um novo método
que retorna um valor padrão caso a requisição da API não forneça uma resposta.
Antes de verificar a saída da função, usamos Nock para interceptar a requisição e simular uma
resposta 500.
É realmente útil poder imitar códigos de resposta diferentes de 200, atrasos de conexão e tempos
limite de soquete.
Usando 'nock.back' A
função nock.back é usada não apenas para interceptar uma solicitação HTTP, mas também para
registrar a resposta real para uso posterior. Essa resposta armazenada é conhecida como
"acessório".
Machine Translated by Google
Embora apenas uma solicitação HTTP seja executada por teste em nosso projeto de
amostra, os fixtures nock.back são capazes de registrar todas as chamadas de saída. Isso é
especialmente útil ao testar um componente complicado que contata vários serviços ou ao
realizar testes de ponta a ponta, quando várias chamadas podem ser feitas. O principal
benefício da utilização de acessórios é que eles são rápidos de acessar uma vez estabelecidos,
eliminando a possibilidade de intervalos. Como eles estão usando dados genuínos, a
imitação da estrutura de dados é desnecessária e qualquer alteração pode ser detectada.
Isso garante que quaisquer testes subsequentes não utilizem erroneamente os dispositivos
que acabaram de ser preparados. Se isso não for feito, então, por exemplo, a resposta 500
em nosso teste anterior não seria fornecida porque a instituição só tem uma resposta 200.
Devemos primeiro criar um arquivo auxiliar nock.js. Isso faz três coisas no
seguinte exemplo:
• Definir o modo para gravar para que, quando os testes forem realizados, registremos e
utilizemos equipamentos, em oposição ao teste normal, que apenas usa instituições
existentes, mas não registra novas
uns.
Isso pode ser acessado em arquivos de teste por meio de const defaultOptions = require('./
helpers/nock');/import defaultOptions from './helpers/nock';.
Machine Translated by Google
nockDone();
nock.back.setMode('wild');});
Primeiro marcamos o teste como assíncrono para que possamos utilizar await. Mudamos
para o modo de gravação. Passamos o nome do arquivo para salvar nossos equipamentos,
bem como as opções padrão fornecidas em nosso auxiliar nock.js para torná-los mais
legíveis por humanos. Na conclusão, recebemos a função nockDone, que será chamada
depois que nossas expectativas forem atendidas.
Mocking Actions
Vamos dar uma olhada em algum código.
Este é o componente que queremos testar. Refere-se às atividades Vuex.
Machine Translated by Google
<modelo> <div
class="text-align-center">
<input type="text" @input="actionInputIfTrue" /> <button
@click="actionClick()">Clique</button> </div> </template>
<script>
import { mapActions } de 'vuex'
{ ...mapActions(['actionClick']), actionInputIfTrue:
function actionInputIfTrue(event) {
}
}
} </script>
Não nos importamos com o que as ações executam ou como a loja aparece para os
propósitos deste teste. Tudo o que precisamos entender é que essas atividades estão sendo
realizadas no momento certo e com o valor certo.
Quando montamos superficialmente nosso componente, devemos fornecer um dummy
store no Vue para testar isso.
localVue.use(Vuex)
describe('Actions.vue', () => {
deixe ações
deixar armazenar
}) })
expect(actions.actionInput).toHaveBeenCalled() })
it('não despacha "actionInput" quando o valor do evento não é "input"', () => { const
wrapper = sandyMount(Actions, { store,
localVue })
const input = wrapper.find('input') input.element.value =
'not input' input.trigger('input')
expect(actions.actionInput).not.toHaveBeenCalled() })
O que está acontecendo aqui? Com o método localVue.use, primeiro instruímos o Vue a
utilizar o Vuex. Isto é simplesmente um wrapper para Vue.use.
Em seguida, criamos uma loja falsa invocando o novo Vuex.Store com nosso mock
dados. Nós apenas passamos ações, já que é tudo o que nos interessa.
As atividades são apenas funções fictícias. Essas funções fictícias fornecem técnicas para
determinar se as ações foram chamadas ou não.
Podemos então afirmar em nossos testes que o stub de ação foi chamado quando
deveria ser invocado.
Agora, a maneira como definimos a loja pode não ser familiar para você.
Estamos usando beforeEach para garantir que a loja esteja limpa antes de cada teste.
beforeEach é um hook mocha que é executado antes de cada teste.
O aspecto mais significativo desse teste é que construímos uma loja falsa do Vuex e a
enviamos para o Vue Test Utils.
Então, agora que podemos zombar de ações, vamos dar uma olhada em zombar de getters.
Getters zombadores
<modelo>
<div>
<p v-if="inputValue">{{inputValue}}</p> <p v-
if="clicks">{{clicks}}</p> </div> </template>
<script>
import { mapGetters } de 'vuex'
padrão de exportação {
calculado: mapGetters(['clicks', 'inputValue'])
} </script>
Este é um componente bastante simples. Ele exibe o resultado dos cliques e inputValue dos
getters. Novamente, nós realmente não nos importamos com o que esses getters retornam; tudo
o que importa é que seu resultado seja apresentado adequadamente.
Machine Translated by Google
localVue.use(Vuex)
sandyMount(Getters, { store,
localVue })
const p = wrapper.findAll('p').at(1)
expect(p.text()).toBe(getters.clicks().toString()) }) })
Machine Translated by Google
<template>
<div>
<button @click="moduleActionClick()">Clique</button> <p>{{moduleClicks}}</p> </
div> </template>
<script>
import { mapActions, mapGetters } de 'vuex'
{ ...mapActions(['moduleActionClick']) },
calculado: mapGetters(['moduleClicks'])
} </script>
localVue.use(Vuex)
describe('MyComponent.view', () => {
deixe ações
deixe estado
deixar armazenar
ações =
{ moduleActionClick: jest.fn()
}
} }) })
})
expect(p.text()).toBe(state.clicks.toString()) }) })
Faremos uma loja básica de balcão para demonstrar como testar uma loja Vuex.
Haverá uma mutação de incremento e um getter evenOrOdd na loja.
// mutations.js export
default { increment(state) {
estado.conta++
}
} // padrão de
exportação getters.js {
evenOrOdd: state => (state.count % 2 === 0? 'even' : 'odd')
// mutações.spec.js
contagem: 0
} mutações.incremento(estado)
expect(estado.contagem).toBe(1) })
// getters.spec.js
contagem: 2
expect(getters.evenOrOdd(state)).toBe('even') }) test('"evenOrOdd"
contagem: 1
} expect(getters.evenOrOdd(state)).toBe('odd') })
// store-config.js
padrão de exportação
{ estado: {
contagem: 0
},
mutações,
getters
} // store-config.spec.js
expect(store.getters.evenOrOdd) .toBe('ímpar') })
Machine Translated by Google
Usamos o cloneDeep para clonar a configuração da loja antes de criar uma loja com ela. Isso ocorre
porque o Vuex modifica o objeto de opções usado para construir a loja. Para garantir que cada teste
tenha um armazenamento limpo, devemos clonar o objeto storeConfig.
O CloneDeep, por outro lado, não é “profundo” o suficiente para clonar módulos de armazenamento.
Caso seu storeConfig contenha módulos, você deve fornecer um objeto para new Vuex.Store(), conforme
imagem abaixo:
VUE.JS-TESTING-LIBRARY Quando se
trata de desenvolver aplicativos confiáveis, os testes podem desempenhar um papel vital na capacidade
de um indivíduo ou equipe de criar novos recursos, modificar código, resolver erros e assim por diante.
Embora existam várias escolas de pensamento sobre testes.
Teste de unidade
Introdução
Unidades individuais de código podem ser testadas independentemente usando testes de unidade. O
teste de unidade destina-se a dar aos desenvolvedores confiança em seu código. Você obtém a garantia
de que seu aplicativo permanecerá funcional e estável quando novos recursos forem introduzidos ou o
código for refatorado, criando testes detalhados e eficazes.
conselho de teste de unidade geralmente é independente da estrutura, aqui estão alguns princípios
gerais a serem considerados ao decidir qual ferramenta de teste de unidade é ideal para seu aplicativo.
sua estrutura de teste de unidade ofereça erros úteis quando os testes falham. A biblioteca de asserções
é responsável por isso. Uma asserção com mensagens de erro de alta qualidade reduz o tempo
necessário para depurar o problema. Além de apenas relatar quais testes estão falhando, as bibliotecas
de asserção fornecem informações sobre por que um teste falha, como o que era esperado em relação
ao que foi obtido.
Machine Translated by Google
Como a maioria dos frameworks de teste de unidade é de código aberto, ter uma
comunidade ativa pode ser crucial para algumas equipes que manterão seus testes
por um longo tempo e precisam garantir que um projeto seja mantido continuamente.
Além disso, ter uma comunidade ativa fornece ajuda adicional caso você tenha
problemas.
Instalação
Este módulo é fornecido via npm e deve ser instalado como um devDepen dency em seu
projeto:
Exemplo:
<modelo>
<div>
<p>Tempos clicados: {{ count }}</p> <button
@click="increment">incremento</button>
</div> </
modelo>
Machine Translated by Google
<script>
padrão de exportação {
nome: 'Botão', dados: ()
=> ({
contagem:
0, }), métodos:
{ increment() {
isso.conta++
}, },
} </script>
importe {render, screen, fireEvent} de '@testing library/vue' import Button de './
Button'
Vue Testing Library é uma biblioteca leve de teste Vue que adiciona métodos utilitários leves
a @vue/test-utils. Ele foi projetado com uma única ideia orientadora em mente: quanto mais
seus testes imitarem como seu programa é usado, mais confiança eles poderão fornecer a
você.
• Você deseja desenvolver testes que não se preocupem com detalhes de implementação,
como verificar como a solução é implementada em vez de se ela fornece o resultado
pretendido.
• Você deseja desenvolver testes que se concentrem nos nós DOM em vez dos
componentes Vue exibidos.
• Você deseja desenvolver testes que consultem o DOM como um usuário faria.
A biblioteca de testes Vue funciona fornecendo utilitários para consultar o DOM da mesma
maneira que um usuário faria. Essas ferramentas permitem que você pesquise objetos com
base em seu texto de rótulo, identifique links e botões com base em seu conteúdo de texto e
garanta que seu aplicativo Vue esteja totalmente acessível.
Em circunstâncias em que não faz sentido ou é impraticável descobrir itens por seu
conteúdo de texto ou rótulo, a Biblioteca de testes Vue recomenda a utilização de atributos
testados por dados como uma saída de emergência para localizar esses componentes.
Exemplo:
que você entende por que você deve usar a Biblioteca de Testes Vue e como ela funciona,
vamos começar instalando-a em um novo projeto Vue gerado pela CLI do Vue.
Machine Translated by Google
Para começar, execute o seguinte comando no terminal (supondo que você tenha o Vue
CLI instalado em seu sistema) para criar um novo aplicativo Vue:
Jest, um executor de testes construído pelo Facebook, será usado para executar nossos
testes. Jest pode ser simplesmente instalado usando o plug-in Vue CLI. Vamos incluir esse plugin:
Este é o lugar onde os testes seriam realizados. Ele também criou uma nova pasta de testes
em src, bem como uma pasta de unidade com um arquivo de teste de exemplo chamado
example. spec.js. Quando executamos npm run test:unit, ele é baseado na configuração do
Jest. Jest irá procurar arquivos no diretório de testes e executá-los. Vamos executar o
seguinte arquivo de teste de amostra:
Isso deve fazer com que o exemplo seja executado. O arquivo de teste spec.js está localizado
no diretório tests/unit. Vamos dar uma olhada no que há neste arquivo:
expect(wrapper.text()).toMatch(msg) }) })
A instalação do Jest com o plug-in Vue CLI instalará automaticamente @vue/test utils,
portanto, o arquivo de teste anterior faz uso do método sandyMount de @vue/test-utils. Para
se familiarizar com a Vue Testing Library, basta alterar este arquivo de teste idêntico para
utilizar a Vue Testing Library em vez de @vue/test-utils.
Machine Translated by Google
getByText(msg) }) })
Se você executar o teste novamente, ele ainda deve passar. Vamos dar uma olhada no que
fizemos:
Você deve ter notado uma mudança na ênfase do teste do componente Vue visível para o que
o usuário vê no DOM neste momento. Essa alteração permitirá que você teste seus aplicativos
do ponto de vista do usuário, em vez de se concentrar em detalhes de implementação.
Machine Translated by Google
Começo rápido
Todos os comandos getBy, getAllBy, queryBy e query AllBy da DOM Testing Library
agora estão disponíveis. A lista completa de consultas pode ser vista aqui.
O problema
Você deseja desenvolver casos de teste fáceis de manter para seus componentes Vue.
Você deseja que seus testes evitem adicionar detalhes de implementação de seus
componentes como parte desse objetivo. Você prefere se concentrar em garantir que seus
testes forneçam a confiança de que você precisa.
A solução
Vue Testing Library é uma solução de teste leve para componentes Vue. Ele adiciona
métodos utilitários leves sobre @vue/test-utils, incentivando hábitos de teste aprimorados.
Sua principal ideia orientadora é que quanto mais seus testes imitam como seu
produto é usado, mais confiança você pode ter neles.
Como resultado, em vez de lidar com instâncias de componentes Vue exibidos, seus
testes lidarão com nós DOM reais.
Os utilitários fornecidos por este pacote permitem consultar o DOM da mesma forma
que um usuário faria. Eles permitem que você descubra objetos pelo texto de seus rótulos,
bem como links e botões, e afirmam que seu aplicativo está acessível.
Ele também oferece uma técnica sugerida testada por dados para identificar itens
como uma “saída de escape” para elementos quando o conteúdo do texto e o rótulo não
fazem sentido ou são impraticáveis.
Um exemplo básico:
<template>
<div>
<p>Tempos clicados: {{ count }}</p> <button
@click="increment">increment</button>
</div> </
modelo>
Machine Translated by Google
<script>
padrão de exportação {
nome: 'Botão', dados:
() => ({ contagem:
0, }), métodos:
{ increment() {
isso.conta++
}, },
} </script>
importe {render, screen, fireEvent} de '@testing library/vue' import Button
de './Button'
CONCLUSÃO
Aprendemos sobre NOCK e Vue.js-testing-library neste capítulo, incluindo o
que são e como são utilizados. Formulários e validação de formulários serão
discutidos no próximo capítulo.
Machine Translated by Google
Capítulo 9
Formulários e Validação
NESTE CAPÍTULO
BÁSICO DO FORMULÁRIO
Para criar um formulário em HTML, você usa o elemento <form>: (“JavaScript Form
Arquivos - Tutorial”)
• O método especifica qual método HTTP deve ser usado para enviar
a forma. Postar ou pegar é o caminho.
Quando você deseja obter dados do servidor, geralmente usa o método get e,
quando deseja alterar algo no servidor, geralmente usa o método post.
Referenciando
Formulários Você pode usar getElementById() ou const form = document.
getElementById('subscribe') para se referir ao elemento de formulário no DOM: const
form = document.getElementById('subscribe'); JavaScript é a
linguagem de codificação (javascript)
Pode haver vários formulários em um documento HTML. A propriedade
documento.formulários
document.forms[0]
CSS (CSS)
Enviando um formulário
Um botão de envio geralmente está presente em um formulário. O navegador entrega os
dados do formulário ao servidor quando você clica nele. Para criar um botão de envio,
use o tipo submit no elemento <input> ou <button>:
Ou
<button type="submit">Inscrever-se</button>
Linguagem de código: HTML, XML (xml)
Quando você pressiona a tecla Enter enquanto o botão enviar está realçado, o navegador também
envia a entrada do formulário.
Quando você envia o formulário, o evento submit é chamado antes que a solicitação seja enviada
ao servidor. Isso permite que você verifique a precisão dos dados do formulário. Você pode parar de
enviar o formulário se os dados forem inválidos.
Use a função addEventListener() do elemento de formulário para adicionar uma lista de eventos
tener para o evento submit da seguinte forma:
Para evitar que o formulário seja enviado, execute a função pre ventDefault() do objeto de evento
de dentro do manipulador de eventos submit, conforme ilustrado abaixo:
});
Linguagem do código: PHP (php)
form.submit();
Linguagem do código: CSS (css)
A função form.submit() não dispara o evento submit. Como resultado, antes de usar essa abordagem,
Acessando campos de
formulário Você pode utilizar técnicas DOM como getElementsByName(), getElement ById(),
querySelector() e outras para recuperar campos de formulário.
Você também pode usar a propriedade elements do objeto de formulário. Uma coleção de
elementos de formulário é armazenada na propriedade form.elements.
Você pode acessar um elemento em JavaScript por índice, id ou nome. Considerar
o seguinte formulário de inscrição, que tem dois elementos input>:
Para obter os elementos do formulário, você deve primeiro obter o elemento do formulário:
Após acessar o campo do formulário, você pode usar a propriedade value para acessar o seu
valor, por exemplo:
<!DOCTYPE html>
<html lang="en"> <head>
<div class="container">
<form action="signup.html" method="post"
id="inscrever-se">
<h1>Inscreva-se</h1>
<div class="field">
<rótulo
for="name">Nome:</label>
<input type="text" id="name"
name="name" placeholder="Enter fullname" />
<small></small>
</div>
<div class="campo">
<label for="e-mail">
E-mail:</label>
Machine Translated by Google
</div>
<script src="js/app.js"></script> </body> </html>
tipo de retorno;
}
} return showSuccess(entrada);
}
retorna falso;
} retorna verdadeiro;
}
Como funciona
A função showMessage()
“A função showMessage() aceita um elemento de entrada, mensagem e um tipo:" (“Obter nome do
formulário via JavaScript”)
tipo de retorno;
}
<div class="campo">
<label for="name">Nome:</label> <input type="text"
id="name" name="name" placeholder="Enter fullname" />
<small></small>
</div>
Se o valor do nome estiver em branco, você precisa primeiro obter seu pai, que é <div>
com a classe “campo”.
input.parentNode
msg.innerText = mensagem;
A classe CSS do campo de entrada é então alterada com base no valor do parâmetro de
tipo. Se o tipo for verdadeiro, definimos a classe da entrada como sucesso. Caso contrário, a
classe é definida como erro.
tipo de retorno;
A função hasValue()
A função hasValue() determina se um elemento de entrada tem um valor e exibe
uma mensagem de erro ou uma mensagem de sucesso usando as funções
showError() ou showSuccess(), conforme apropriado:
} return showSuccess(entrada);
}
A função validEmail()
A função validEmail() valida se o campo email contém um endereço de email
válido:
retorna falso;
} retorna verdadeiro;
}
Para começar, use o método querySelector() para escolher o formulário de inscrição pelo seu id:
Em terceiro lugar, adicione o ouvinte de evento de envio do formulário de inscrição usando o addEvent
Método ouvinte():
Resumo
• Para escolher um elemento form>, use técnicas DOM como getDocument ById() e
querySelector(). O elemento de formulário também é retornado por meio de um índice
numérico em document.forms[index].
Exemplo de JavaScript
function validarForm() { let x =
document.forms["meuFormulário"]["fname"].value; if (x == "")
{ alert("Nome deve
ser preenchido"); retorna falso; } }
Exemplo de formulário
HTML <form name="myForm" action="/action_page.
php" onsubmit="return validForm()" method="post"> Nome: <input
type="text" name="fname"> <input type ="enviar"
valor="Enviar"> </form>
Machine Translated by Google
Enviar
Exemplo de formulário
HTML <form action="/action_page.php" method="post"> <input
type="text" name="fname" obrigatório>
<input type="submit" value="Enviar"> </form>
Data de validade
O objetivo mais comum da validação de dados é garantir que a entrada do usuário esteja
correta. A validação pode ser definida de várias maneiras e implementada de várias maneiras.
Depois que a entrada foi transmitida ao servidor, um servidor da Web executa a validação do
lado do servidor. Um navegador da web executa a validação do lado do cliente antes de enviar
dados para um servidor da web.
Machine Translated by Google
Atributo Descrição
Desabilitado Especifica que o elemento de entrada deve ser desabilitado
máx. Especifica o valor máximo de um elemento de entrada
mín. Especifica o valor mínimo de um elemento de entrada
Padrão Especifica o padrão de valor de um elemento de entrada
Seletor Descrição
:desabilitado Seleciona elementos de entrada com o atributo “desativado” especificado
:inválido Seleciona elementos de entrada com os valores inválidos
Uso básico Na
entrada de formulário, área de texto e elementos selecionados, a diretiva v-model pode
ser usada para construir conexões de dados bidirecionais. Ele seleciona a técnica
apropriada para atualizar o elemento com base no tipo de entrada. O V-model é um açúcar
de sintaxe para atualizar dados em eventos de entrada do usuário, com atenção especial
para circunstâncias específicas de borda.
O valor inicial de qualquer elemento de formulário, verificado ou propriedades
escolhidas serão ignorados pelo v-model. Os dados da instância Vue sempre serão vistos
como a fonte da verdade. O valor inicial deve ser declarado do lado do JavaScript, na
opção data do seu componente.
Machine Translated by Google
• A propriedade Value e o evento de entrada são usados pelos elementos text e textarea;
Você observará que o v-model não é atualizado durante a construção do IME para idiomas que
requerem um IME. Se você também deseja atender a essas alterações, use o evento de
entrada.
Texto:
Bloco de mensagem.
Texto multilinha:
Caixa de seleção:
{checkedNames:
[]
} })
Rádio:
Selecione:
Seleção única:
<selecione v-model="selecionado">
<option disabled value="">Selecione um</option> <option>A</option> <option>B</
option> <option>C</option>
</select> <span>Selecionado:
{{ selecionado }} new Vue({ el:
'...', dados: {
selecionado: ''
} })
<br>
<span>Selecionado: {{ selecionado }}
<selecione v-model="selecionado">
<option v-for="opção em opções"
v-bind:value="option.value">
Machine Translated by Google
} })
Ligações de valor
Os valores de ligação v-model para opções de rádio, caixa de seleção e seleção são
normalmente strings estáticas (ou booleanos para caixas de seleção):
<selecione v-model="selecionado">
<option value="abc">ABC</option> </select>
propriedade dinâmica da instância. Para conseguir isso, podemos usar v-bind. Também
podemos usar v-bind para vincular o valor de entrada a valores não string.
Caixa de seleção:
<input
type="checkbox" v-
model="toggle" true-
value="yes"
valor-falso="não"
Machine Translated by Google
>
// quando marcada:
vm.toggle === 'yes' // quando
desmarcada: vm.toggle ===
'no'
Rádio:
Selecione as opções:
<selecione v-model="selecionado">
<!-- literal de objeto embutido --> <option v-
bind:value="{ number: 123 }">123</option> </select> // quando selecionado: typeof
vm.selected //
=> 'objeto '
vm.selected.number // => 123
Modificadores .lazy Por padrão, o v-model sincroniza a entrada com os dados após cada evento de entrada
(exceto para composição IME, conforme indicado acima). Em vez de sincronizar após eventos de alteração,
.number Se
você deseja que a entrada do usuário seja automaticamente transformada em número, você pode adicionar
Isso é útil porque o valor dos elementos de entrada HTML é sempre uma string, mesmo quando type=“number”.
.aparar
Você pode usar o modificador trim em suas entradas gerenciadas pelo v-model para cortar
automaticamente os espaços em branco da entrada do usuário:
<input v-model.trim="msg">
entrada embutidos em HTML nem sempre serão suficientes. Os componentes Vue, por outro lado, permitem que você
crie entradas reutilizáveis com comportamento completamente configurável. Essas entradas são até compatíveis com
o modelo v!
O básico
Em elementos de entrada de formulário, a diretiva v-model pode ser usada para criar
ligações de dados bidirecionais. Ele seleciona a técnica apropriada para atualizar o
elemento com base no tipo de entrada.
Exemplo:
1 <form id="demo">
2 <!-- texto -->
3 <p>
4 <input type="text" v-model="msg"> {{msg}} </p> <!--
5 checkbox
6 -->
7
8 <p>
9 <input type="checkbox" v-model="checked"> {{checked? "yes" : "no"}}
10 </p> <!-- botões de opção -->
11
12
13 <p>
14 <input type="radio" name="picked" value="one" v-
model="picked"> <input type="radio"
15 name="picked" value="two" v-model="picked">
{{escolhido}} </p>
16
17
18 <!-- selecionar -->
19 <p>
Machine Translated by Google
2
3
4 : 'oi!', msg
5 verificada: verdadeira,
6 escolhida: 'um', selecionada:
7 'dois', multiSelect: ['um',
8 'três']
9
} 10 })
cada evento de entrada, o v-model sincroniza a entrada com os dados por padrão. Você pode alterar o
1 <!-- sincronizado após "change" em vez de "input" --> 2 <input v-model="msg" lazy>
Se você deseja que a entrada do usuário seja armazenada automaticamente como números, você pode
Vincular a Expressões
^0.12.12 apenas
Ao utilizar o modelo v na caixa de seleção e nas entradas de rádio, o limite
value é um booleano ou uma string:
Isso pode ser um pouco restritivo; há momentos em que gostaríamos de vincular o valor
subjacente a outra coisa. Aqui está como proceder:
Caixa de seleção:
Rádio:
Como você precisa renderizar dinamicamente uma lista de opções para um elemento choose>,
você deve usar um atributo de opções em conjunto com v-model para que v-model seja
sincronizado corretamente quando as opções mudarem:
Ele também pode conter itens no formato {text:'', value:''}. O texto da opção pode ser
mostrado de forma diferente do valor subjacente neste formato de objeto:
1 opções = [
2 { texto: 'A', valor: 'a' }, { texto: 'B', valor: 'b' }
3
4]
Irá renderizar:
1 <selecionar>
2 <option value="a">A</option> <option
3 value="b">B</option> 4 </select>
1 opções = [ { texto:
2 'A', valor: { msg: 'olá' }}, { texto: 'B', valor: { msg: 'tchau' }}
3
4]
Grupos de opções
Alternativamente, o objeto pode ser formatado como {label:", opções:[…]}. Ele será
apresentado como um <optgroup> neste caso:
1[
2 { label: 'A', opções: ['a', 'b']}, { label: 'B', opções: ['c', 'd']}
3
4]
Irá renderizar:
1 <selecione>
2 <optgroup label="A">
3 <option value="a">a</option> <option
4 value="b">b</option> </optgroup> <optgroup
5 label="B">
6
7 <option value="c">c</option>
Machine Translated by Google
Filtro de opções
É possível que seus dados de origem não estejam neste formato, então você terá
que alterá-lo para criar opções dinâmicas. O parâmetro de opções oferece suporte
a filtros para DRY up da transformação e pode ser útil para encapsular sua lógica
de transformação dentro de um filtro personalizado reutilizável:
2 v-model="usuário selecionado"
3 opções="usuários | extrair 'nome'">
4 </selecionar>
“O filtro acima transforma dados como [{ name: 'Bruce' }, { name: 'Chuck' }] em ['Bruce',
'Chuck'] para que sejam formatados corretamente.” (“Manipulação de formulários - vue.js”)
Após a opção estática, serão adicionadas as opções dinâmicas criadas pelos usuários.
Se o valor v-model for falso, a opção estática será escolhida por padrão (excluindo 0).
Debounce de entrada
O parâmetro debounce permite que você especifique um atraso mínimo antes que os dados
de entrada sejam sincronizados com o modelo após cada pressionamento de tecla. Quando
Machine Translated by Google
executar atividades caras em cada atualização, como fazer uma solicitação Ajax para
preenchimento automático de digitação antecipada, isso pode ser útil.
<!DOCTYPE html>
<html>
<cabeça>
<body>
<div class="columns" id="app">
<div class="column is-two-thirds">
<section class="section"> <h1
class="title">Diversão com formulários no Vue 2.0</h1> <p class="subtitle">
</section>
</section> </
div> </
div>
<script>
new Vue({ el:
'#app' }) </
script>
</body> </
html>
Para começar, crie uma entrada de texto simples para obter o nome completo de um usuário:
...
<seção classe="formulário">
<div class="field"> <label
class="label">Nome</label>
<div class="control">
<input v-model="form.name" class="input"
type="text" placeholder="Entrada de texto"> </div> </div>
</section>
...
<script>
new Vue({ el:
'#app', dados: {
forma : {
nome: ''
} }) </script>
Machine Translated by Google
No código acima, estabelecemos a opção de dados em nossa instância Vue, bem como um
objeto de formulário que conterá todas as informações necessárias para nosso formulário.
Name é a primeira propriedade que definimos e está vinculada à entrada de texto que
também geramos.
Podemos utilizar o valor de form.name em qualquer lugar em nosso programa agora que
a ligação bidirecional está disponível, pois será o valor atualizado da entrada de texto. Para
ver todas as propriedades do nosso objeto de formulário, podemos adicionar uma seção:
...
<div class="columns" id="app"> <!-- // ...
-->
<div class="coluna">
<section class="section" id="resultados">
<div class="caixa">
<ul>
<!-- Mostra os valores de todo o 'formulário'
atributos em um loop --> <li v-
for="(item, k) in form">
<strong>{{ k }}:</strong> {{ item }} </li> </ul> </div> </
section>
</div>
</div>
...
...
<div class="campo">
<label class="label">Mensagem</label> <div
class="control">
<textarea class="textarea" placeholder="Message" v-model="form.message"></
textarea> </div> </div>
...
Machine Translated by Google
dados:
{ formulário:{
nome: '',
mensagem: '' // valor da área de texto
}
}
...
<div class="campo">
...
dados: {
forma : {
nome: '',
Machine Translated by Google
mensagem: '',
query_type: '' // valor da caixa de seleção única }, opções:
{ query:
[ { value:
'feature', text: "Feature Request"}, { value: 'bug', text: "Bug Report
"}, { valor: 'suporte', texto: "suporte"}
]
}
}
Exemplo:
...
<div class="campo">
CONCLUSÃO
Aprendemos sobre formulários Vue.js e validação de formulários neste capítulo, incluindo o
que são e como utilizá-los.
Machine Translated by Google
Machine Translated by Google
Bibliografia
237
Machine Translated by Google
238 ÿ Bibliografia
Chaudhari, M. (2021, 16 de agosto). Otimizando Vue Apps: Lazy Loading e Code Splitting |
por Mayank Chaudhari | Médio. Médio; mayank-1513.medium. com. https://
mayank-1513.medium.com/optimizing-vue-apps-lazy-loading and-code-
splitting-1036d27512fd Correspondência
de rota dinâmica | Vue Router. (nd). Correspondência de rota dinâmica | Roteador Vue;
v3.router.vuejs.org. Recuperado em 11 de julho de 2022, de https://v3.router. vuejs.org/
guide/essentials/dynamic-matching.html
Eluwande, Y. (2021, 1º de janeiro). Um guia completo para formulários em Vue.js - LogRocket
Blog. Blog da LogRocket; blog.logrocket.com. https://blog.logrocket.com/an imperativo-
guide-to-forms-in-vue-js-2/
Explicando o argumento do contexto Vue - um tutorial de API de composição. (nd).
Explicando o Argumento do Contexto Vue - Um Tutorial API de Composição; learnvue.co.
Recuperado em 11 de julho de 2022, em https://learnvue.co/2021/06/explicando-the-vue-
context-argument-a-composition-api-tutorial/ Vinculações de entrada de
formulário — Vue.js. (nd). Vinculações de entrada de formulário — Vue.Js; v2.vuejs. org.
Recuperado em 11 de julho de 2022, em https://v2.vuejs.org/v2/guide/forms.html
Vinculações de entrada de formulário | Vue.js. (nd). Vinculações de entrada de formulário | Vue.Js; vuejs.org.
Recuperado em 11 de julho de 2022, de https://vuejs.org/guide/essentials/forms.html
frankies. (nd). Carregamento lento · vue-r-pdf. Carregamento lento · Vue-r-Pdf; franquias1.
gitbooks.io. Recuperado em 11 de julho de 2022, em https://frankies1.gitbooks.io/vue r-
pdf/content/en/advanced/lazy-loading.html Fraser, D.
(2018, 17 de julho). Zombando de solicitações HTTP com Nock. Este é um artigo de “como
fazer” sobre como usar… | por Dominic Fraser | codeburst. Médio; codeburst.io. https://
codeburst.io/testing-mocking-http-requests-with-nock-480e3f164851 Galyamov,
R. (2019, 21 de julho). Como navegar programaticamente usando o roteador em Vue.js
– Renat Galyamov. Renat Galyamov; renatello. com. https://renatello.com/vue-js-
navigate-programmatically/ _
GARG, S. (2019, 31 de dezembro). API de contexto para aplicativos Vue.js/Nuxt.js | por SHIV
GARG | Tecnologia na upGrad. Médio; Engenharia. upgrade. com. https://
engineering.upgrad.com/context-api-for-vue-js-nuxt js-applications-e4c984508bd1
Obtenha o nome do formulário via
JavaScript. (nd). Obtenha o nome do formulário via JavaScript; www.devasking.com .
Recuperado em 11 de julho de 2022, em https://www.devasking.com/issue/get-form-
name-via-javascript Group, K.
(2021, 15 de março). 7 razões pelas quais o VueJS é tão popular | Grupo Kofi.
Grupo Kofi; www.kofi-group.com. https://www.kofi-group.com/7-reasons why-vuejs-is-
so-popular/
Gunjal, A. (2021, 3 de julho). API de contexto. A API de Contexto pode ser usada para
compartilhar… | por Amol Gunjal | Médio. Médio; amolbkgunjal.medium. com. https://
amolbkgunjal.medium.com/context-api-ba403eed4c91
Manipulando formulários - vue.js. (nd). Manipulação de Formulários - Vue.Js; 012.vuejs.org.
Recuperado em 11 de julho de 2022, em https://012.vuejs.org/guide/
forms.html Harrell, J. (2018, 6 de novembro). Compartilhamento de estado implícito: API de
contexto do React e fornecer/injetar no Vue - LogRocket Blog. Blog da LogRocket;
blog.logrocket. com. https://blog.logrocket.com/implicit-state-sharing-reacts-context-api
provide-inject-in-vue-679062a50f05/
Machine Translated by Google
Bibliografia ÿ 239
Como adicionar uma imagem de fundo em Vue.js | Reagir. (nd). Reagir; reactgo. com.
Recuperado em 11 de julho de 2022, em https://reactgo.com/vue-background-image/
Como importar e usar a imagem em um componente de arquivo único Vue? (nd). NewbeDEV;
newbedev. com. Recuperado em 11 de julho de 2022, em https://newbedev.com/ how-
to-import-and-use-image-in-a-vue-single-file-component Como usar o
roteamento no Vue.js para criar um melhor experiência de usuário. (2018, 28 de junho).
freeCodeCamp.Org; www.freecodecamp.org. https://www.freecodecamp. org/news/
how-to-use-routing-in-vue-js-to-create-a-better-user-experi ence-98d225bbcdd9/
https://nx-designs.ch/agile_downloads/public/Routing%20in%20vue.js.pdf https://
www.spaceo.ca/blog/vue-js-pros-and-cons/ Implementando
Lazy Loading no Vue Aplicativos (2020, 19 de junho). Implementando Lazy Loading em Vue
Apps; academind. com. https://academind.com/tutorials/ vue-lazy-loading
240 ÿ Bibliografia
Estilizando componentes Vue com CSS - Aprenda desenvolvimento web | MDN. (2022, 23
de maio). Estilizando Componentes Vue com CSS - Aprenda Desenvolvimento Web |
MDN; developer.mozilla.org. https://developer.mozilla.org/en-US/docs/Learn/
Tools_and_testing/Client-side_JavaScript_frameworks/Vue_styling Testing —
Vue.js. (nd). Teste — Vue.Js; v2.vuejs.org. Recuperado em 11 de julho de 2022, em https://
v2.vuejs.org/v2/guide/testing.html
Machine Translated by Google
Bibliografia ÿ 241
242 ÿ Bibliografia
Índice
B
ecossistema de ferramentas sólidas,
Benefícios do Vue.js, 8 15 tamanho
sendo uma minúsculo, 14 ferramentas e
ferramenta, 10 o melhor dos bibliotecas, 11–
dois mundos, 9 comunidade e 12 duas faces, 11 renderização e
suporte, 9 suporte da desempenho de DOM virtual, 14
comunidade, 16 arquitetura baseada em
componentes (CBA), 13
C
componentes e reutilização, 12–13
documentação concisa, 16 dividir e CamelCase vs. kebab-case, 42 Valor
conquistar, 11 documentação, de conversão como número, 227 CBA,
12 consulte CDN de arquitetura baseada em
DOM inant, 10–11 fácil componentes , download direto de, 120–123
de aprender, 8–9, 16 Grande Firewall chinês, 16
flexibilidade, 13 CloneDeep, 197–198
capacidades de integração e flexibilidade, 15 Legibilidade de código, 13
Comunidade, senso de, 10
leve, 10 requisitos Comunidade e suporte do Vue.js, 9 Suporte da
de armazenamento baixo, 12 comunidade, 16
243
Machine Translated by Google
244 ÿ Índice
Índice ÿ 245
referência, 208
D
formulário de inscrição, 211–
Debugging React apps, 176 Detail.vue 213 manipulador de evento de envio, 217–
H
17
complexidade de reatividade, 17
risco de excesso de flexibilidade,
EU
17 comunidade pequena, 18
sem opções, 18–19 Documentação, Imagens, importando, 97–103
12 Modelo de objeto de Estilo embutido, usando, 85
documento (DOM), 2 DOM, consulte Documento sintaxe de array, 87
Modelo de objeto DOM-inant, 10–11 Opções de sintaxe de objeto, 85–86
seleção dinâmica, 228 Debounce de entrada, 230
grupos de opções, 229–230 opções de valores de entrada de ligação com v-model,
filtro, 230 opções padrão 232–235
JavaScript, 5, 13
Classe exata-ativa, 125 Validação de formulário JavaScript, 218
Desenvolvedores experientes, falta de, 18 validação automática de
Arquivos CSS externos formulário HTML, 219
246 ÿ Índice
Índice ÿ 247
P
R
Plugins, falta de, 18
Poverty pack, de Vue.js, 18 aplicativos React, 2–3, 9
de reação de produção, visibilidade completa em, 176–177 React Context API, funcionando, 160 Reactive
Navegação two-way data binding, 14 Reactivity, 12 Reactivity
programática, 133 carregamento lento, 143 complex, of Vue.js,
adição, 148–150 17 React's Context API, using, 172–174 React's
importações dinâmicas, Context API and provide/ injetar no Vue, 167 plugin/
150–152 exemplo, 143–144 agrupar components/nested-component. vue, 170–172 plugin/core/
componentes no mesmo index.vue,
248 ÿ Índice
Índice ÿ 249