20 métodos de comunicação de componente pai Vue e componente filho (o resumo mais completo de toda a rede)

Índice

1. Comumente usado

Adereços

componente pai:

Submontagem:

$emit e $on

componente pai:

Submontagem:

$pais e $filhos

componente pai:

Submontagem:

$attrs e $listeners

componente pai:

Submontagem:

fornecer e injetar

componente pai:

Submontagem:

2. Outras explorações

EventBus

componente pai:

Submontagem:

Vuex

loja.js:

componente pai:

Submontagem:

$refs propriedade

componente pai:

Submontagem:

$propriedade pai

componente pai:

Submontagem:

propriedade $root

componente raiz:

Submontagem:

fornecer / injetar (avançado)

Componente ancestral:

Componentes filhos diretos:

Subcomponentes indiretos:

fornecer / injetar + Vuex (avançado)

componente raiz:

Subcomponentes e netos:

evento personalizado

componente pai:

Submontagem:

Comunicação entre componentes irmãos

EventBus.js:

Componente A:

Componente B:

localStorage (cache do navegador)

Componente A:

Componente B:

Publicar modo Assinar (Pub/Sub)

Central de mensagens:

Componente A:

Componente B:

WebSocket (Avançado)

Conecte-se ao servidor WebSocket:

Componente A:

Componente B:

Parâmetros de Rota (Avançado)

componente pai:

Submontagem:

Componentes irmãos:

Gerenciamento de estado Vuex (avançado)

loja.js:

Componente A:

Componente B:

Barramento de Eventos (Avançado)

Ônibus do evento:

Componente A:

Componente B:

3. Recomendações de alta qualidade no passado


1. Comumente usado

  • Recentemente, tenho empacotado vários componentes para melhorar a eficiência de desenvolvimento dos membros da equipe.
  • Componentes pai-filho encontrados em várias situações, várias transferências de valor entre componentes irmãos,
  • Aqui está um resumo e alguma exploração, bem-vindo para adicionar ~

Adereços

O componente pai passa dados para o componente filho e o componente filho recebe os dados por meio do atributo props

componente pai:

<template>
  <div>
    <child-component :parentData="data"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data () {
    return {
      data: '父组件传递的数据'
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件接收到的数据:{
   
   { parentData }}
  </div>
</template>

<script>
export default {
  props: {
    parentData: String
  }
}
</script>

Quais são os tipos de valor padrão das props Vue

$emit e $on

O componente filho transmite dados para o componente pai, o componente filho aciona um evento por meio de $emit e o componente pai escuta o evento e recebe dados por meio de $on.

componente pai:

<template>
  <div>
    <child-component @childEvent="handleChild"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleChild (data) {
      console.log('父组件接收到的数据:' + data)
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    <button @click="handleClick">点击触发事件</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick () {
      this.$emit('childEvent', '子组件传递的数据')
    }
  }
}
</script>

$pais e $filhos

O componente pai passa dados para o componente filho, e o componente pai obtém a instância do componente filho por meio de $children e chama o método do componente filho para passar os dados.

componente pai:

<template>
  <div>
    <button @click="handleClick">向子组件传递数据</button>
    <child-component ref="child"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleClick () {
      this.$refs.child.handleData('父组件传递的数据')
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件
  </div>
</template>

<script>
export default {
  methods: {
    handleData (data) {
      console.log('子组件接收到的数据:' + data)
    }
  }
}
</script>

$attrs e $listeners

O componente pai passa atributos e eventos para o componente filho, e o componente filho obtém o atributo por meio de $attrs e obtém o evento por meio de $listeners e o vincula ao componente filho.

componente pai:

<template>
  <div>
    <child-component attr1="属性1" attr2="属性2" @event1="handleEvent"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleEvent (data) {
      console.log('父组件接收到的数据:' + data)
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件
  </div>
</template>

<script>
export default {
  mounted () {
    this.$emit('event1', '子组件传递的数据')
  }
}
</script>

fornecer e injetar

O componente pai passa dados para o componente filho, o componente pai fornece dados por meio de fornecer e o componente filho injeta dados por meio de injeção.

componente pai:

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  provide () {
    return {
      parentData: '父组件提供的数据'
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件接收到的数据:{
   
   { childData }}
  </div>
</template>

<script>
export default {
  inject: ['parentData'],
  computed: {
    childData () {
      return this.parentData + ',子组件加工处理后的数据'
    }
  }
}
</script>

2. Outras explorações

EventBus

A comunicação entre componentes pais e componentes filhos é realizada através de um barramento de eventos central (EventBus).

EventBus.js:

import Vue from 'vue'
export const EventBus = new Vue()

componente pai:

<template>
  <div>
    <button @click="handleParent">向子组件传递数据</button>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'
import { EventBus } from './EventBus'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleParent () {
      EventBus.$emit('parent-event', '父组件传递的数据')
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件接收到的数据:{
   
   { childData }}
  </div>
</template>

<script>
import { EventBus } from './EventBus'

export default {
  data () {
    return {
      childData: ''
    }
  },
  mounted () {
    EventBus.$on('parent-event', data => {
      this.childData = data
    })
  }
}
</script>

Vuex

O componente pai e o componente filho se comunicam através do Vuex, compartilhando a mesma árvore de estado.

loja.js:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    data: '共享的数据'
  },
  mutations: {
    setData (state, data) {
      state.data = data
    }
  }
})

componente pai:

<template>
  <div>
    <button @click="handleParent">向子组件传递数据</button>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'
import store from './store'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleParent () {
      store.commit('setData', '父组件传递的数据')
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件接收到的数据:{
   
   { childData }}
  </div>
</template>

<script>
import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState(['data']),
    childData () {
      return this.data + ',子组件加工处理后的数据'
    }
  }
}
</script>

$refs propriedade

O componente pai pode obter a instância do componente filho por meio de $refs e acessar as propriedades e métodos do componente filho.

componente pai:

<template>
  <div>
    <button @click="handleParent">向子组件传递数据</button>
    <child-component ref="child"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleParent () {
      this.$refs.child.childData = '父组件修改的数据'
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件接收到的数据:{
   
   { childData }}
  </div>
</template>

<script>
export default {
  data () {
    return {
      childData: '子组件原始数据'
    }
  }
}
</script>

$propriedade pai

Os componentes filho podem obter a instância do componente pai por meio de $parent e, em seguida, acessar as propriedades e métodos do componente pai.

componente pai:

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data () {
    return {
      parentData: '父组件数据'
    }
  },
  methods: {
    handleParent () {
      console.log('父组件的方法')
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    <button @click="handleChild">调用父组件方法</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleChild () {
      console.log(this.$parent.parentData)
      this.$parent.handleParent()
    }
  }
}
</script>

propriedade $root

Os subcomponentes podem obter a instância do componente raiz por meio de $root e, em seguida, acessar as propriedades e métodos do componente raiz.

componente raiz:

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  mounted () {
    console.log('根组件的数据:' + this.rootData)
    this.rootMethod()
  },
  data () {
    return {
      rootData: '根组件的数据'
    }
  },
  methods: {
    rootMethod () {
      console.log('根组件的方法')
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    子组件
  </div>
</template>

<script>
export default {
  mounted () {
    console.log('根组件的数据:' + this.$root.rootData)
    this.$root.rootMethod()
  }
}
</script>

fornecer / injetar (avançado)

provide / inject permite que os componentes ancestrais injetem uma dependência em todos os componentes descendentes, permitindo que esses componentes usem a mesma injeção de dependência.

Componente ancestral:

<template>
  <div>
    <child-component></child-component>
    <grand-child></grand-child>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'
import GrandChild from './GrandChild.vue'

export default {
  components: {
    ChildComponent,
    GrandChild
  },
  provide: {
    sharedObj: {
      message: '这是祖先组件注入的对象'
    }
  }
}
</script>

Componentes filhos diretos:

<template>
  <div>
    子组件
  </div>
</template>

<script>
export default {
  inject: ['sharedObj']
}
</script>

Subcomponentes indiretos:

<template>
  <div>
    子组件接收到的数据:{
   
   { childData }}
  </div>
</template>

<script>
export default {
  inject: ['sharedObj'],
  computed: {
    childData () {
      return this.sharedObj.message + ',子组件加工处理后的数据'
    }
  }
}
</script>

fornecer / injetar + Vuex (avançado)

Use provide/inject para injetar uma instância do Vuex para que todos os componentes usem a mesma instância do Vuex.

loja.js:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    data: '共享的数据'
  },
  mutations: {
    setData (state, data) {
      state.data = data
    }
  }
})

componente raiz:

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'
import store from './store'

export default {
  components: {
    ChildComponent
  },
  provide () {
    return {
      store
    }
  }
}
</script>

Subcomponentes e netos:

<template>
  <div>
    组件接收到的数据:{
   
   { componentData }}
  </div>
</template>

<script>
export default {
  inject: {
    store: {
      default: null
    }
  },
  computed: {
    componentData () {
      return this.store.state.data + ',组件加工处理后的数据'
    }
  }
}
</script>

evento personalizado

Use vm.$on(eventName, callback)ouvintes de eventos, use vm.$emit(eventName, ...args)eventos de gatilho.

componente pai:

<template>
  <div>
    <child-component @custom-event="handleCustomEvent"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleCustomEvent (data) {
      console.log('父组件接收到的数据:' + data)
    }
  }
}
</script>

Submontagem:

<template>
  <div>
    <button @click="handleClick">点击触发事件</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick () {
      this.$emit('custom-event', '子组件传递的数据')
    }
  }
}
</script>

Comunicação entre componentes irmãos

Use uma instância Vue vazia como um barramento de eventos, envie eventos para o barramento de eventos por um lado e ouça os eventos por outro.

EventBus.js:

import Vue from 'vue'
export const EventBus = new Vue()

Componente A:

<template>
  <div>
    <button @click="handleClick">向组件B传递数据</button>
  </div>
</template>

<script>
import { EventBus } from './EventBus'

export default {
  methods: {
    handleClick () {
      EventBus.$emit('event', '组件A传递的数据')
    }
  }
}
</script>

Componente B:

<template>
  <div>
    组件B接收到的数据:{
   
   { data }}
  </div>
</template>

<script>
import { EventBus } from './EventBus'

export default {
  data () {
    return {
      data: ''
    }
  },
  mounted () {
    EventBus.$on('event', data => {
      this.data = data
    })
  }
}
</script>

localStorage (cache do navegador)

Use o cache do navegador para armazenar dados, armazenar e ouvir os dados no cache em componentes que precisam se comunicar.

Componente A:

<template>
  <div>
    <button @click="handleClick">向组件B传递数据</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick () {
      localStorage.setItem('data', '组件A传递的数据')
    }
  }
}
</script>

Componente B:

<template>
  <div>
    组件B接收到的数据:{
   
   { data }}
  </div>
</template>

<script>
export default {
  data () {
    return {
      data: ''
    }
  },
  mounted () {
    window.addEventListener('storage', this.handleStorageUpdate)
    this.updateData()
  },
  beforeDestroy () {
    window.removeEventListener('storage', this.handleStorageUpdate)
  },
  methods: {
    handleStorageUpdate (event) {
      if (event.key === 'data') {
        this.updateData()
      }
    },
    updateData () {
      this.data = localStorage.getItem('data') || ''
    }
  }
}
</script>

Publicar modo Assinar (Pub/Sub)

Usando um centro de mensagens, os assinantes inscrevem mensagens no centro de mensagens, os publicadores publicam mensagens no centro de mensagens e o centro de mensagens notifica todos os assinantes da mensagem.

Central de mensagens:

// PubSub.js
export const PubSub = {
  events: {},
  subscribe (event, callback) {
    if (!this.events[event]) {
      this.events[event] = []
    }
    this.events[event].push(callback)
  },
  publish (event, data) {
    if (!this.events[event]) {
      this.events[event] = []
    }
    this.events[event].forEach(callback => callback(data))
  }
}

Componente A:

<template>
  <div>
    <button @click="handleClick">向组件B传递数据</button>
  </div>
</template>

<script>
import { PubSub } from './PubSub'

export default {
  methods: {
    handleClick () {
      PubSub.publish('event', '组件A传递的数据')
    }
  }
}
</script>

Componente B:

<template>
  <div>
    组件B接收到的数据:{
   
   { data }}
  </div>
</template>

<script>
import { PubSub } from './PubSub'

export default {
  data () {
    return {
      data: ''
    }
  },
  mounted () {
    PubSub.subscribe('event', data => {
      this.data = data
    })
  }
}
</script>

WebSocket (Avançado)

Use o protocolo WebSocket para realizar a comunicação em tempo real, conectar todos os componentes ao mesmo servidor WebSocket e realizar a comunicação enviando mensagens.

Conecte-se ao servidor WebSocket:

const ws = new WebSocket('ws://localhost:3000')

ws.onopen = function () {
  console.log('WebSocket已连接')
}

ws.onclose = function () {
  console.log('WebSocket已关闭')
}

ws.onerror = function () {
  console.log('WebSocket出错')
}

Componente A:

<template>
  <div>
    <button @click="handleClick">向组件B传递数据</button>
  </div>
</template>

<script>
const ws = new WebSocket('ws://localhost:3000')

export default {
  methods: {
    handleClick () {
      ws.send('组件A传递的数据')
    }
  }
}
</script>

Componente B:

<template>
  <div>
    组件B接收到的数据:{
   
   { data }}
  </div>
</template>

<script>
const ws = new WebSocket('ws://localhost:3000')

export default {
  data () {
    return {
      data: ''
    }
  },
  mounted () {
    ws.onmessage = event => {
      this.data = event.data
    }
  }
}
</script>

Parâmetros de Rota (Avançado)

O uso de parâmetros de roteamento para passar dados geralmente é adequado para comunicação entre componentes pai e filho ou entre componentes irmãos.

componente pai:

<template>
  <div>
    点击以下链接可以传递数据:<br>
    <router-link :to="{ name: 'child', params: { data: '父组件传递的数据' } }">传递数据到子组件</router-link>
  </div>
</template>

Submontagem:

<template>
  <div>
    子组件接收到的数据:{
   
   { $route.params.data }}
  </div>
</template>

<script>
export default {
  mounted () {
    console.log('子组件接收到的数据:' + this.$route.params.data)
  }
}
</script>

Componentes irmãos:

<template>
  <div>
    兄弟组件接收到的数据:{
   
   { $route.params.data }}
  </div>
</template>

<script>
export default {
  mounted () {
    console.log('兄弟组件接收到的数据:' + this.$route.params.data)
  }
}
</script>

Gerenciamento de estado Vuex (avançado)

Use o Vuex para gerenciar o estado público e os componentes se comunicam por meio do Vuex.

loja.js:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    data: '共享的数据'
  },
  mutations: {
    setData (state, data) {
      state.data = data
    }
  }
})

Componente A:

<template>
  <div>
    <button @click="handleClick">向组件B传递数据</button>
  </div>
</template>

<script>
import store from './store'

export default {
  methods: {
    handleClick () {
      store.commit('setData', '组件A传递的数据')
    }
  }
}
</script>

Componente B:

<template>
  <div>
    组件B接收到的数据:{
   
   { data }}
  </div>
</template>

<script>
import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState(['data'])
  },
  mounted () {
    console.log('组件B接收到的数据:' + this.data)
  }
}
</script>

Barramento de Eventos (Avançado)

Usando uma instância Vue vazia como o barramento de eventos, o componente A passa os dados para o componente B através do barramento de eventos.

Ônibus do evento:

// EventBus.js
import Vue from 'vue'
export const EventBus = new Vue()

Componente A:

<template>
  <div>
    <button @click="handleClick">向组件B传递数据</button>
  </div>
</template>

<script>
import { EventBus } from './EventBus'

export default {
  methods: {
    handleClick () {
      EventBus.$emit('event', '组件A传递的数据')
    }
  }
}
</script>

Componente B:

<template>
  <div>
    组件B接收到的数据:{
   
   { data }}
  </div>
</template>

<script>
import { EventBus } from './EventBus'

export default {
  data () {
    return {
      data: ''
    }
  },
  mounted () {
    EventBus.$on('event', data => {
      this.data = data
    })
  }
}
</script>

3. Recomendações de alta qualidade no passado

O plug-in mais completo e prático para VSCode (VIP Collection Edition)
Vue Super Detailing Finishing (VIP Collection Edition)
Explicação detalhada do criado, montado e atualizado no Vue
Um artigo para começar rapidamente com Echarts (atualizado continuamente)
Resumo de vários tipos de extensões de item de dados el-table no Vue (atualizado continuamente)

Por favor, goste se for útil e desenvolva um bom hábito!

Por favor, deixe uma mensagem para perguntas, trocas e encorajamento!

Acho que você gosta

Origin blog.csdn.net/libusi001/article/details/131668644
Recomendado
Clasificación