父传子

父组件:

<template>
<div class="son">
<son1 :toChild="toChild" />
</div>
</template>
<script>
import { reactive, toRefs } from 'vue'
import son1 from './branch/son1.vue'
export default {
components: {
son1
},
setup(props,context) {
const data = reactive({
toChild: '传递数据1'
})

return {
...toRefs(data)
}
}
}
</script>

子组件

// 第一种-------------------配置setup-------------------
<script>
export default {
props: { //这里必须写,不然setup中的props也拿不到
toChild: {
type: String,
default: '无数据'
}
},
setup(props, context) {
console.log(props.toChild) // 传递数据1
return {};
},
};
</script>

// 第二种------------------setup语法糖--------------------
<script setup>
const props = defineProps({
name: {
type: String,
default: ''
}
})
</script>

 注意:defineProps只能直接暴露在setup下,不能放在回调中。不需要引入,直接调用即可

子传父

 子组件

// 第一种-----------------配置setup---------------------
<script>
import { ref } from "vue";
export default {
setup(props, context) {
const { emit } = context
const msg = ref('999')
// 子传父
const send = () => {
emit('sonSend',msg)
}
return {
msg,
send
};
},
};
</script>

// 第二种-----------------setup语法糖----------------------
<script setup>
const emit = defineEmits(['sonSend'])
const btnClick = () => {
emit('sonSend', '999')
}
</script>

 注意:defineEmits只能直接暴露在setup下,不能放在回调中。不需要引入,直接调用即可.同defineProps

父组件

<template>
<div class="son">
<son1 @sonSend="sonSend" /> //监听子组件的自定义事件
</div>
</template>
<script>
import son1 from './branch/son1.vue'
export default {
components: {
son1
},
setup(props,context) {
const sonSend = (val) => {
console.log(val.value) // 999
}
return {
sonSend
}
}
}
</script>

兄弟之间传值

vue2 我们通过EventBus   new Vue的方式来实现。Vue3 中没有了 EventBus 跨组件通信,但是现在有了一个替代的方案 mitt.js,原理还是 EventBus

1.安装mitt

npm install mitt --save 

2. 新建 bus.js

bus.js 

import mitt from 'mitt'

const bus = mitt()

export default bus

 然后直接引用就可以了

兄弟组件1

<template>
<button @click="btn">我是兄弟组件b</button>
</template>

import bus from '@/utils/bus'
function btn() {
bus.emit("fromBother", '传给好兄弟'); //参数一为自定义事件名称,参数二是传递的参数
}
return{
btn
}

 兄弟组件2

import bus from '@/utils/bus'
import { onUnmounted } from "vue"

setup(props,context) {
function fromBother(val) {
console.log(val,'val--->>>兄弟传过来')
}
onMounted(() => {
bus.on('fromBother',fromBother) //监听兄弟组件传过来的值
})
onUnmounted(() => { //销毁的时候 解绑
bus.off('fromBother',fromBother)
})
return {}
}