Construindo uma Aplicação Single Page (SPA) com Vue.js

construindo spa com vuejs

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.

  1. 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
  1. 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/
└── ...
  1. 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>
  1. 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

  1. 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.
  2. 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:

  1. 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.
  2. 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.

  1. 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>
  1. 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>
  1. 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

See Configuration Reference.

#### 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:

  1. <template>: Define o layout HTML do componente.
  2. <script>: Contém a lógica do componente, como dados, métodos e ciclo de vida.
  3. <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:

  1. created: Chamado após a criação do componente.
  2. mounted: Chamado após o componente ser inserido no DOM.
  3. updated: Chamado após o componente ser atualizado devido a mudanças nos dados reativos.
  4. 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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima