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

2.4 组件通信

 Props 和 Events(父子组件通信)

Vue 2 中,props 被设计为只读,以确保数据流从父组件到子组件的单向流动,避免不必要的数据绑定复杂性和潜在的错误。

如果要修改,需要用下边的 子组件向父组件传递参数,在父组件中根据传递过来的值,修改parentMessage的值

  • 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);//上个例子中.可以通过this.parentMessage = message //实现子组件 修改prop里的属性值  }}
    };
    </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.lryc.cn/news/611255.html

相关文章:

  • 高阶 RAG :技术体系串联与实际落地指南​
  • 计算机网络 第2章通信基础(竟成)
  • PYQT的QMessageBox使用示例
  • 深入理解 Ext 系列文件系统:从磁盘物理到文件系统原理
  • 注意点:如何使用conda创建虚拟环境并使用虚拟环境以及当安装相关库时,如何指定安装到那个环境里面 ---待看
  • LINUX-进程管理及基础管理
  • Java开发时出现的问题---并发与资源管理深层问题
  • OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具
  • day25 进程
  • FastAPI快速入门P2:与SpringBoot比较
  • 【数据结构初阶】--排序(三):冒泡排序,快速排序
  • add_key系统调用及示例
  • 《C++》继承完全指南:从入门到精通
  • 【Day 16】Linux-性能查看
  • 计算机基础:操作系统学习的基石
  • 分布式微服务--Nacos 集群部署
  • RabbitMQ延时队列的两种实现方式
  • 磁悬浮转子的“静音术”:深度解析无接触抑制旋转幽灵的奥秘
  • 基于华为开发者空间的Open WebUI数据分析与可视化实战
  • 【Linux系统编程】线程概念与控制
  • MATLAB实现菲涅尔法全息成像仿真
  • Spring Boot 整合 Web 开发全攻略
  • Java面试宝典:深入解析JVM运行时数据区
  • Linux 内存管理之 Rmap 反向映射(二)
  • EP01:【DL 第二弹】张量(Tensor)的创建和常用方法
  • BloodHound 8.0 首次亮相,在攻击路径管理方面进行了重大升级
  • IPD研发管理——决策评审DCP指南
  • Java从入门到精通 - 集合框架(一)
  • MySQL主从延迟到崩溃:Binlog格式、半同步复制与GTID的博弈
  • 视频转二维码在教育场景中的深度应用