• Pinia 是 Vue.js 的一个状态管理库,用于在 Vue 应用程序中管理共享状态。它是 Vuex 的后继者,提供了一个简单、直观且灵活的方式来处理应用中的全局状态,比如用户登录信息、应用配置、购物车数据等。
  • 与 Vuex 相比,Pinia 有更简洁的 API 和更好的类型支持(在 Type - Script 项目中),使得开发者能够更高效地管理应用状态

Pinia基本使用

  1. Store是一个保存:状态、业务逻辑的实体,每个组件都可以读取、写入它

  2. 它有三个概念:stategetteraction,相当于组件中的: datacomputedmethods

  1. 安装pinia

     npm i pinia
  2. 使用pinia

    // main.ts
    
    // 引入createPinia
    import {createPinia} from "pinia"; const app = createApp(App) app.use(router) // 创建pinia
    const pinia = createPinia()
    // 使用pinia,在app挂载之前
    app.use(pinia) app.mount('#app')
  3. 存储数据,创建store文件夹,存放store相关代码(和vuex一样)

    State:用于数据的存储(对象类型数据),是store中唯一数据源

    // 引入defineStore
    
    import {defineStore} from "pinia";
    
    // 官方推荐命名与hooks一样,use开头
    
    // 第一个参数可以理解为给Store命名,这个名称在整个应用程序的 Pinia 实例中必须是唯一的,它就像是一个标识符,用来区分不同的 Store
    // 第一个参数可以写成和文件名字一样
    // 第二个参数是一个配置对象
    export const useStatusStore = defineStore("status", { // 存储数据的地方-Pinia唯一的数据源
    // state必须是一个函数,且返回一个对象
    state() {
    // 定义一个flag和isShow
    return {flag:0,isShow:true}
    }, })
  4. 读取数据


    // 引入useStatusStore import {useStatusStore} from "@/store/status"; // statusStore是一个reactive响应式对象
    const statusStore = useStatusStore() // 读取flag
    // statusStore是reactive响应式对象,但是里面的属性是ref的响应式对象
    // 虽然是ref响应式对象,但是读取不需要.value,只有我们手动ref(xx)创建数据的时候需要.value
    console.log(statusStore.flag)
    // 通过$state读取,$state是一个特殊的属性,
    // 它代表了整个 store(仓库)的状态对象。这个状态对象包含了所有在state函数中定义的状态属性 // 也可以这样读取
    console.log(statusStore.$state.flag)

pinia修改数据

  1. 直接修改

    // 直接修改即可,不需要像vuex一样提交方法
    
    statusStore.flag = 1
  2. 使用$patch方法

    $patch可以在一次操作中完成多个状态属性的更新,减少了多次触发状态更新机制的开销,提高效率

      //patch用于批量更新 store中的状态
    //参数是一个对象,要修改的数据名-要改的值,支持批量修改
    statusStore.$patch({
    // flag改成1 isShow改成false
    flag: 1,
    isShow:false
    })
  3. actions修改

    使用actions需要先在Store里面配置actions

    export const useStatusStore = defineStore("status", {
    
        // state必须是一个函数,且返回一个对象
    state() {
    return {flag: 0, isShow: true}
    },
    // actions是一个对象,里面放置的是一个一个的动作方法,用于响应组件中的动作
    actions:{
    // 修改flag
    setFlag(value:number){
    // 可以对数据进行一些其他逻辑处理
    this.flag = value
    }
    } })

    然后在组件中直接调用方法进行修改

    const statusStore = useStatusStore()
    statusStore.setFlag(1)

storeToRefs读取数据

  • 借助storeToRefsstore中的数据转为ref对象,方便在模板中使用。
  • pinia提供的storeToRefs只会将数据做转换,而VuetoRefs会转换store中所有
// 引入
import {storeToRefs} from "pinia"; // let {flag,isShow} = statusStore 如果直接解构拿取数据,会丢失响应式 // 使用toRefs解构,可以实现解构并且响应式,但是是将数据、方法都转换了,不管有没有用
// let {flag,isShow} = toRefs(statusStore) // 使用storeToRefs解构,只会关注Store里面的数据,不关注方法
let {flag, isShow} = storeToRefs(statusStore)

getters

state中的数据,需要经过处理后再使用时,可以使用getters配置

  1. 在Store里面写getters配置

    export const useStatusStore = defineStore("status", {
    
        state() {
    return {flag: 0, isShow: true}
    },
    actions: { setFlag(value: number) {
    this.flag = value
    }
    },
    // getters是一个配置对象,类似计算属性
    getters: {
    // doubleFlag属性,值是flag的双倍
    doubleFlag(): number {
    return this.flag * 2
    },
    // 箭头函数
    doubleFlag1: state => state.flag * 2 } })
  2. 调用getters

    statusStore.doubleFlag
    statusStore.doubleFlag1

$subscribe

通过 store 的 $subscribe() 方法侦听 state 及其变化

const statusStore = useStatusStore()

// 类似于监视属性,当Store里的数据发生变化的时候触发,接受一个回调函数
statusStore.$subscribe((mutate, state) => {
// mutate:包含有关状态变化详细信息的对象
// state:一个只读的对象,表示 store 在状态变化后的最新状态
console.log(mutate,state) })

Pinia组合式写法

import {defineStore} from "pinia";

import {reactive} from "vue";

// 组合式写法,第二个参数不是对象了,是一个回调函数
export const useStatusStore = defineStore("status", () => { // 在Store里面定义响应式数据,相当于在state里面定义了userList,userList就是state
const userList = reactive({id: "001", name: "001", age: 11}) // 相当于在getters里面定义doubleAge,调用需要以方法的形式调用,需要加括号
function doubleAge() {
return userList.age * 2
} // 相当于在actions里面定义getUser,调用需要以方法的形式调用,需要加括号
function getUser() {
return userList
} // 将数据暴露出去
return {userList,doubleAge,getUser} })

vue3-Pinia的更多相关文章

  1. Vite-Admin后台管理系统|vite4+vue3+pinia前端后台框架实例

    基于vite4.x+vue3+pinia前端后台管理系统解决方案ViteAdmin. 前段时间分享了一篇vue3自研pc端UI组件库VEPlus.这次带来最新开发的基于vite4+vue3+pinia ...

  2. taro+vue3+TS+Pinia+tailwindcss+NutUI项目创建与开发

    一.初始化 1.Taro 基本安装并初始化项目 npx @tarojs/cli init WechatAppDemo -选择框架:vue3 -是否使用ts?y -请选择css预编译器:无 -请选择we ...

  3. 在Vue3项目中使用pinia代替Vuex进行数据存储

    pinia是一个vue的状态存储库,你可以使用它来存储.共享一些跨组件或者页面的数据,使用起来和vuex非常类似.pina相对Vuex来说,更好的ts支持和代码自动补全功能.本篇随笔介绍pinia的基 ...

  4. 基于 vite 创建 vue3 全家桶项目(vite + vue3 + tsx + pinia)

    vite 最近非常火,它是 vue 作者尤大神发布前端构建工具,底层基于 Rollup,无论是启动速度还是热加载速度都非常快.vite 随 vue3 正式版一起发布,刚开始的时候与 vue 绑定在一起 ...

  5. 使用Vite快速构建Vue3+ts+pinia脚手架

    一.前言 vue3的快速更新,很多IT发展快的地区在22开始都已经提上日程,小编所在的青岛好像最近才有点风波.vue3的人才在青岛还是比较稀缺的哈,纯属小编自己的看法,可能小编是个井底之蛙!! vue ...

  6. vue3中pinia的使用总结

    pinia的简介和优势: Pinia是Vue生态里Vuex的代替者,一个全新Vue的状态管理库.在Vue3成为正式版以后,尤雨溪强势推荐的项目就是Pinia.那先来看看Pinia比Vuex好的地方,也 ...

  7. Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

    在<基于 vite 创建 vue3 项目>一文中整合了 pinia,有不少伙伴不知道 pinia 是什么,本文简单介绍 pinia.主要包括三方面: pinia 的基本用法,在<基于 ...

  8. 实战进阶 Vue3+Axios+pinia

    实战进阶 Vue3+Axios+pinia 创建文件utils/request.js import Axios from 'axios'; export const request = Axios.c ...

  9. vite+ts+vue3+router4+Pinia+ElmPlus+axios+mock项目基本配置

    1.vite+TS+Vue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Selec ...

  10. 2022.07.13 vue3下pinia的简单使用及持久化

    使用前说明: 当前demo使用了vue3 + vite + typescript + pinia搭建的简单项目,主要介绍了在单文件组件(sfc)基础上使用pinia的用法,懒得看api的兄弟们,来这瞅 ...

随机推荐

  1. Qml 实现瀑布流布局

    [写在前面] 最近在刷掘金的时候看到一篇关于瀑布流布局的文章,然鹅他们的实现都是前端的那套,就想着 Qml 有没有类似实现. 结果百度了一圈也没有( T_T Qml 凉了凉了 ),于是,我按照自己理解 ...

  2. 全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

    全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback 摘要: 回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法.这种模式在 Pyt ...

  3. 小tips:HTML5的ruby标签实现给汉字加拼音、details标签实现折叠面板、原生进度条progress和度量meter

    ruby标签实现给汉字加拼音 ruby 元素由一个或多个字符(需要一个解释/发音)和一个提供该信息的 rt 元素组成,还包括可选的 rp 元素,定义当浏览器不支持 "ruby" 元 ...

  4. 将ASD光谱仪的.asd文件转为文本文件

      本文介绍基于ViewSpec Pro软件,将ASD地物光谱仪获取到的.asd格式文件,批量转换为通用的.txt文本格式文件的方法.   ASD光谱仪是英国Malvern Panalytical公司 ...

  5. 2022年8月中国数据库排行榜:openGauss重夺榜眼,PolarDB反超人大金仓

    "烈日杲杲,夺榜愈烈." 2022年8月的 墨天轮中国数据库流行度排行榜 火热出炉,8月排行榜共有236个数据库参与排名.本月榜单前十名的变化可以用"两反超"来 ...

  6. iOS Masonry使用小结

    一.Masonry简介 Masonry是一个轻量级的布局框架,它拥有自己的描述语法(采用更优雅的链式语法封装)来自动布局,具有很好可读性且同时支持iOS和Max OS X等. 二.Masonry的基本 ...

  7. .NET 白板书写预测-曲线拟合

    白板软件书写速度是其最核心的功能,注册StylusPlugin从触摸线程拿触摸点数据并在另一UI线程绘制渲染是比较稳妥的方案,具体的可以查看小伙伴德熙的2019-1-28-WPF-高性能笔 - lin ...

  8. webpack与grunt、gulp的不同

    首先,它们的共同点三者都是前端构建工具,grunt和gulp早期比较流行,现在 webpack 是主流: 区别:grunt 和 gulp 基于 任务和流 : webpack 基于入口文件,webpac ...

  9. 云原生爱好者周刊:Grafana Loki 免费电子书

    云原生一周动态要闻: Apache Log4j 2.17.1 修复远程代码执行漏洞 CNCF 发布 2021 年度报告 极狐(GitLab)发布业内首款"GitNative" De ...

  10. php运行redis测试

    在今天将官方的redis教程看完之后,想自己来一个测试. 按照官方给出的代码: 1 <?php 2 //连接本地的 Redis 服务 3 $redis = new Redis(); 4 $red ...