vue3 状态管理之pinia组合式API

文章介绍了Pinia状态管理库中两种主要的API——选项式API和组合式API。选项式API易于上手,但代码组织性和复用性较差,而组合式API虽然学习成本稍高,却提供了更好的逻辑复用和代码组织灵活性,支持通过组合函数实现高效的状态管理。文中通过实例展示了如何创建和使用组合式API,包括数据存储、更新以及计算属性的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pinia两种写法:选项式API组合式API
选项式 API 是在组合式 API 的基础上实现的,易于学习和使用(写代码的位置已经约定好了)。
选项式 API缺点: 代码组织性差,相似的逻辑代码不便于复用,逻辑复杂、代码多了不好阅读。虽然提供了 mixins 用来封装逻辑,但是出现数据函数覆盖的概率很大,不好维护。
关于选项是API的写法,详见我的另一篇文章–>pinia之选项式API
本篇文章,我们重点讲解组合式API组合式 API的学习成本可能会增加,需要良好的代码组织能力和拆分逻辑能力。
组合式API优点:

  1. 提供了更好的逻辑复用:能够通过“组合函数”来实现更加简洁高效的逻辑复用。“组合式函数”(-Composables) 是一个利用Vue组合式 API 来封装和复用有状态逻辑的函数。
  2. 具有更灵活的代码组织:与同一个逻辑关注点相关的代码可以放在一起,不需要再为了一个逻辑关注点在不同的选项块间来回滚动切换。随时将功能的一部分拆分出去。具有更好的类型推导,这对代码压缩更友好,因为本地变量的名字可以被压缩,但对象的属性名则不能。

组合式API写法

  1. 安装pinia

npm i pinia

  1. src 目录下新建 /store/index.ts 文件,引入pinia
//创建大仓库
import { createPinia } from 'pinia';
const store = createPinia();
export default store;
  1. 在入口文件main.ts中引入仓库
import store from './store';
app.use(store);// 注册仓库
  1. 创建小仓库:src/store目录下新建 /modules/todo.ts
import { defineStore } from 'pinia';
import { ref } from 'vue'
// 创建小仓库
const useTodoStore = defineStore('todo', () => {
	let todos = ref([{id:1,title:'吃饭'},{id:2,title:'睡觉'},{id:3,title:'打豆豆'}])
	// 务必要返回一个对象:属性与方法可以提供给组件使用
	return {
		todos
	}
});
export default useTodoStore
  1. 获取并使用store数据:
    组件中:
<template>
	<div class="todo">
		<p>{{todoStore.todos}}</p>
	</div>
</template>

<script steup lang="ts">
import useInfoStore from '../../store/modules/todo';
// 引入组合式API函数仓库
let todoStore =useTodoStore();
</script>

  1. 修改数据
    组件中:
<template>
	<div class="todo">
		<p @click="updateTodo">{{todoStore.todos}}</p>
	</div>
</template>

<script steup lang="ts">
import useInfoStore from '../../store/modules/todo';
// 引入组合式API函数仓库
let todoStore =useTodoStore();
//点击p标签,修改数据
const updateTodo = () => {
	todoStore.updateTodo();
}
</script>

仓库中 :/modules/todo.ts

import { defineStore } from 'pinia';
import { ref } from 'vue'
// 创建小仓库
const useTodoStore = defineStore('todo', () => {
	let todos = ref([{id:1,title:'吃饭'},{id:2,title:'睡觉'},{id:3,title:'打豆豆'}])
	// 务必要返回一个对象:属性与方法可以提供给组件使用
	return {
		todos,
		updateTodo() {
            todos.value.push({ id: 4, title: '组合式API方法' });
        }
	}
});
export default useTodoStore
  1. 计算属性,引入computed
    仓库中: /modules/todo.ts
import { defineStore } from 'pinia';
import { ref,computed } from 'vue'
// 创建小仓库
const useTodoStore = defineStore('todo', () => {
	let arr = ref([1,2,3,4,5]);
	const total = computed(() => {
		return arr.value.reduce((prev,next) => {
			return prev + next
		});
	});
	// 务必要返回一个对象:属性与方法可以提供给组件使用
	return {
		total
	}
});
export default useTodoStore
  1. 使用计算属性的值:
    组件中:
<template>
	<div class="todo">
		<h1>{{todoStore.total}}</h1>
	</div>
</template>

<script steup lang="ts">
import useInfoStore from '../../store/modules/todo';
// 引入组合式API函数仓库
let todoStore =useTodoStore();
</script>
### Pinia 组合式 API 使用指南 在 Vue 项目中使用 Pinia 进行状态管理可以极大地简化开发流程并提高代码可维护性。通过组合式 API,开发者能够更直观地管理和操作应用的状态。 #### 创建 Pinia 实例 为了初始化 Pinia 并将其集成到 Vue 应用程序中,需先创建一个 Pinia 实例,并配置持久化插件以便于数据保存: ```javascript // main.js 或 setup store 文件 import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import { createPinia } from &#39;pinia&#39; import persist from &#39;pinia-plugin-persistedstate&#39; const app = createApp(App) const pinia = createPinia() pinia.use(persist) // 添加持久化支持 app.use(pinia).mount(&#39;#app&#39;) ``` 此部分展示了如何设置全局可用的 Pinia 存储实例[^2]。 #### 定义 Store 模块 接下来定义具体的模块来处理特定业务逻辑的数据流。这里展示了一个简单的 `user` 模块作为例子: ```typescript // src/stores/user.ts import { defineStore } from &#39;pinia&#39; export const useUserStore = defineStore(&#39;user&#39;, { state: () => ({ name: &#39;&#39;, age: null, }), actions: { updateUserInfo(payload) { this.name = payload.name; this.age = payload.age; } }, }) ``` 上述代码片段说明了怎样利用 `defineStore` 函数构建一个新的仓库 (store),其中包含了初始状态 (`state`) 和改变这些状态的方法 (`actions`)。 #### 在组件内访问 State 一旦完成了以上准备工作,则可以在任何 Vue 组件里轻松获取所需的状态信息以及触发相应的 action 来更新它们: ```html <template> <div> 用户名:<input v-model="userName"/> 年龄:<input type="number" v-model.number="userAge"/> <button @click="saveInfo">保存</button> </div> </template> <script lang="ts"> import { ref, computed } from &#39;vue&#39;; import { useUserStore } from &#39;../stores/user&#39;; export default { setup() { const userStore = useUserStore(); let userName = computed({ get: () => userStore.name, set: value => userStore.updateUserInfo({name:value}), }); let userAge = computed({ get: () => userStore.age, set: value => userStore.updateUserInfo({age:Number(value)}), }); function saveInfo(){ console.log(`已保存 ${userName.value} (${userAge.value})`); } return { userName,userAge,saveInfo }; } } </script> ``` 这段脚本解释了如何借助计算属性绑定输入框与存储中的字段关联起来,并实现双向同步;同时也示范了调用自定义方法完成表单提交后的动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值