Conheça o Vuetify - parte 2

Nesta segunda parte do nosso artigo sobre Vuetify estaremos analisando o componente App.vue, mais precisamente o componente VNavigationDrawer.

Comunidade Já temos um grupo próprio do Vuetify em português no Telegram. Além deste grupo, temos toda uma comunidade br do Vue no qual você pode participar!

Analisando o App.vue

O componente App contém toda a aplicação Vuetify. Analisando a imagem a seguir:

Podemos destacar os seguintes componentes:

VApp

É o componente que compreende toda a aplicação Vuetify. Este componente é praticamente obrigatório em uma aplicação Vuetify, e através dele pode-se criar diversos tipos de design. Vamos abordar um pouco mais do VApp a sgeuir. Uma aplicação básica pode conter o seguinte código:

<v-app>
  <v-navigation-drawer app></v-navigation-drawer>
  <v-toolbar app></v-toolbar>
  <v-content>
    <v-container fluid>
      <router-view></router-view>
    </v-container>
  </v-content>
  <v-footer app></v-footer>
</v-app>

VNavigationDrawer

É um componente capaz de desenhar um menu, onde este menu está integrado ao Vue Router:

Na aplicação, temos o Navigation Drawer definido da seguinte forma:

<v-navigation-drawer
      persistent
      :mini-variant="miniVariant"
      :clipped="clipped"
      v-model="drawer"
      enable-resize-watcher
      fixed
      app
    >

Propriedade Persistent

A propriedade persistent define a forma como ela se comporta quando a página é carregada. Se for persistent, o componente será exibido assim que a página é carregada (exceto se estiver e um dispositivo mobile). Caso não queria esse comportamento, deixando o componente invisível no carregamento da página, altere de persistent para temporary

Propriedade MiniVariant

Esta propriedade “condensa” o menu de forma que fique somente com os ícones. Por exemplo:


mini-variant: true


mini-variant: false

No caso da aplicação, temos o uso do :mini-variant com dois pontos no início para indicar que a propriedade está observando uma variável no this.data.miniVariant do Vue. Esta propriedade é alternada através de um botão no menu do cabeçalho (toolbar):

Propriedade clipped

Determina se o Panel do Drawer (vamos chamar de menu) está sobre o toolbar ou sob ele. Uma imagem vale por mil palavras:

Novamente usa-se um bind :clipped="clipped" para que o valor seja observado através do this.data.clipped.

Propriedade v-model

A propriedade v-model do Navigation Drawer indica se ele está presente ou não na aplicação. Pode-se usar essa propriedade para, por exemplo, exibir o menu somente através de um contexto, como o usuário logado.

Propriedade enable-resize-watcher (deprecidada)

Este propriedade indica se o Navigation Drawer deve fechar automaticamente caso o tamanho da tela diminua. Em uma recente atualização do Vuetify, esta propriedade foi alterada para disable-resize-watcher. Então altere o enable-resize-watcher para disable-resize-watcher.

Propriedade fixed

Esta propriedade determina se a posição do elemento (neste caso o Navigation Drawer) é fixa.

Propriedade app

Esta propriedade determina que o Navigation Drawer é pertencente ao v-app. Sem ela, o menu nao esta pertencente a aplicação como um todo. Isso ocorre porque podemos criar um Navigation Drawer que é pertencente a algum menu interno e que é de uma tela qualquer, e não da app.

Outras propriedades importantes

  • dark Usa o tema “dark”, que pode ser combinado com o dark de outros componentes.
  • height A altura do componente, cujo padrão é ‘100%’
  • light Outro variação do tema
  • mobile-break-point Informa a largura em pixels da definição sobre o que é mobile ou não. O valor padrão é 1264, se a largura da app for menor que isso, o componente se comporta como um mobile.
  • permanent O componente fica permanentemente visível na tela.
  • right Posiciona o componente no lado direito da tela
  • stateless Remove todo o controle automático do componente frente as interações da tela, a largura e a mudança de rota. Todo o controle seria manual.
  • touchless Desabilita os eventos touch do dispositivo mobile, como o arrastar para a direta fazendo a o componente surgir na tela
  • value Controla a visibilidade do componente

Configurando o menu

O menu interno ao Navigation Drawer pode ser configurado de diferentes formas. Neste caso específico, temos:

<v-navigation-drawer>
  <v-list>
    <v-list-tile
      value="true"
      v-for="(item, i) in items"
      :key="i"
    >
      <v-list-tile-action>
        <v-icon v-html="item.icon"></v-icon>
      </v-list-tile-action>
      <v-list-tile-content>
        <v-list-tile-title v-text="item.title"></v-list-tile-title>
      </v-list-tile-content>
    </v-list-tile>
  </v-list>
</v-navigation-drawer>

Temos então um VList em conjunto com um VListTile, e neste temos o v-for do Vue iterando em uma lista chamada items. Esta lista é criada no this.data, veja:

<script>
export default {
  data () {
    return {
      clipped: false,
      drawer: true,
      fixed: false,
      items: [{
        icon: 'bubble_chart',
        title: 'Inspire'
      }],
      miniVariant: false,
      right: true,
      rightDrawer: false,
      title: 'Vuetify.js'
    }
  },
  name: 'App'
}
</script>

A princípio temos apenas um item, chamado de “Inspire”. No componente, após o uso do v-for, temos um v-list-tile-action e um v-list-tile-content ambos usando os dados da lista de items.

Criando a integração com o Vue Router

Até o momento temos apenas uum item no VueRouter, definido no arquivo src/router/index.js:

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]
})

E precisamos adicionar no menu da direita um link para essa rota. Primeiro, devemos alterar o v-list-tile do Navigation Drawer adicionando a propriedade to, da seguinte forma:

 <v-list-tile
          value="true"
          v-for="(item, i) in items"
          :key="i"
          :to="item.to"
        >

A propriedade to, nativa do v-list-tile, integra-se ao Vue Router e ao <router-link>, provendo assim o acesso ao roteamento do Vue. Para finalizar, altere a lista de itens para:

...
items: [{
  icon: 'bubble_chart',
  title: 'Hello World',
  to: '/'
}],
...

Perceba que adicionamos no item a propriedade to, que trabalha em conjunto com o <v-list-tile>. Agora, se adicionarmos mais um item, por exemplo:

 items: [{
        icon: 'bubble_chart',
        title: 'Hello World',
        to: '/'
      },
      {
        icon: 'vpn_key',
        title: 'Login',
        to: '/login'
      } ],

Temos o seguinte resultado:

Claro que, ao clicar neste item, nenhuma página será carregada, pois o componente ainda não foi criado. No próximo artigo conheceremos mais sobre outro importante componente, o VToolbar. Até lá!