本篇的组件通信不涉及vuex
1、父子组件通信props&emit
vue3中的
defineProps
和defineEmits
不用引入,可以直接使用
父组件
<template>
<Son tip="fatherData" @clickFather = handleClick></Son>
</template>
<script setup>
// 导入子组件
import Son from './son.vue'
// 接收子组件事件传递来的数据
const handleClick = (data) => {
console.log(data);
}
<script>
子组件
<template>
<el-tag type="success">{{tip}}</el-tag>
<el-button type='primary' @click="clickSon">子组件</el-button>
</template>
<script setup>
// 接收父组件传来的数据
defineProps({
tip:String
})
const emit = defineEmits(['clickFather'])
const clickSon = () => {
emit('clickFather', '子组件传过来的数据')
}
<script>
2、跨级通信provide&inject
当组件的深度比较大的时候,用父子之间的通信需要层层传递,不优雅。
演示需要依旧使用父子组件,三级组件可以自己试试
// 父组件
<template>
<Son tip="fatherData" @clickFather = handleClick></Son>
</template>
<script setup>
// 导入reactive,provide
import { reactive, provide } from 'vue'
// 导入子组件
import Son from './son.vue'
// 接收子组件事件传递来的数据
const handleClick = (data) => {
console.log(data);
}
// 传递静态数据
provide('geolocation', {
longitude: 90,
latitude: 135
})
// 传递响应式数据,注意这里的provide一定要写在响应式数据的后面
const state = reactive({ count: 0 })
provide( 'count',state)
// 这样会报错
// provide( 'count',state)
// const state = reactive({ count: 0 })
<script>
子组件
<template>
<el-tag type="success">{{tip}}</el-tag>
<el-tag type="success" @click="handle">{{inject2.count}}</el-tag>
<el-button type='primary' @click="clickSon">子组件</el-button>
</template>
<script setup>
import { inject } from 'vue'
// 接收父组件传来的数据
defineProps({
tip:String
})
const inject1 = inject('geolocation')
console.log(inject1);
const inject2 = inject('count')
const handle = () => {
inject2.count++
}
<script>