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:
Manipuladores em linha: O código de JavaScript em linha pode ser executado quando o evento é acionado (semelhante ao atributo
onclick
nativo).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)
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)
}
}
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
.
Consulte: Tipos para os Manipuladores de Evento
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)
}
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)
}
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.