Vue状态管理工具pinia的简单使用

news/2024/11/29 22:51:34/

Vue状态管理工具pinia的简单使用

1. 介绍

Pinia 是一个 Vue 状态管理工具,它是 Vue 3 官方推荐的状态管理库之一。Pinia 的目标是提供一个简单、轻量级的状态管理解决方案,它基于 Vue 3 的新响应式 API 和新的组合式 API 构建,使用起来非常直观和自然。

2. pinia在vue3中的使用

  • 首先在项目中安装pinia,执行npm install pinia,然后在入口文件main.js中引入
  • 我们选择与 Vue 的选项式 API 类似的方式,传入一个带有 stateactionsgetters 属性的 Option 对象
  • 你可以认为 statestore 的数据 (data)gettersstore 的计算属性 (computed),而 actions 则是方法 (methods)
// main.js
import { createApp } from 'vue'
import { createPinia } from "pinia"
import App from './App.vue'
import './assets/main.css'const pinia = createPinia()
const app = createApp(App)
app.use(pinia)
app.mount('#app')
  • 创建一个store
// src/store/user.js
import { defineStore } from "pinia"export const useUserStore = defineStore({id: "user"
})
  • 定义state,并引入使用
// src/store/user.js
import { defineStore } from "pinia"export const useUserStore = defineStore({id: "user",state: () => {return {firstName: "Jack",lastName: "Joe",age: 18}}
})
// src/pages/user.vue
<template><div class="user">{{ user.firstName }} -- {{ user.lastName }}</div>
</template><script setup>
import { useUserStore } from "../store/user"
const user = useUserStore()
</script>
  • 定义getter并引入使用
// src/store/user.js
import { defineStore } from "pinia"export const useUserStore = defineStore({id: "user",state: () => {return {firstName: "Jack",lastName: "Joe",age: 18}},getters: {fullName(state) {return state.firstName + " " + state.lastName}}
})
// src/pages/user.vue
<template><div class="user">{{ user.fullName }}</div>
</template><script setup>
import { useUserStore } from "../store/user"
const user = useUserStore()
console.log(user.fullName);
</script>
  • 定义action并使用,action中的方法可同步也可异步。
// src/store/user.js
import { defineStore } from "pinia"function apiGetData(name) {return new Promise((resolve, reject) => {setTimeout(() => {if(name === "Jack Joe") {resolve({ age: 18 })} else {reject({ msg: "查无此人!" })}}, 2000);})
}
export const useUserStore = defineStore({id: "user",state: () => {return {firstName: "Jack",lastName: "Joe",age: 18}},actions: {changeName(name) {[ this.firstName, this.lastName ] = name.split(" ")},async getUserData(name) {try {const res = await apiGetData(name)return res} catch(err) {return err}}},getters: {fullName(state) {return state.firstName + " " + state.lastName}}
})
// src/pages/user.vue
<template><div class="user">{{ user.fullName }}</div>
</template>
<script setup>
import {} from "vue"
import { useUserStore } from "../store/user"const user = useUserStore()
console.log(user.fullName);
//同步方法
user.changeName("Marry Gren")
//异步方法
const getUser = async () => {const userData = await user.getUserData("Jack Joe")console.log(userData);// {age: 18}
}
getUser()
</script>

http://www.ppmy.cn/news/661088.html

相关文章

来点美图

很抱歉&#xff0c;我无法提供图片。但是我可以用中文为您回答问题。如果您有任何问题&#xff0c;请随时告诉我。

深度学习AI美颜系列---美图秀秀AI美图之跨次元相机特效

深度学习AI美颜系列---美图秀秀AI美图之跨次元相机特效算法解析 最近在做类似美图秀秀AI美图里的跨次元相机特效算法&#xff0c;美图跨次元相机特效举例如下&#xff1a; 原图 美…

java入门之 美图相机(原图、灰度、二值化、马赛克、融合、轮廓获取)

编写美图相机时&#xff0c;我们首先需要了解图片再计算机中的存储形式&#xff0c;详情可见http://t.csdn.cn/MgOfO 目录 <1>创建显示图片的主界面 1.添加窗体&#xff0c;用数列添加按钮&#xff0c;设置窗体可视化&#xff0c;添加主函数 2.先创建对象&#xff0c;…

使用cat EOF命令插入变量

有的时候在容器内修改配置文件比较麻烦&#xff0c;没有vi命令无法编辑文件 记录一下在没有vi的情况下常用的命令 例1&#xff1a; 往nginx服务配置文件追加配置&#xff0c;$host是变量的形式&#xff0c;只需要把第一个EOF加引号即不会被转义 cat << EOF >> d…

二层交换机有IP地址吗?

二层交换机本身不具有IP地址。它工作在数据链路层,主要进行MAC地址学习与转发。 但是,二层交换机上会存在一些有IP地址的网络设备,主要包括: 管理接口:二层交换机上会有一个用于管理交换机的接口,通常连接交换机的Console口或AUX口,该接口配置有IP地址,用于通过网络管理交换机…

《九》TypeScript 中的内置工具

TypeScript 内置了很多类型工具&#xff0c;来辅助进行类型转换。 Partial<Type>&#xff1a; Partial<Type>&#xff1a;用于构造一个所有属性都为可选属性的类型。 interface IPerson {name: stringage: number }// personOptional 类型的所有属性都是可选的 …

这几天系统总是在慢慢地推几天前写的问答

这几天系统总是在慢慢地推几天前写的问答&#xff0c;一天给个几万展现&#xff0c;就怕给多了浪费了。 难道是前几天给得太多&#xff0c;没人读&#xff0c;头条发现了&#xff0c;所以才一点点给&#xff1f; 已经好久没有爆款的感觉了[捂脸] 其实也不怪头条不给流量&#x…