Skip to content

Roteamento

Roteamento do Lado do Cliente vs Lado do Servidor

Rotear no lado do servidor significa que o servidor envia uma resposta baseada no caminho da URL que o utilizador visita. Quando clicamos sobre uma ligação numa aplicação da Web interpretada do lado do servidor tradicional, o navegador recebe uma resposta de HTML a partir do servidor e recarrega a página inteira com o novo HTML.

Numa Aplicação de Página Única (SPA, sigla em Inglês), no entanto, a JavaScript do lado do cliente pode intercetar a navegação, pedir dinamicamente novos dados, e atualizar a página atual sem recarregamento completo da página. Isto normalmente resulta numa experiência de uso mais elegante, especialmente para os casos de uso que são mais como "aplicações" de verdade, onde o utilizador é esperado realizar muitas interações sobre um longo período de tempo.

Em tais aplicações de página única, o "roteamento" é feito sobre o lado do cliente, no navegador. Um roteador do lado do cliente é responsável por gerir a visão interpretada da aplicação usando as APIs do navegador tais como API de História ou o evento hashchange.

Roteador Oficial

A Vue está bem adaptada para construir aplicações de página única. Para a maioria das aplicações de página única, é recomendado usar a biblioteca Vue Router suportada oficialmente. Para mais detalhes, consultar a documentação da Vue Router.

Roteamento Simples do Zero

Se apenas precisarmos dum roteamento muito simples e não desejarmos envolver uma biblioteca roteadora completa, podemos fazer isto com os Componentes Dinâmicos e atualizar o estado do componente atual ouvindo os eventos de hashcache do navegador ou usando a API de História.

Eis um exemplo simples:

vue
<script setup> import { ref, computed } from 'vue' import Home from './Home.vue' import About from './About.vue' import NotFound from './NotFound.vue'  const routes = {  '/': Home,  '/about': About }  const currentPath = ref(window.location.hash)  window.addEventListener('hashchange', () => {  currentPath.value = window.location.hash })  const currentView = computed(() => {  return routes[currentPath.value.slice(1) || '/'] || NotFound }) </script>  <template>  <a href="#/">Home</a> |  <a href="#/about">About</a> |  <a href="#/non-existent-path">Broken Link</a>  <component :is="currentView" /> </template>

Experimentar na Zona de Testes

vue
<script> import Home from './Home.vue' import About from './About.vue' import NotFound from './NotFound.vue'  const routes = {  '/': Home,  '/about': About }  export default {  data() {  return {  currentPath: window.location.hash  }  },  computed: {  currentView() {  return routes[this.currentPath.slice(1) || '/'] || NotFound  }  },  mounted() {  window.addEventListener('hashchange', () => {  this.currentPath = window.location.hash })  } } </script>  <template>  <a href="#/">Home</a> |  <a href="#/about">About</a> |  <a href="#/non-existent-path">Broken Link</a>  <component :is="currentView" /> </template>

Experimentar na Zona de Testes

Roteamento has loaded