当前位置: 首页 > news >正文

2.4 组件通信

 Props 和 Events(父子组件通信)

  • Props:父组件向子组件传递数据使用 props。子组件通过声明 props 来接收来自父组件的数据。

    <!-- 父组件 -->
    <template><ChildComponent :message="parentMessage" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {parentMessage: 'Hello from parent'};}
    };
    </script>
    <!-- 子组件 -->
    <template><div>{{ message }}</div>
    </template><script>
    export default {props: ['message']
    };
    </script>
  • Events:子组件向父组件发送消息或数据可以使用 $emit 方法触发自定义事件。

    <!-- 子组件 -->
    <template><button @click="sendMessage">Send Message</button>
    </template><script>
    export default {methods: {sendMessage() {this.$emit('childEvent', 'Hello from child');}}
    };
    </script>
    <!-- 父组件 -->
    <template><ChildComponent @childEvent="handleChildEvent" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {handleChildEvent(message) {console.log(message);}}
    };
    </script>

ChildComponent.vue,它需要向父组件发送两个参数:messagestatus

<template><button @click="sendDataToParent">Send Data to Parent</button>
</template><script>
export default {data() {return {message: 'Hello from Child',status: 'success'};},methods: {sendDataToParent() {// 使用 $emit 触发自定义事件,并传递多个参数this.$emit('dataFromChild', this.message, this.status);}}
};
</script>

在这个例子中,当按钮被点击时,会调用 sendDataToChild 方法,该方法使用 $emit 来触发名为 dataFromChild 的自定义事件,并传递了两个参数:this.messagethis.status

父组件代码

接下来,在父组件中引入 ChildComponent 并监听 dataFromChild 事件。

<template><div><!-- 监听来自子组件的自定义事件 --><ChildComponent @dataFromChild="handleDataFromChild" /></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {handleDataFromChild(message, status) {console.log('Message:', message); // 输出: Hello from Childconsole.log('Status:', status);   // 输出: success// 在这里处理接收到的数据}}
};
</script>

在这个父组件的例子中,@dataFromChild="handleDataFromChild" 表示监听子组件发出的 dataFromChild 事件,并在事件发生时调用 handleDataFromChild 方法。此方法接收子组件传递过来的参数(在这个例子中是 messagestatus),然后可以根据业务需求对这些数据进行处理。

这种方法可以让你轻松地在子组件和父组件之间传递任意数量的参数。只需要确保在 $emit 调用时传递正确的参数,并在父组件的方法中正确接收它们即可

父组件在监听子组件事件的同时,还需要传递自己的参数

  • 子组件通过 $emit 触发事件,传递自己的数据(如:childData)。
  • 父组件监听该事件,同时还想传入自己的参数(如:parentIdcategory 等)。
  • 最终父组件的处理函数需要 同时拿到子组件的数据 + 父组件自己的参数

 方法一:使用内联箭头函数(推荐)

这是最清晰、最常用的方式。

<!-- 父组件 ParentComponent.vue -->
<template><div><!-- 使用箭头函数包装,同时传入父组件参数 --><ChildComponent@dataFromChild="(childData) => handleData(childData, parentId, 'user')"/></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {parentId: 1001,};},methods: {handleData(childData, parentId, type) {console.log('来自子组件的数据:', childData);console.log('父组件自己的参数:', parentId, type);// 处理逻辑...}}
};
</script>

✅ 优点:语义清晰,支持传任意多个父参数。


 方法二:使用包装函数(命名函数)

如果你不想用内联箭头函数,也可以封装一个中间函数。

<template><ChildComponent @dataFromChild="wrapperHandler" />
</template><script>
export default {data() {return {parentId: 1001,};},methods: {wrapperHandler(childData) {// 在这里调用真正的处理函数,并传入父组件参数this.handleData(childData, this.parentId, 'admin');},handleData(childData, parentId, role) {console.log(childData, parentId, role);}}
};
</script>

✅ 优点:逻辑分离,适合复杂逻辑。


✅ 方法三:使用 $event 隐式变量(传统方式)

Vue 会把 $emit 的第一个参数自动传给监听函数,可以用 $event 接收。

<template><ChildComponent @dataFromChild="handleData($event, parentId, 'guest')" />
</template><script>
export default {data() {return {parentId: 1001,};},methods: {handleData(childData, parentId, userType) {console.log(childData, parentId, userType);}}
};
</script>

⚠️ 注意:$event 是子组件 $emit 传递的第一个参数。如果有多个参数,$event 只是第一个。如果要传递多个,可以把参数包装成一个对象.

<!-- ChildComponent.vue -->
<template><button @click="sendData">Send Data</button>
</template><script>
export default {methods: {sendData() {this.$emit('dataFromChild', {name: 'Alice',age: 25});}}
};
</script>

✅ 总结

方法说明推荐度
内联箭头函数 (data) => handler(data, param)最灵活,推荐⭐⭐⭐⭐⭐
包装函数逻辑清晰,适合复杂处理⭐⭐⭐⭐☆
$event + 参数传统写法,稍显隐晦⭐⭐⭐☆☆

http://www.xdnf.cn/news/1244773.html

相关文章:

  • deepseek、GPT与claude在MATLAB编程上的准确性对比——以卡尔曼滤波调试为例
  • 大模型之后,机器人正在等待它的“GPT-1 时刻”
  • 本机部署K8S集群
  • 力扣:2246. 相邻字符不同的最长路径
  • ESP-idf框架下的HTTP服务器\HTML 485温湿度采集并长传
  • 14.Home-新鲜好物和人气推荐实现
  • 编程算法:技术创新与业务增长的核心引擎
  • Linux操作系统从入门到实战(十三)版本控制器Git基础概念讲解
  • 深入浅出 RabbitMQ-路由模式详解
  • 自由学习记录(77)
  • 24. 前端-js框架-Vue
  • vite面试题及详细答案120题(01-30)
  • 【工程化】tree-shaking 的作用以及配置
  • 研发团队看板协作中的自动化实践:集成CI/CD与任务流转
  • 【Linux系统】进程间通信:基于匿名管道实现进程池
  • linux_https,udp,tcp协议(更新中)
  • C语言基础_随机数、数组、函数、指针
  • 【机器学习深度学习】模型压缩简介
  • C++ - 基于多设计模式下的同步异步日志系统(11w字)
  • NLP——BERT模型全面解析:从基础架构到优化演进
  • AWS EKS节点扩容时NLB与Ingress的故障处理与优化方案
  • LSTM + 自注意力机制:精准预测天气变化的创新方案
  • 深入剖析 RAG 检索系统中的召回方式:BM25、向量召回、混合策略全解析
  • JS-第二十一天-尺寸位置
  • Android UI 组件系列(十一):RecyclerView 多类型布局与数据刷新实战
  • AI 对话高效输入指令攻略(四):AI+Apache ECharts:生成各种专业图表
  • 【学习笔记】Manipulate-Anything(基于视觉-语言模型的机器人自动化操控系统)
  • 【09】C++实战篇——C++ 生成静态库.lib 及 C++调用lib,及实际项目中的使用技巧
  • javacc学习笔记 02、JavaCC 语法描述文件的格式解析
  • Druid手写核心实现案例 实现一个简单Select 解析,包含Lexer、Parser、AstNode