Skip to content

Manipulação de Evento ​

Ouvindo Eventos ​

Nós podemos utilizar a diretiva v-on, que normalmente abreviamos para o símbolo @, para ouvir os eventos do DOM e executar algum código de JavaScript quando são acionadas. A utilização seria v-on:click="handler" ou com o atalho, @click="handler".

O valor de handler (manipulador) pode ser um dos seguintes:

  1. Manipuladores em linha: O código de JavaScript em linha pode ser executado quando o evento é acionado (semelhante ao atributo onclick nativo).

  2. Manipuladores de método: O nome da propriedade ou o caminho que aponta para um método definido no componente.

Manipuladores Em Linha ​

Os manipuladores em linha normalmente são utilizados em casos simples, por exemplo:

js
const count = ref(0)
js
data() {
  return {
    count: 0
  }
}
template
<button @click="count++">Add 1</button>
<p>Count is: {{ count }}</p>

Manipuladores de Método ​

A lógica para muitos manipuladores de evento será mais complexa, e provavelmente não é viável com manipuladores em linha. É por isto que a v-on também pode aceitar o nome ou caminho de um método do componente que gostarias de chamar.

Por exemplo:

js
const name = ref('Vue.js')

function greet(event) {
  alert(`Hello ${name.value}!`)
  // `event` é um evento de DOM nativo
  if (event) {
    alert(event.target.tagName)
  }
}
js
data() {
  return {
    name: 'Vue.js'
  }
},
methods: {
  greet(event) {
    // `this` dentro de métodos aponta para atual instância ativa
    alert(`Hello ${this.name}!`)
    // `event` é um evento de DOM nativo
    if (event) {
      alert(event.target.tagName)
    }
  }
}
template
<!-- `greet` é o nome do método definido acima -->
<button @click="greet">Greet</button>

Um manipulador de método recebe automaticamente o objeto de evento de DOM nativo que o aciona - no exemplo acima, somos capazes de acessar o elemento despachando o evento através de event.target.tagName.

Método vs. Deteção Em Linha ​

O compilador do modelo de marcação deteta os manipuladores de método verificando se o valor de sequência de caracteres de v-on é um identificador de JavaScript válido ou caminho de acesso de propriedade. Por exemplo, foo, foo.bar e foo['bar'] são tratados como manipuladores de métodos, enquanto foo() e count++ são tratados como manipuladores em linha.

Chamando Métodos em Manipuladores Em Linha ​

No lugar de vincular diretamente para um nome de método, também podemos chamar métodos em um manipulador em linha. Isto permite-nos passar os argumentos personalizados do método ao invés do evento nativo:

js
function say(message) {
  alert(message)
}
js
methods: {
  say(message) {
    alert(message)
  }
}
template
<button @click="say('hello')">Say hello</button>
<button @click="say('bye')">Say bye</button>

Acessando Argumento de Evento nos Manipuladores Em Linha ​

Algumas vezes também precisamos acessar o evento de DOM original em um manipulador em linha. Tu podes passá-lo para um método utilizando variável especial $event, ou utilizar uma função em flecha em linha:

template
<!-- utilizando a variável especial $event -->
<button @click="warn('Form cannot be submitted yet.', $event)">
  Submit
</button>

<!-- utilizando a função em flecha em linha -->
<button @click="(event) => warn('Form cannot be submitted yet.', event)">
  Submit
</button>
js
function warn(message, event) {
  // agore temos acesso ao evento nativo
  if (event) {
    event.preventDefault()
  }
  alert(message)
}
js
methods: {
  warn(message, event) {
    // agore temos acesso ao evento nativo
    if (event) {
      event.preventDefault()
    }
    alert(message)
  }
}

Modificadores de Evento ​

É muito comum precisar chamar event.preventDefault() ou event.stopPropagation() dentro de manipuladores de evento. Ainda que possamos fazer isto facilmente dentro de métodos, seria melhor se os métodos pudessem ser puramente a respeito da lógica dos dados em vez de ter que lidar com detalhes de evento de DOM.

Para tratar este problema, a Vue fornece modificadores de evento para v-on. Recorda-te de que os modificadores são nomes especiais depois do nome do evento denotados por um ponto.

  • .stop
  • .prevent
  • .self
  • .capture
  • .once
  • .passive
template
<!-- o propagação do evento de clique será interrompida -->
<a @click.stop="doThis"></a>

<!-- o evento de submeter já não recarregará a página -->
<form @submit.prevent="onSubmit"></form>

<!-- modificadores podem ser encadeados -->
<a @click.stop.prevent="doThat"></a>

<!-- apenas o modificador -->
<form @submit.prevent></form>

<!-- apenas aciona o manipulador se `event.target` for o próprio elemento -->
<!-- por exemplo, não um elemento filho -->
<div @click.self="doThat">...</div>

DICA

A ordem importa quando estiveres utilizando modificadores porque o código relevante é gerado na mesma ordem. Portanto a utilização de @click.prevent.self impedirá a ação de cliques padrão sobre o próprio elemento e seus filhos enquanto @click.self.prevent só impedirá a ação de cliques padrão sobre o próprio elemento.

Os modificadores .capture, .once, e .passive refletem as opções do método addEventListener nativo:

template
<!-- utilize o modo de captura quando estiveres adicionando o ouvinte de evento -->
<!-- por exemplo, um evento mirando um elemento interno é manipulado aqui antes de ser manipulado por aquele elemento -->
<div @click.capture="doThis">...</div>

<!-- o evento de clique será acionado no máximo uma vez -->
<a @click.once="doThis"></a>

<!-- o comportamento padrão do evento de deslocamento (deslocando) acontecerá -->
<!-- imediatamente, no lugar de esperar o `onScroll` terminar  -->
<!-- neste caso ele contém `event.preventDefault()`                -->
<div @scroll.passive="onScroll">...</div>

O modificador .passive é normalmente utilizado com o ouvintes de evento de toque para melhorar o desempenho nos dispositivos móveis.

DICA

Não utilize .passive e .prevent juntos, porque .passive já indica para o navegador que não tencionas prevenir o comportamento padrão do evento, e provavelmente verás um aviso a partir do navegador se o fizeres.

Modificadores de Tecla ​

Quando estivermos ouvindo por eventos teclado, precisamos com frequência verificar por teclas especificas. A Vue permite a adição de modificadores de tecla para v-on ou @ quando estivermos ouvindo por eventos de tecla:

template
<!-- só chama `vm.submit()` quando a `tecla` pressionada for `Enter` -->
<input @keyup.enter="submit" />

Tu podes utilizar diretamente quaisquer nomes de tecla válidos expostos através de KeyboardEvent.key como modificadores convertendo-os para "kebab-case".

template
<input @keyup.page-down="onPageDown" />

No exemplo acima, o manipulador só será chamado se $event.key for igual a 'PageDown'.

Pseudónimos de Tecla ​

A Vue fornece pseudónimos para as teclas mais comummente utilizadas:

  • .enter
  • .tab
  • .delete (captura ambas teclas "Delete" e "Backspace")
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

Teclas Modificadoras do Sistema ​

Tu podes utilizar os seguintes modificadores para acionares ouvintes de eventos de teclado ou rato apenas quando a tecla modificadora correspondente for pressionada:

  • .ctrl
  • .alt
  • .shift
  • .meta

NOTA

Nos teclados de Macintosh, meta é a tecla de comando (⌘). Nos teclados de Windows, meta é a tecla de Windows (⊞). Nos teclados de Sun Microsystems, meta é marcado como um diamante sólido (◆). Em certos teclados, especialmente teclados de MIT e máquina de Lisp e sucessores, tais como o teclado de Knight, teclado space-cadet, meta é rotulado “META”. Nos teclados simbólicos, meta é rotulado “META” ou “Meta”.

Por exemplo:

template
<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" />

<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

NOTA

Nota que as teclas modificadoras são diferentes das teclas normais e quando utilizadas com eventos de keyup, elas têm que ser pressionadas quando o evento for emitido. Em outras palavras, keyup.ctrl só acionará se libertares uma tecla enquanto estiveres pressionando ctrl para baixo. Não acionará se libertares apenas a tecla ctrl.

O Modificador .exact ​

O modificador .exact permite o controlo da combinação exata de modificadores de sistema necessária para acionar um evento.

template
<!-- isto disparará mesmo se Alt ou Shift também for pressionado -->
<button @click.ctrl="onClick">A</button>

<!-- isto só disparará quando Ctrl e não outras teclas for pressionado -->
<button @click.ctrl.exact="onCtrlClick">A</button>

<!-- isto só disparará quando nenhum dos modificadores do sistema for pressionado -->
<button @click.exact="onClick">A</button>

Modificadores de Botão de Rato ​

  • .left
  • .right
  • .middle

Estes modificadores limitam o manipulador para os eventos acionados por um botão de rato especifico.

Manipulação de Evento has loaded