Skip to content
The translation is synced to the docs on of which the commit hash is 8a7fb04.

API de Eventos
rutura

Visão Geral

Os métodos de instância $on, $off, e $once foram removidos. As instâncias do componente já não implementam a interface emissora de evento.

Sintaxe da 2.x

Na 2.x, uma instância de Vue poderia ser usada para acionar manipuladores anexados imperativamente através da API emissora de evento ($on, $off e $once). Isto poderia ser usado para criar um autocarro de evento para criar ouvintes de evento global usados por toda aplicação:

js
// eventBus.js

const eventBus = new Vue()

export default eventBus
js
// ChildComponent.vue
import eventBus from './eventBus'

export default {
  mounted() {
    // adicionado ouvinte do `eventBus`
    eventBus.$on('custom-event', () => {
      console.log('Custom event triggered!')
    })
  },
  beforeDestroy() {
    // removendo o ouvinte do `eventBus`
    eventBus.$off('custom-event')
  }
}
js
// ParentComponent.vue
import eventBus from './eventBus'

export default {
  methods: {
    callGlobalCustomEvent() {
      eventBus.$emit('custom-event') // se `ChildComponent` estiver montado, teremos uma mensagem na consola
    }
  }
}

Atualização da 3.x

Nós removemos completamente os métodos $on, $off e $once da instância. $emit ainda é uma parte da API existente uma vez que é usado para acionar os manipuladores de evento anexados de maneira declarativa por um componente pai.

Estratégia de Migração

Opção da Construção de Migração: INSTANCE_EVENT_EMITTER

Na Vue 3, já não é possível usar estas APIs para ouvir os eventos emitidos por um componente a partir de dentro dum componente. Não existe nenhum caminho de migração para este caso de uso.

Eventos do Componente de Raiz

Os ouvintes de evento estático podem ser adicionados ao componente de raiz passando-os como propriedades ao createApp:

js
createApp(App, {
  // Ouvir o evento 'expand'
  onExpand() {
    console.log('expand')
  }
})

Autocarro de Evento

O padrão de autocarro de evento pode ser substituído usando uma biblioteca externa implementando a interface emissora de evento, por exemplo mitt ou tiny-emitter.

Exemplo:

js
// eventBus.js
import emitter from 'tiny-emitter/instance'

export default {
  $on: (...args) => emitter.on(...args),
  $once: (...args) => emitter.once(...args),
  $off: (...args) => emitter.off(...args),
  $emit: (...args) => emitter.emit(...args)
}

Isto fornece a mesma API emissora de evento que na Vue 2.

Na maioria das circunstâncias, o uso dum autocarro de evento global para comunicação entre componentes é desencorajada. Embora seja frequentemente a solução mais simples a curto prazo, quase sempre se revela uma dor de cabeça para a manutenção a longo prazo. Dependendo das circunstâncias, existem várias alternativas para o uso dum autocarro de evento:

  • As propriedades e eventos devem ser a nossa primeira escolha para comunicação pai-filho. Os irmãos podem comunicarem-se através do seu pai
  • O fornecimento e injeção permitem um componente comunicar com os conteúdos da sua ranhura. Isto é útil para componentes fortemente acoplados que são sempre usados juntos.
  • O fornecimento e injeção também podem ser usados para comunicação de longa distância entre componentes. Pode ajudar a evitar 'perfuração de propriedade', onde as propriedades precisam ser passadas para baixo através de vários níveis de componentes que não precisam em si mesmos daquelas propriedades.
  • A perfuração de propriedade também pode ser evitada refatorando o uso de ranhuras. Se um componente interino não precisar das propriedades então pode indicar um problema com a separação de interesses. A introdução duma ranhura neste componente permite o pai criar o conteúdo diretamente, para que as propriedades possam ser passadas sem o componente interino precisar envolver-se.
  • Gestão de Estado Global, tal como a Pinia.