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

组件之间的信息传递的四种方法!!【vue3 前端】

迎万难 赢万难!

目录

  • 1. 使用 defineProps 传递数据:
  • 2. 使用。defineEmits 发送事件:
  • 3. 使用 Provide / Inject:
  • 4. 使用状态管理(如 Pinia):

1. 使用 defineProps 传递数据:

父组件通过 props 将数据传递给子组件,子组件使用 defineProps 接收这些数据。

父组件:

<!-- ParentComponent.vue -->
<template><div><ChildComponent :message="parentMessage" /></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';const parentMessage = 'Hello from Parent!';
</script>

子组件:

<!-- ChildComponent.vue -->
<template><div>{{ message }}</div>
</template><script setup>
const props = defineProps(['message']);
</script>

2. 使用。defineEmits 发送事件:

子组件可以通过 defineEmits 定义要发送的事件,父组件通过 v-on 或 @ 监听这些事件。

父组件:

<!-- ParentComponent.vue -->
<template><div><ChildComponent @childEvent="handleChildEvent" /></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';const handleChildEvent = (payload) => {console.log('Received from child:', payload);
};
</script>

子组件:

<!-- ChildComponent.vue -->
<template><button @click="sendToParent">Send to Parent</button>
</template><script setup>
const emit = defineEmits(['childEvent']);const sendToParent = () => {emit('childEvent', 'Hello from Child!');
};
</script>

3. 使用 Provide / Inject:

使用 provide 和 inject 也可以在祖先组件与后代组件之间传递数据。

祖辈组件:

<!-- GrandparentComponent.vue -->
<template><div><ParentComponent /></div>
</template><script setup>
import ParentComponent from './ParentComponent.vue';const sharedData = 'Hello from Grandparent!';
provide('sharedData', sharedData);
</script>

父组件:

<!-- ParentComponent.vue -->
<template><div><ChildComponent /></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';
</script>

子组件:

<!-- ChildComponent.vue -->
<template><div>{{ sharedData }}</div>
</template><script setup>
const sharedData = inject('sharedData');
</script>

4. 使用状态管理(如 Pinia):

使用状态管理库(如 Pinia)可以在多个组件之间共享状态。 所有组件之间都可以共享,下面的例子是父子组件。

# 安装 Pinia
npm install pinia

store.js:

<!-- store.js -->
import { defineStore } from 'pinia';export const useStore = defineStore('main', {state: () => ({message: 'Hello from Store!',}),actions: {updateMessage(newMessage) {this.message = newMessage;},},
});

父组件:

<!-- ParentComponent.vue -->
<template><div><ChildComponent /><button @click="updateMessage">Update Message</button></div>
</template><script setup>
import { useStore } from './store';
import ChildComponent from './ChildComponent.vue';const store = useStore();const updateMessage = () => {store.updateMessage('New message from Parent!');
};
</script>

子组件:

<!-- ChildComponent.vue -->
<template><div>{{ store.message }}</div>
</template><script setup>
import { useStore } from './store';const store = useStore();
</script>

相关文章:

  • 自然语言处理之机器翻译:Statistical Machine Translation(SMT)的评估方法解析与创新实践
  • 从零开始开发一个简易的五子棋游戏:使用 HTML、CSS 和 JavaScript 实现双人对战
  • 3、Linux操作系统下,linux的技术手册使用(man)
  • 杨洋出席青岛啤酒白啤品牌活动 共赴生活美学之旅
  • 高自由度与多功能指尖设计:Allegro灵巧手V5(4F Plus)的技术亮点
  • CSS元素动画篇:基于当前位置的变换动画(四)
  • 技术分享 | Oracle-RAC修改IP信息
  • 【博客系统】博客系统第一弹:博客系统项目配置、MyBatis-Plus 实现 Mapper 接口、处理项目公共模块:统一返回结果、统一异常处理
  • 如何将数据输入到神经网络中
  • 小刚说C语言刷题——1320时钟旋转
  • AIGC(生成式AI)试用 32 -- AI做软件程序测试 3
  • 疑难解析 | 解决金仓数据库中securecmdd服务连接报错“Permission denied“问题
  • 初步自定义layui的table(laravel 12)
  • C盘清理实用技巧整理
  • [创业之路-341]:华为人力资源管理 - 华为技术专家体系详解
  • final static 中是什么final static联合使用呢
  • matlab simulink中理想变压激磁电流容易有直流偏置的原因分析。
  • shell脚本部署disu博客
  • 多视觉编码器协同与高低分辨率特征融合技术综述
  • Docker小游戏 | 使用Docker部署文字修仙网页小游戏
  • 最近这75年,谁建造了上海?
  • 上海第三家“胖永辉”在浦东开业,设立了外贸产品专区
  • 黄永年:说狄仁杰的奏毁淫祠
  • 专访|伊朗学者:美伊核谈不只是改革派立场,但伊朗不信任美国
  • 第一集丨《无尽的尽头》值得关注,《榜上佳婿》平平无奇
  • 哈马斯同意释放剩余所有以色列方面被扣押人员,以换取停火五年