网站首页 > 技术文章 正文
在 Vue 3 中,emit 是一个用于触发自定义事件的方法,允许子组件向父组件发送消息或数据。通过 defineEmits 定义的事件列表,子组件可以明确地声明它会发出哪些事件。这不仅有助于代码的清晰性,也为工具支持(如类型推断)提供了基础。
emit 的使用
你提供的代码片段中,emit 被用来通知父组件 modelValue 的值发生了变化。具体来说:
javascript
深色版本
const emit = defineEmits(['update:modelValue', 'confirm', 'cancel']);
// 控制弹框显示状态
const visible = computed({
get() {
return props.modelValue;
},
set(value) {
emit('update:modelValue', value);
},
});
这里有两个主要部分:定义事件和使用 emit 发送事件。
1. 定义事件
javascript
深色版本
const emit = defineEmits(['update:modelValue', 'confirm', 'cancel']);
- defineEmits 是一个编译时宏,它接受一个包含事件名称的数组作为参数。在这里,你声明了三个事件:update:modelValue、confirm 和 cancel。
- 这意味着你的子组件将会触发这三个事件之一来与父组件进行通信。
2. 使用 emit 发送事件
javascript
深色版本
const visible = computed({
get() {
return props.modelValue;
},
set(value) {
emit('update:modelValue', value);
},
});
- visible 是一个计算属性,它有一个 get 方法和一个 set 方法。
- get 方法返回 props.modelValue 的当前值。这意味着每当父组件中的 v-model 值发生变化时,visible 也会随之更新。
- set 方法则在 visible 的值发生变化时被调用,并且通过 emit('update:modelValue', value) 向父组件发送一个名为 update:modelValue 的事件,同时传递新的值 value。
内在原理
当父组件使用 v-model="isPopupVisible" 绑定到 <MyPopup> 子组件时,实际上是在做两件事情:
- 绑定 Prop:将父组件中的 isPopupVisible 值作为 modelValue prop 传递给子组件。
- 监听事件:监听子组件发出的 update:modelValue 事件,并在接收到该事件时更新父组件中的 isPopupVisible 值。
因此,当你在子组件中调用 emit('update:modelValue', value) 时,实际上是通知父组件更新其 isPopupVisible 的值为 value。
具体流程
- 初始状态:父组件中的 isPopupVisible 初始值为某个布尔值(例如 false),这个值会被传递给子组件作为 modelValue。
- 用户交互:假设用户执行了一个操作(比如点击关闭按钮),导致子组件内部的 visible 值需要更新。
- 更新状态:在 visible 的 set 方法中,调用 emit('update:modelValue', value),向父组件发送一个 update:modelValue 事件并附带新的值。
- 父组件响应:父组件监听到了这个事件,并更新其 isPopupVisible 的值为新值。由于 v-model 的双向绑定机制,这一变化会自动反映在父组件的状态中。
示例
假设父组件如下:
vue
深色版本
<template>
<div>
<button @click="togglePopup">打开弹窗</button>
<MyPopup
v-model="isPopupVisible"
title="远程设置"
:options="optionsList"
:maxHeight="400"
@confirm="handleConfirm"
@cancel="handleCancel"
/>
</div>
</template>
<script setup>
import { ref } from 'vue';
import MyPopup from './path/to/MyPopup.vue'; // 替换为实际路径
const isPopupVisible = ref(false);
const optionsList = [
{ label: '选项一', selected: false },
{ label: '选项二', selected: true },
];
const togglePopup = () => {
isPopupVisible.value = !isPopupVisible.value;
};
const handleConfirm = (selectedOption) => {
console.log('确认选择:', selectedOption);
isPopupVisible.value = false; // 关闭弹窗
};
const handleCancel = () => {
console.log('取消选择');
isPopupVisible.value = false; // 关闭弹窗
};
</script>
在这个例子中:
- 当用户点击“打开弹窗”按钮时,isPopupVisible 被设置为 true,这会通过 v-model 传递给子组件,使得 visible 也变为 true,从而显示弹出层。
- 当用户在子组件中关闭弹出层时,子组件会调用 emit('update:modelValue', false),这会导致父组件中的 isPopupVisible 被更新为 false,从而隐藏弹出层。
总结
emit 在这里起到了关键作用,它使得子组件能够与父组件进行有效的通信。通过 emit('update:modelValue', value),子组件能够在自身状态发生改变时通知父组件,保持两者之间状态的一致性。这种方式不仅简化了组件间的通信,还提高了代码的可维护性和灵活性。
猜你喜欢
- 2025-10-19 22《Vue 入门教程》VueRouter 路由嵌套
- 2025-10-19 JavaScript:字符串的相关方法_javascript字符串常用方法
- 2025-10-19 Vue3开发极简入门(2):TypeScript定义对象类型
- 2025-10-19 Vue2 和 Vue3 的区别差异_vue2和vue3学哪个
- 2025-10-19 前端小白 2 周 Vue3+TS+NaiveUI 学习计划大纲
- 2025-10-19 "Java 后端 + Vue 前端" 的混合架构,开发桌面程序
- 2025-10-19 Vue3问题:如何使用WangEditor富文本?能自定义才是真的会用!
- 2025-10-19 Vue Bits - 免费开源、优雅高效的 Vue 3 动效组件库,React Bits 移植版
- 2025-10-19 Vue3 爆改 Axios !用上了 专属请求库!
- 2025-10-19 Vue 2迁移Vue 3:从响应式到性能优化
- 最近发表
-
- 用Cursor开启JAVA+AI生涯_javascirpt怎么开启
- 大数据调度服务监控平台_大数据调度是什么意思
- SpringBoot、MyBatis、Vue搭建一个Java企业应用开源框架源码分享
- 大数据技术之Flume_大数据volume的含义
- Jenkins运维之路(Slave容器节点)_jenkins slave工作原理
- 程序员自救指南:IDEA 卡成狗?我的 9G 堆内存调参表让你起飞 附避坑
- JMeter:一个简单的测试计划怎么做?
- Windows 命令行终端 PowerShell 美化计划
- JDK25即将发布!新特性概览_jdk52.0
- JDK 25 新特性极简总结(2025 年 9 月 16 日发布,LTS 长期支持)
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)