Vue中的props、slot、emit、proProvide/Inject的区别即使用场景

vue3中能通过props、slot、emit、proProvide/Inject来进行数据的传递,那么到底用哪个好呢?我觉得proProvide/Inject是最简单的方式,那么还需要用porps、slot、emit吗

其实除了这些东西,还有一种办法,就是直接创建一个js文件:

假如我们有一个这样的需求:

实现点击按钮时会触发两个count都++  也就是两个组件的部分数据或函数都是同一个,要实现这样的操作,我们常常 这样做:

直接创建了一个js文件写vue的代码,然后js代码又没有vue组件的功能搞template什么的  所以只有script中的部分功能  刚好用来将多个数据绑定在一起,

将专门用来export的js文件放在store文件夹下,然后在需要绑定同一个数据或函数的vue组件中导入并使用即可

Vue 中,$emit、pinia、props、provide/inject 均可用于组件间通信。 `$emit` 用于子组件向父组件发送自定义事件和数据。子组件通过 `$emit` 触发一个自定义事件,父组件监听该事件并执行相应的处理函数。示例代码如下: ```vue <!-- 子组件 --> <template> <button @click="$emit('custom-event', 'Hello from child')">触发事件</button> </template> <!-- 父组件 --> <template> <ChildComponent @custom-event="handleEvent" /> </template> <script> export default { methods: { handleEvent(data) { console.log(data); // 输出: Hello from child } } } </script> ``` `props` 用于父组件向子组件传递数据。父组件通过在子组件标签上绑定属性,子组件通过 `props` 选项接收这些属性。示例代码如下: ```vue <!-- 父组件 --> <template> <ChildComponent :message="parentMessage" /> </template> <script> export default { data() { return { parentMessage: 'Hello from parent' }; } } </script> <!-- 子组件 --> <template> <p>{{ message }}</p> </template> <script> export default { props: ['message'] } </script> ``` `provide/inject` 用于实现跨层级组件间的通信,即祖先组件向后代组件传递数据。祖先组件通过 `provide` 选项提供数据,后代组件通过 `inject` 选项注入这些数据。示例代码如下: ```vue <!-- 祖先组件 --> <template> <ChildComponent /> </template> <script> export default { provide: { sharedData: 'Shared data from ancestor' } } </script> <!-- 后代组件 --> <template> <p>{{ sharedData }}</p> </template> <script> export default { inject: ['sharedData'] } </script> ``` `pinia` 是一个 Vue 的状态管理库,可用于管理应用中的全局状态,实现任意组件间的通信。它将应用的状态集中管理,组件可以通过 `store` 实例来访问和修改这些状态。示例代码如下: ```javascript // 创建 store import { defineStore } from 'pinia'; export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), actions: { increment() { this.count++; } } }); // 在组件中使用 store <template> <div> <p>{{ store.count }}</p> <button @click="store.increment">增加</button> </div> </template> <script> import { useCounterStore } from './store'; export default { setup() { const store = useCounterStore(); return { store }; } } </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值