Loading

Vue3父子组件通信

在写vue项目的时候,组件间通信是十分重要的

举个例子

image-20240510214911112

这是一个header组件,点击登录会弹出login组件

login组件是集成在header组件里面的,也就是说header是login的父组件

在header组件中是通过showLogin变量来控制login组件是否显示的

我的需求是点击登录显示登陆组件,登录成功或者点击X关闭login组件

以点击X为例

这个操作是在子组件login中执行的,这时候就需要用到父子组件通信中的子传父

Prop方式

Emit方式

emit方式也是Vue中最常见的组件通信方式,该方式用于子传父;

根据上面的例子,我需要从子组件传递一个false给父组件,以此关闭登录框

image-20240510215753125

子组件代码(login)

// 1.导入 defineEmits
import {defineEmits} from "vue";

// 2.定义emit对象 这里的closeLogin是父组件的自定义事件
const emits = defineEmits(['closeLogin'])

// 3.给关闭按钮绑定点击事件
<Close @click="closeLogin"/>
    
// 4.定义点击事件的closeLogin函数
const closeLogin = () => {
  // 这样写的意思就是 当closeLogin触发的时候,就会触发父组件的closeLogin事件
  // 第二个参数 就是子组件传给父组件的参数
  emits('closeLogin', false)
}

父组件代码(header)

image-20240510220404385

// 1.在子组件标签上自定义事件
<Login v-if="loginShow" @closeLogin="closeLogin"></Login>

// 2.定义closeLogin函数 这个bool就是子组件传来的参数
const closeLogin = (bool) => {
  loginShow.value = bool
}

总结

总的来说,要实现子传父

父组件需要在子组件的标签上自定义事件,并且绑定一个函数

子组件需要得到一个emit对象,并且传入父组件的自定义事件

在子组件的某个方法中通过emit(事件名,参数)调用父组件的自定义事件对应的函数,并且传入参数

posted @ 2024-05-10 22:12  HuangQiaoqi  阅读(45)  评论(0编辑  收藏  举报