vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?

在 Vue 中,Mitt 和 Pinia 是两个不同的工具,它们的主要用途和功能有所不同,但在某些方面也存在重合的部分。

在这里插入图片描述

区别

Mitt:

Mitt 是一个简单而强大的事件总线库,用于在组件之间进行事件的发布和订阅。
它提供了一种简洁的方式来实现组件之间的通信,而无需借助 Pinia 或其他状态管理库。
使用方式类似于 Vue 2 的 EventBus,但在 Vue 3 中没有内置的 EventBus,因此需要通过第三方库如 mitt 来实现。

Pinia:

Pinia 是 Vue 的状态管理库,它允许您跨组件/页面共享状态。
Pinia 是 Vuex 的现代替代方案,提供了更简洁的 API 和更好的 TypeScript 支持。
它基于 Vue 的响应式系统实现,没有任何依赖,相较于 Vuex,Pinia 的代码量更小,运行更快。

pinia有永久化的需求

主要用途

Mitt:

主要用于组件之间的事件通信,例如在没有直接父子或兄弟关系的组件之间传递数据。
适用于需要在多个地方进行事件管理的小型项目或特定场景。

Pinia:

主要用于管理 Vue 应用中的全局状态,确保不同组件之间可以共享和管理状态。
适用于复杂的单页应用,特别是当状态管理需求较大时。

代码

Mitt:

# install
npm i mitt

案例中所用路径仅为参考

// utils/emitter.js
import mitt from "mitt"
const emitter = mitt()
export default emitter

// father.vue
<script setup>
import son1 from "son1.vue"
import son2 from "son2.vue"
</script>
<template>
	<!--本案例中先加载监听者son2才能监听到son1发送的内容-->
	<!--实际使用时可选择点击事件发送,那么就不需要考虑先后-->
	<son2 />
	<son1 />
</template>

// son1.vue
<template>
	...
</template>
<script setup>
import emitter from "../utils/emitter"
emitter.emit('p1','发送一个参数')
</script>

// son2.vue
<template>
	...
</template>
<script setup>
import emitter from "../utils/emitter.js"
emitter.on('p1',(msg)=>{console.log(msg)})
</script>

Pinia:

# install
npm i pinia

案例中所用路径仅为参考

// main.js
import { createApp } from 'vue'
import App from './App.vue'

import {createPinia} from "pinia"
const pinia = createPinia()
// 第一种写法:createApp(App).use(pinia).mount("#app")
// 第二种写法:
const app = createApp(App)
app.use(pinia) //方便以后加载其它工具
app.mount("#app")

// store/User.js
import {defineStore} from "pinia"
// 以下是选项式写法,还有更简便的组合式写法
export const useUserStore = defineStore('user',{
	// 定义数据
	state(){
		return {
			name: 'a',
			data:{
				title: 'b',
				num: 12
			}
		}
	},
	// 安全起见:提供包装数据的方法
	getters(){},
	// 安全起见:提供修改数据的方法
	actions(){}
})

// 获取及修改数据
// a.vue
<template>
...
</template>
<script setup>
import {useUserStore} from "../store/user.js"
const userStore = useUserStore()

// 获取
console.log(userStore.name)
console.log(userStore.data)

// 直接修改(官方不建议)
userStore.name = 'c'
// 直接批量修改(官方不建议)
userStore.$patch({
	name: 'd',
	data: {
		title: 'e',
		num: 13
	}
})
</script>

重合的部分

虽然 Mitt 和 Pinia 的主要用途不完全相同,但它们在某些方面确实存在重合的部分。

  • 例如,在一些小项目中,如果只是需要简单的事件通信,那么可以使用 Mitt 来实现;
  • 但如果项目逐渐变得复杂,需要管理更多的状态和逻辑,那么可能会考虑使用 Pinia 来替代或补充 Mitt。
  • 此外,Mitt 也可以与 Pinia 一起使用,以实现更复杂的状态管理和事件通信机制。
Vue3 中的 `mitt` `Pinia` 都是用来处理状态管理事件通信的工具,但它们的功能应用场景有所不同。 ### Vue3 Mitt Mitt 是一个超轻量级的事件总线库,它提供了一种简单的方式来管理全局事件。通过 mitt,你可以订阅、发布取消订阅自定义事件。 - **特点**: - 简单易用:只包含几个核心函数。 - 轻量化:体积非常小。 - **基本使用**: ```javascript import mitt from &#39;mitt&#39;; const emitter = mitt(); // 订阅事件 emitter.on(&#39;event-name&#39;, (data) => { console.log(data); }); // 发布事件 emitter.emit(&#39;event-name&#39;, { message: &#39;Hello world!&#39; }); // 取消订阅事件 emitter.off(&#39;event-name&#39;); ``` --- ### Pinia PiniaVue 官方推荐的状态管理库,用于替代 Vuex 的新一代解决方案。它是专门为 Vue.js 设计的,语法更简洁,并且充分利用了 ES6+ 特性 Composition API。 - **特点**: - 更加直观灵活的状态管理模式。 - 支持 TypeScript 开箱即用。 - 提供响应式 state、getters actions。 - **基本使用**: ```javascript import { createPinia, defineStore } from &#39;pinia&#39;; import { ref } from &#39;vue&#39;; const pinia = createPinia(); // 创建 Pinia 实例 export const useCounterStore = defineStore(&#39;counter&#39;, () => { const count = ref(0); function increment() { count.value++; } return { count, increment }; }); // 使用 Store const counterStore = useCounterStore(); console.log(counterStore.count); // 输出当前值 counterStore.increment(); // 增加数值 ``` --- 两者的主要区别在于用途: - 如果只是需要简单的组件通信或者事件触发机制,则可以使用 `mitt`。 - 对于复杂的应用场景,涉及到全局共享数据以及复杂的业务逻辑时,建议选择功能更为强大的 `Pinia` 来管理应用的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值