Introdução ao Vue.js e Aplicações Single Page (SPA)
O que é Vue.js?
Vue.js é um framework progressivo para a construção de interfaces de usuário. Diferente de outros frameworks monolíticos, Vue é projetado desde o início para ser adotável de forma incremental. Sua biblioteca central se concentra na camada de visualização e é fácil de integrar com outras bibliotecas ou projetos existentes. Por outro lado, Vue também é perfeitamente capaz de alimentar aplicações single-page sofisticadas quando usado em conjunto com ferramentas modernas e bibliotecas de apoio.
Características Principais do Vue.js
- Reatividade: O Vue.js fornece uma maneira eficiente de criar componentes reativos, onde a interface do usuário é atualizada automaticamente quando os dados mudam.
- Componentização: A abordagem de componentes do Vue permite criar componentes reutilizáveis e compostos.
- Diretivas: Vue possui uma série de diretivas (como
v-bind
,v-model
,v-for
,v-if
) que tornam a manipulação do DOM declarativa e intuitiva. - Ecosistema: Com uma série de ferramentas auxiliares como Vue Router para roteamento e Vuex para gerenciamento de estado, Vue é uma solução completa para a construção de aplicações modernas.
O que é uma Aplicação Single Page (SPA)?
Uma aplicação single page (SPA) é um tipo de aplicação web que interage com o usuário reescrevendo dinamicamente a página atual em vez de carregar páginas inteiras do servidor. Isso resulta em uma experiência mais rápida e fluida, similar a uma aplicação desktop. Nas SPAs, a maior parte da lógica de roteamento é gerenciada no cliente, e as atualizações de conteúdo são feitas através de chamadas assíncronas ao servidor (geralmente usando AJAX).
Vantagens das SPAs
- Experiência do Usuário: Transições mais suaves e rápidas entre páginas, proporcionando uma experiência mais parecida com a de um aplicativo nativo.
- Desempenho: Uma vez que os recursos iniciais são carregados, apenas os dados necessários são buscados do servidor, reduzindo o tempo de carregamento subsequente.
- Desenvolvimento: A separação clara entre front-end e back-end pode facilitar o desenvolvimento e a manutenção.
Exemplo de uma Aplicação Vue.js Simples
Para entender melhor como o Vue.js pode ser usado para construir uma SPA, vamos criar uma aplicação Vue.js simples que apresenta uma lista de tarefas.
- Configuração do Ambiente
Primeiro, precisamos configurar o ambiente de desenvolvimento. Certifique-se de ter o Node.js e o npm instalados. Então, use o Vue CLI para criar um novo projeto:
npm install -g @vue/cli
vue create my-todo-app
cd my-todo-app
npm run serve
- Estrutura do Projeto
A estrutura inicial do projeto gerado pelo Vue CLI é similar a esta:
my-todo-app/
├── public/
│ ├── index.html
│ └── ...
├── src/
│ ├── assets/
│ ├── components/
│ ├── views/
│ ├── App.vue
│ ├── main.js
│ └── router/
└── ...
- Criando o Componente de Lista de Tarefas
Vamos criar um componente para exibir e adicionar tarefas.
Crie um novo arquivo TodoList.vue
em src/components/
:
<template>
<div class="todo-list">
<h1>Lista de Tarefas</h1>
<input v-model="newTask" @keyup.enter="addTask" placeholder="Adicionar nova tarefa">
<ul>
<li v-for="task in tasks" :key="task.id">
{{ task.text }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
newTask: '',
tasks: []
};
},
methods: {
addTask() {
if (this.newTask.trim() !== '') {
this.tasks.push({ id: Date.now(), text: this.newTask });
this.newTask = '';
}
}
}
};
</script>
<style scoped>
.todo-list {
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
}
</style>
- Utilizando o Componente no App.vue
Agora, vamos usar o nosso componente TodoList
no componente principal App.vue
.
Edite o App.vue
em src/
:
<template>
<div id="app">
<TodoList />
</div>
</template>
<script>
import TodoList from './components/TodoList.vue';
export default {
name: 'App',
components: {
TodoList
}
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
Neste tópico, introduzimos o Vue.js e discutimos as vantagens das aplicações Single Page (SPA). Também vimos um exemplo prático de como criar uma SPA simples usando Vue.js, incluindo a configuração do ambiente de desenvolvimento e a criação de um componente básico de lista de tarefas. No próximo tópico, vamos explorar a configuração detalhada do ambiente de desenvolvimento e as ferramentas necessárias para começar a trabalhar com Vue.js.
Configuração do Ambiente de Desenvolvimento
Introdução
Para desenvolver uma aplicação Single Page (SPA) com Vue.js, é essencial configurar corretamente o ambiente de desenvolvimento. Este guia detalha os passos necessários para preparar o seu ambiente, desde a instalação das ferramentas necessárias até a criação e execução de um novo projeto Vue.js.
Ferramentas Necessárias
- Node.js e npm: Node.js é uma plataforma JavaScript que permite executar código JavaScript no servidor. npm é o gerenciador de pacotes do Node.js, usado para instalar bibliotecas e ferramentas JavaScript.
- Vue CLI: A Interface de Linha de Comando do Vue.js facilita a criação e gerenciamento de projetos Vue.js.
Passo 1: Instalando Node.js e npm
Primeiro, você precisa instalar o Node.js e o npm. Você pode baixar o instalador diretamente do site oficial do Node.js. Recomenda-se baixar a versão LTS (Long Term Support).
Para verificar se a instalação foi bem-sucedida, abra o terminal (ou prompt de comando) e execute os seguintes comandos:
node -v
npm -v
Você deve ver os números das versões instaladas do Node.js e npm.
Passo 2: Instalando Vue CLI
Com o Node.js e npm instalados, o próximo passo é instalar a Vue CLI globalmente. Vue CLI é uma ferramenta poderosa para inicializar e gerenciar projetos Vue.js.
Execute o seguinte comando no terminal:
npm install -g @vue/cli
Para verificar se a instalação foi bem-sucedida, execute:
vue --version
Passo 3: Criando um Novo Projeto Vue.js
Agora que você tem a Vue CLI instalada, pode criar um novo projeto Vue.js. Navegue até o diretório onde deseja criar seu projeto e execute o comando:
vue create my-vue-app
Você será solicitado a escolher uma pré-configuração para o seu projeto. Para iniciantes, a configuração padrão (Default ([Vue 3] babel, eslint)) é uma boa escolha. Navegue pelas opções usando as setas do teclado e confirme com Enter.
Passo 4: Estrutura do Projeto
Após a criação do projeto, você terá uma estrutura de diretórios similar a esta:
my-vue-app/
├── node_modules/
├── public/
│ ├── favicon.ico
│ └── index.html
├── src/
│ ├── assets/
│ ├── components/
│ ├── views/
│ ├── App.vue
│ ├── main.js
│ └── router/
├── .gitignore
├── babel.config.js
├── package.json
└── README.md
- public/: Contém arquivos públicos que não são processados pelo Webpack. O arquivo
index.html
aqui é o ponto de entrada da sua aplicação. - src/: Contém o código-fonte da aplicação. Aqui você desenvolverá a maior parte da sua aplicação.
- components/: Contém os componentes Vue reutilizáveis.
- views/: Contém os componentes de visualização, geralmente usados com o roteamento.
- App.vue: O componente raiz da aplicação.
- main.js: O ponto de entrada JavaScript, onde a aplicação Vue é inicializada.
Passo 5: Executando o Projeto
Para executar o projeto localmente e ver sua aplicação em ação, navegue até o diretório do projeto e execute:
npm run serve
Você verá uma saída similar a esta:
DONE Compiled successfully in 2040ms
App running at:
- Local: http://localhost:8080/
- Network: http://192.168.0.2:8080/
Abra seu navegador e acesse http://localhost:8080/
para ver a aplicação em execução.
Passo 6: Instalando Extensões Úteis
Para facilitar o desenvolvimento com Vue.js, considere instalar as seguintes extensões:
- Vue Devtools: Uma extensão para navegadores (Chrome/Firefox) que facilita a inspeção e depuração de aplicações Vue.js. Você pode instalar a extensão a partir da Chrome Web Store ou Firefox Add-ons.
- Visual Studio Code Extensions:
- Vetur: Proporciona suporte para Vue.js no VSCode, incluindo destaque de sintaxe, snippets e formatação.
- ESLint: Para manter a consistência do código, use a extensão ESLint no VSCode.
Exemplo Prático: Adicionando um Componente
Agora, vamos adicionar um componente simples ao nosso projeto Vue.js para ver como é fácil trabalhar com Vue.
- Criando um Componente
Crie um novo arquivo chamado HelloWorld.vue
dentro do diretório src/components/
com o seguinte conteúdo:
<template>
<div class="hello">
<h1>{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
};
</script>
<style scoped>
.hello {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
- Usando o Componente no App.vue
Edite o arquivo App.vue
para incluir o novo componente:
<template>
<div id="app">
<HelloWorld msg="Bem-vindo ao seu aplicativo Vue.js!" />
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
export default {
name: 'App',
components: {
HelloWorld
}
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
- Verificando o Resultado
Salve as mudanças e certifique-se de que o servidor de desenvolvimento esteja em execução (npm run serve
). Abra o navegador e recarregue http://localhost:8080/
. Você deverá ver a mensagem “Bem-vindo ao seu aplicativo Vue.js!” renderizada pelo componente HelloWorld
.
Neste tópico, configuramos o ambiente de desenvolvimento para Vue.js, instalando Node.js, npm, e Vue CLI. Criamos e executamos um projeto Vue.js, exploramos a estrutura de diretórios, e adicionamos um componente simples à aplicação. No próximo tópico, vamos explorar a estrutura do projeto Vue.js em mais detalhes, discutindo a finalidade de cada diretório e arquivo.
Estrutura do Projeto Vue.js
Estrutura do Projeto Vue.js
Introdução
A estrutura do projeto Vue.js é organizada de maneira a facilitar o desenvolvimento, a manutenção e a escalabilidade da aplicação. Com a Vue CLI, um novo projeto é gerado com uma estrutura de diretórios padrão que segue as melhores práticas da comunidade. Neste tópico, vamos explorar essa estrutura, entendendo a função de cada diretório e arquivo, e veremos exemplos de como trabalhar com eles.
Estrutura de Diretórios e Arquivos
Ao criar um novo projeto Vue.js com a Vue CLI, você obterá uma estrutura similar a esta:
my-vue-app/
├── node_modules/
├── public/
│ ├── favicon.ico
│ └── index.html
├── src/
│ ├── assets/
│ ├── components/
│ ├── views/
│ ├── App.vue
│ ├── main.js
│ └── router/
├── .gitignore
├── babel.config.js
├── package.json
└── README.md
Vamos explorar cada parte dessa estrutura:
1. Diretório node_modules/
Este diretório contém todas as dependências do projeto instaladas via npm. Você não deve modificar nada dentro deste diretório manualmente. As dependências são listadas no arquivo package.json
.
2. Diretório public/
O diretório public/
é usado para armazenar arquivos estáticos que não serão processados pelo Webpack.
favicon.ico
: O ícone do favicon para sua aplicação.index.html
: O ponto de entrada principal da aplicação. Este arquivo é um template HTML que Vue CLI usa para injetar automaticamente a aplicação durante o build.
Exemplo de index.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Vue App</title>
</head>
<body>
<noscript>
<strong>We're sorry but my-vue-app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>
3. Diretório src/
O diretório src/
contém o código-fonte da aplicação. Aqui você passará a maior parte do tempo desenvolvendo sua aplicação.
assets/
: Contém recursos estáticos, como imagens, fontes e estilos.components/
: Contém componentes Vue reutilizáveis.views/
: Contém componentes de visualização, geralmente associados a rotas.App.vue
: O componente raiz da aplicação.main.js
: O ponto de entrada JavaScript, onde a aplicação Vue é inicializada.router/
: Contém a configuração das rotas da aplicação (se você escolheu usar o Vue Router).
Exemplo de App.vue
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App'
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
Exemplo de main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
const app = createApp(App);
app.use(router);
app.mount('#app');
4. Arquivo .gitignore
Este arquivo especifica quais arquivos e diretórios devem ser ignorados pelo Git. Por padrão, ele inclui node_modules/
e arquivos de build.
Exemplo de .gitignore
:
/node_modules
/dist
.env
5. Arquivo babel.config.js
Este arquivo é a configuração do Babel, um transpiler de JavaScript que converte ES6+ para uma versão compatível com navegadores mais antigos.
Exemplo de babel.config.js
:
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
};
6. Arquivo package.json
O package.json
é um arquivo chave que contém informações sobre o projeto, como o nome, versão, dependências e scripts.
Exemplo de package.json
:
{
"name": "my-vue-app",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.6.5",
"vue": "^3.0.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^7.0.0"
}
}
7. Arquivo README.md
Um arquivo Markdown que contém informações sobre o projeto. Este arquivo é útil para documentar como configurar, usar e contribuir para o projeto.
Exemplo de README.md
:
# my-vue-app
## Project setup
npm install
Compiles and hot-reloads for development
```bash
npm run serve
Compiles and minifies for production
```bash
npm run build
Lints and fixes files
```bash
npm run lint
Customize configuration
#### Trabalhando com Componentes e Rotas
Vamos criar um exemplo prático de como adicionar componentes e configurar rotas em um projeto Vue.js.
1. **Criando Componentes**
Crie dois novos componentes: `Home.vue` e `About.vue` no diretório `src/views/`.
**Home.vue**:
vue
**About.vue**:
vue
2. **Configurando o Roteamento**
Edite o arquivo `src/router/index.js` para configurar as rotas da aplicação:
javascript
import { createRouter, createWebHistory } from ‘vue-router’;
import Home from ‘../views/Home.vue’;
import About from ‘../views/About.vue’;
const routes = [
{
path: ‘/’,
name: ‘Home’,
component: Home
},
{
path: ‘/about’,
name: ‘About’,
component: About
}
];
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
});
export default router;
3. **Atualizando o App.vue**
Atualize o `App.vue` para incluir links de navegação:
vue
4. **Executando o Projeto**
Salve todas as alterações e execute o servidor de desenvolvimento:
bash
npm run serve
“`
Abra o navegador em http://localhost:8080/
. Você verá links para “Home” e “About”. Clique nos links para navegar entre as páginas e verificar se o roteamento está funcionando corretamente.
Neste tópico, exploramos a estrutura de um projeto Vue.js criado com a Vue CLI, detalhando a função de cada diretório e arquivo. Também vimos um exemplo prático de como criar componentes e configurar rotas. Compreender a estrutura do projeto é fundamental para organizar seu código de forma eficiente e manter uma aplicação escalável. No próximo tópico, vamos construir componentes Vue.js, explorando sua criação e comunicação.
Construindo Componentes Vue.js
Introdução
Os componentes são a base da construção de aplicações Vue.js. Eles permitem a criação de interfaces de usuário modulares e reutilizáveis, facilitando a manutenção e a escalabilidade do código. Neste tópico, vamos explorar como criar, estruturar e comunicar componentes Vue.js, com exemplos práticos para ilustrar cada conceito.
Estrutura Básica de um Componente Vue.js
Um componente Vue.js é geralmente definido em um arquivo .vue
e possui três seções principais:
<template>
: Define o layout HTML do componente.<script>
: Contém a lógica do componente, como dados, métodos e ciclo de vida.<style>
: Define os estilos CSS específicos para o componente.
Exemplo básico de um componente:
<template>
<div>
<h1>{{ title }}</h1>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
name: 'MyComponent',
data() {
return {
title: 'Olá, Vue!',
message: 'Este é um componente Vue.js.'
};
}
};
</script>
<style scoped>
h1 {
color: #42b983;
}
</style>
Criando e Registrando Componentes
1. Criando Componentes
Vamos criar dois componentes: HelloWorld.vue
e Counter.vue
.
HelloWorld.vue:
<template>
<div>
<h1>{{ greeting }}</h1>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
greeting: {
type: String,
required: true
}
}
};
</script>
<style scoped>
h1 {
color: #42b983;
}
</style>
Counter.vue:
<template>
<div>
<button @click="count++">Clique aqui: {{ count }}</button>
</div>
</template>
<script>
export default {
name: 'Counter',
data() {
return {
count: 0
};
}
};
</script>
<style scoped>
button {
background-color: #42b983;
color: white;
border: none;
padding: 10px;
cursor: pointer;
}
button:hover {
background-color: #2c3e50;
}
</style>
2. Registrando Componentes
Para usar os componentes criados, precisamos registrá-los no componente pai.
App.vue:
<template>
<div id="app">
<HelloWorld greeting="Bem-vindo ao Vue.js!"/>
<Counter />
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
import Counter from './components/Counter.vue';
export default {
name: 'App',
components: {
HelloWorld,
Counter
}
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
Comunicação entre Componentes
1. Passando Dados com Props
Props são a maneira de passar dados de um componente pai para um componente filho.
Exemplo:
<!-- Componente Pai -->
<template>
<div>
<HelloWorld greeting="Olá, Mundo!"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
export default {
name: 'ParentComponent',
components: {
HelloWorld
}
};
</script>
HelloWorld.vue já está configurado para receber a prop greeting
e exibi-la.
2. Emitindo Eventos para o Componente Pai
Componentes filhos podem emitir eventos para os componentes pais usando $emit
.
Exemplo:
ChildComponent.vue:
<template>
<button @click="notifyParent">Clique para notificar o pai</button>
</template>
<script>
export default {
name: 'ChildComponent',
methods: {
notifyParent() {
this.$emit('notify', 'Mensagem do filho');
}
}
};
</script>
ParentComponent.vue:
<template>
<div>
<ChildComponent @notify="handleNotification"/>
</div>
</template>
<script>
import ChildComponent from './components/ChildComponent.vue';
export default {
name: 'ParentComponent',
components: {
ChildComponent
},
methods: {
handleNotification(message) {
console.log('Recebido do filho:', message);
}
}
};
</script>
Ciclo de Vida dos Componentes
Os componentes Vue.js possuem um ciclo de vida que define uma série de eventos durante a criação, atualização e destruição de um componente.
Principais hooks de ciclo de vida:
created
: Chamado após a criação do componente.mounted
: Chamado após o componente ser inserido no DOM.updated
: Chamado após o componente ser atualizado devido a mudanças nos dados reativos.destroyed
: Chamado após o componente ser destruído.
Exemplo:
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
name: 'LifecycleExample',
data() {
return {
message: 'Veja os logs do console para os hooks de ciclo de vida.'
};
},
created() {
console.log('Componente criado.');
},
mounted() {
console.log('Componente montado.');
},
updated() {
console.log('Componente atualizado.');
},
destroyed() {
console.log('Componente destruído.');
}
};
</script>
Slots: Conteúdo Dinâmico em Componentes
Slots permitem que você insira conteúdo dinâmico em seus componentes.
Exemplo:
Container.vue:
<template>
<div class="container">
<slot></slot>
</div>
</template>
<script>
export default {
name: 'Container'
};
</script>
<style scoped>
.container {
border: 2px solid #42b983;
padding: 20px;
}
</style>
App.vue:
<template>
<div id="app">
<Container>
<h2>Conteúdo inserido dinamicamente!</h2>
</Container>
</div>
</template>
<script>
import Container from './components/Container.vue';
export default {
name: 'App',
components: {
Container
}
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
Neste tópico, exploramos a criação e o uso de componentes Vue.js, abordando desde a estrutura básica de um componente até a comunicação entre componentes, o ciclo de vida dos componentes e a utilização de slots. Componentes são fundamentais para construir aplicações Vue.js modulares e eficientes, permitindo a reutilização de código e a manutenção simplificada. No próximo tópico, vamos aprofundar a configuração de rotas e a navegação em uma aplicação Vue.js.
Gerenciamento de Estado com Vuex
Introdução
Vuex é uma biblioteca de gerenciamento de estado padrão para aplicações Vue.js. Ele serve como um repositório centralizado para todos os componentes em uma aplicação, com regras que garantem que o estado só possa ser mutado de maneiras previsíveis. Neste tópico, vamos explorar os conceitos fundamentais do Vuex, como ele se integra com Vue.js, e fornecer exemplos práticos para ilustrar seu uso.
Instalação do Vuex
Para começar a usar Vuex, você precisa instalá-lo. Isso pode ser feito usando npm ou yarn:
npm install vuex@next --save
# ou
yarn add vuex@next
Estrutura Básica do Vuex
Um store Vuex é composto de cinco partes principais:
- State: O estado, ou dados, da aplicação.
- Getters: Métodos que permitem acessar o estado.
- Mutations: Métodos que modificam o estado.
- Actions: Métodos que disparam mutações e podem conter lógica assíncrona.
- Modules: Permitem dividir o store em sub-módulos.
Criando um Store Básico
Vamos criar um store básico para gerenciar um contador:
// src/store/index.js
import { createStore } from 'vuex';
const store = createStore({
state() {
return {
count: 0
};
},
getters: {
doubleCount(state) {
return state.count * 2;
}
},
mutations: {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment');
}, 1000);
}
}
});
export default store;
Integrando o Store com a Aplicação Vue
Para usar o store Vuex na sua aplicação, você precisa configurá-lo no ponto de entrada principal.
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';
const app = createApp(App);
app.use(store);
app.mount('#app');
Usando o Store no Componente
Agora vamos usar o store no nosso componente para exibir e manipular o estado.
<template>
<div>
<p>Count: {{ count }}</p>
<p>Double Count: {{ doubleCount }}</p>
<button @click="increment">Increment</button>
<button @click="decrement">Decrement</button>
<button @click="incrementAsync">Increment Async</button>
</div>
</template>
<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';
export default {
computed: {
...mapState(['count']),
...mapGetters(['doubleCount'])
},
methods: {
...mapMutations(['increment', 'decrement']),
...mapActions(['incrementAsync'])
}
};
</script>
<style>
button {
margin-right: 10px;
}
</style>
Trabalhando com Módulos
Para aplicações maiores, você pode dividir seu store em módulos. Vamos criar dois módulos: counter
e user
.
Modulo Counter
// src/store/modules/counter.js
const state = () => ({
count: 0
});
const getters = {
doubleCount(state) {
return state.count * 2;
}
};
const mutations = {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
};
const actions = {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment');
}, 1000);
}
};
export default {
namespaced: true,
state,
getters,
mutations,
actions
};
Modulo User
// src/store/modules/user.js
const state = () => ({
name: 'John Doe',
age: 30
});
const getters = {
userInfo(state) {
return `${state.name}, ${state.age} anos`;
}
};
const mutations = {
updateName(state, newName) {
state.name = newName;
},
updateAge(state, newAge) {
state.age = newAge;
}
};
const actions = {
updateNameAsync({ commit }, newName) {
setTimeout(() => {
commit('updateName', newName);
}, 1000);
}
};
export default {
namespaced: true,
state,
getters,
mutations,
actions
};
Configurando o Store Principal
// src/store/index.js
import { createStore } from 'vuex';
import counter from './modules/counter';
import user from './modules/user';
const store = createStore({
modules: {
counter,
user
}
});
export default store;
Usando Módulos no Componente
Vamos criar um componente que utiliza os módulos counter
e user
.
<template>
<div>
<h1>Counter Module</h1>
<p>Count: {{ count }}</p>
<p>Double Count: {{ doubleCount }}</p>
<button @click="increment">Increment</button>
<button @click="decrement">Decrement</button>
<button @click="incrementAsync">Increment Async</button>
<h1>User Module</h1>
<p>User: {{ userInfo }}</p>
<button @click="updateName('Jane Doe')">Update Name</button>
<button @click="updateAge(35)">Update Age</button>
<button @click="updateNameAsync('John Smith')">Update Name Async</button>
</div>
</template>
<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';
export default {
computed: {
...mapState('counter', ['count']),
...mapGetters('counter', ['doubleCount']),
...mapState('user', ['name', 'age']),
userInfo() {
return `${this.name}, ${this.age} anos`;
}
},
methods: {
...mapMutations('counter', ['increment', 'decrement']),
...mapActions('counter', ['incrementAsync']),
...mapMutations('user', ['updateName', 'updateAge']),
...mapActions('user', ['updateNameAsync'])
}
};
</script>
<style>
button {
margin-right: 10px;
}
</style>
Neste tópico, exploramos o gerenciamento de estado com Vuex, uma biblioteca essencial para aplicações Vue.js que necessitam de um estado centralizado e previsível. Vimos como configurar e integrar Vuex em uma aplicação Vue, criar e usar um store básico, além de dividir o store em módulos para melhor organização. A capacidade de gerenciar eficientemente o estado de uma aplicação é fundamental para a construção de aplicações Vue.js robustas e escaláveis.
Implementação de Funcionalidades Avançadas
Implementação de Funcionalidades Avançadas em Vue.js
Introdução
O Vue.js é uma biblioteca JavaScript progressiva que facilita a criação de interfaces de usuário. Além das funcionalidades básicas, o Vue.js oferece diversas funcionalidades avançadas que permitem construir aplicações ricas e complexas. Neste tópico, exploraremos algumas dessas funcionalidades avançadas, como componentes dinâmicos, slots avançados, diretivas personalizadas, mixins, plugins e o uso do Vuex para gerenciamento de estado avançado.
Componentes Dinâmicos
Componentes dinâmicos permitem que você alterne entre diferentes componentes de forma dinâmica, utilizando a diretiva especial <component>
. Isso é útil para criar interfaces flexíveis e reutilizáveis.
Exemplo de componentes dinâmicos:
<!-- src/components/DynamicComponent.vue -->
<template>
<div>
<button @click="currentComponent = 'componentA'">Componente A</button>
<button @click="currentComponent = 'componentB'">Componente B</button>
<component :is="currentComponent"></component>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: 'componentA'
};
},
components: {
componentA: ComponentA,
componentB: ComponentB
}
};
</script>
ComponentA.vue:
<template>
<div>
<h2>Componente A</h2>
<p>Este é o Componente A.</p>
</div>
</template>
<script>
export default {
name: 'ComponentA'
};
</script>
ComponentB.vue:
<template>
<div>
<h2>Componente B</h2>
<p>Este é o Componente B.</p>
</div>
</template>
<script>
export default {
name: 'ComponentB'
};
</script>
Slots Avançados
Slots são espaços reservados nos componentes que permitem a inserção de conteúdo dinâmico. O Vue.js oferece funcionalidades avançadas de slots, como slots nomeados e scoped slots.
Exemplo de slots nomeados e scoped slots:
<!-- src/components/NamedSlot.vue -->
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
<script>
export default {
name: 'NamedSlot'
};
</script>
App.vue:
<template>
<div id="app">
<NamedSlot>
<template v-slot:header>
<h1>Este é o cabeçalho</h1>
</template>
<p>Este é o conteúdo principal.</p>
<template v-slot:footer>
<h3>Este é o rodapé</h3>
</template>
</NamedSlot>
</div>
</template>
<script>
import NamedSlot from './components/NamedSlot.vue';
export default {
name: 'App',
components: {
NamedSlot
}
};
</script>
Diretivas Personalizadas
Diretivas personalizadas permitem encapsular comportamento DOM reutilizável. Vamos criar uma diretiva personalizada que muda a cor de fundo de um elemento ao passar o mouse.
// src/directives/hover.js
export default {
beforeMount(el, binding) {
const color = binding.value || 'yellow';
el.style.transition = 'background-color 0.3s';
el.addEventListener('mouseover', () => {
el.style.backgroundColor = color;
});
el.addEventListener('mouseout', () => {
el.style.backgroundColor = '';
});
}
};
Registrando a Diretiva:
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import hover from './directives/hover';
const app = createApp(App);
app.directive('hover', hover);
app.mount('#app');
Usando a Diretiva:
<template>
<div v-hover="'lightblue'">
Passe o mouse aqui para mudar a cor de fundo.
</div>
</template>
Mixins
Mixins são uma forma de distribuir funcionalidades reutilizáveis para componentes Vue. Um mixin pode conter qualquer opção de componente, como data
, methods
, mounted
, etc.
Exemplo de Mixin:
// src/mixins/hello.js
export default {
data() {
return {
message: 'Olá do Mixin!'
};
},
created() {
console.log(this.message);
}
};
Usando o Mixin:
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
import helloMixin from '../mixins/hello';
export default {
mixins: [helloMixin]
};
</script>
Plugins
Plugins permitem adicionar funcionalidades globais à sua aplicação Vue. Um plugin é um objeto que expõe um método install
, que é chamado quando o plugin é usado.
Exemplo de Plugin:
// src/plugins/myPlugin.js
export default {
install(app, options) {
app.config.globalProperties.$greet = (name) => {
console.log(`Olá, ${name}!`);
};
}
};
Registrando o Plugin:
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import myPlugin from './plugins/myPlugin';
const app = createApp(App);
app.use(myPlugin);
app.mount('#app');
Usando o Plugin:
<template>
<div>
<button @click="$greet('Mundo')">Cumprimentar</button>
</div>
</template>
Gerenciamento de Estado Avançado com Vuex
Além do gerenciamento de estado básico, Vuex permite funcionalidades avançadas como persistência de estado, plugins Vuex e módulos dinâmicos.
Persistência de Estado:
Você pode usar plugins de persistência de estado como vuex-persistedstate
para salvar o estado no armazenamento local.
// src/store/index.js
import { createStore } from 'vuex';
import createPersistedState from 'vuex-persistedstate';
const store = createStore({
state() {
return {
count: 0
};
},
mutations: {
increment(state) {
state.count++;
}
},
plugins: [createPersistedState()]
});
export default store;
Módulos Dinâmicos:
Módulos dinâmicos podem ser registrados e removidos em tempo de execução.
// src/store/index.js
import { createStore } from 'vuex';
const store = createStore({
state() {
return {
count: 0
};
},
mutations: {
increment(state) {
state.count++;
}
}
});
const userModule = {
state() {
return {
name: 'John Doe'
};
},
mutations: {
updateName(state, newName) {
state.name = newName;
}
}
};
// Adicionando módulo dinamicamente
store.registerModule('user', userModule);
// Removendo módulo dinamicamente
store.unregisterModule('user');
export default store;
Neste tópico, exploramos várias funcionalidades avançadas do Vue.js, incluindo componentes dinâmicos, slots avançados, diretivas personalizadas, mixins, plugins e técnicas avançadas de gerenciamento de estado com Vuex. Essas funcionalidades permitem que você construa aplicações Vue.js mais complexas, flexíveis e robustas. Continuar a explorar e utilizar essas ferramentas avançadas ajudará a tirar o máximo proveito do Vue.js em seus projetos.