Skip to content

组件通讯

  • props/$emit
  • vuex/pinia
  • provide/inject
  • mitt

1、Props / Emits

// Parent.vue
<template>
  <ChildComponent :parentData="parentData" @updateData="updateParentData" />
</template>
<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
const parentData = ref('initial data');
function updateParentData(newData) {
  parentData.value = newData;
}
</script>

// Child.vue
<template>
  <div>
    <p>{{ parentData }}</p>
    <button @click="updateDataToParent('new data')">Update Data</button>
  </div> 
</template>
<script setup>
import { defineProps, defineEmits } from 'vue';
const props = defineProps({
  parentData: String
});
const emit = defineEmits(['updateData']);
function updateDataToParent(newData) {
  emit('updateData', newData);
}
</script>

2、provide/inject

// Parent.vue
<script setup>
    import { provide } from "vue"
    provide("name", "RDIF")
</script>

// Child.vue
<script setup>
    import { inject } from "vue"
    const name = inject("name")
    console.log(name) // RDIF
</script>

3、mitt

// mitt.js
import mitt from 'mitt'
const mitt = mitt()
export default mitt

// 组件 A
<script setup>
import mitt from './mitt'
const handleClick = () => {
    mitt.emit('handleChange')
}
</script>

// 组件 B 
<script setup>
import mitt from './mitt'
import { onUnmounted,onMounted } from 'vue'
function someMethed(){
    alewrth('hello')
}
onMounted(()=>{
    mitt.on('handleChange',someMethed)
})
onUnmounted(()=>{
    mitt.off('handleChange',someMethed)
})
</script>