vue3中使用pinia(大菠萝)状态管理仓库

2023-11-19

在Vue 3中,状态管理是非常重要的一部分。而Pinia(大菠萝)作为一个全新的状态管理库,在Vue 3中提供了更好的状态管理方案,可以方便地实现任意组件之间数据共享。与VueX不同的是,Pinia并不依赖于Vue 3的响应式系统,而是通过手动订阅和派发事件的方式来实现状态管理。这样可以提高系统性能,减少数据冗余,同时使得代码更容易测试和维护。本文将介绍如何在Vue 3中使用Pinia状态管理仓库,并提供一些最佳实践来帮助您更好地使用它。

一、vue3中使用pinia

Pinia是一个Vue 3的状态管理库,提供了一个易于使用的API和可扩展性。下面是如何在Vue 3项目中使用Pinia的步骤:

  1. 安装Pinia

在项目中使用npm或yarn安装Pinia:

npm install pinia

yarn add pinia
  1. 创建和注册一个Pinia store

创建一个store并导出它,例如:

import { defineStore } from 'pinia'

export const useMyStore = defineStore('myStore', {
  state: () => ({
    count: 0,
  }),
  actions: {
    increment() {
      this.count++
    },
  },
})

在项目中的任何组件中使用该store,只需导入并使用它:

import { useMyStore } from './store'

export default {
  setup() {
    const myStore = useMyStore()

    return {
      count: myStore.count,
      increment: myStore.increment,
    }
  },
}
  1. 在Vue应用程序中安装Pinia

在Vue的createApp时,将Pinia安装为插件:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const app = createApp(App)

app.use(createPinia())

app.mount('#app')

现在,您可以在Vue应用程序中使用Pinia啦!

备注:由于Vue 3的Composition API的特性,您可以使用useXXX函数(例如 useMyStore())而不是传统的mapState、mapActions等选项来访问store中的状态和操作。

二、使用pinia实现任意组件之间数据共享

要在Vue 3项目中使用Pinia实现任意组件之间的数据共享,您可以按照以下步骤操作:

  1. 创建一个名为user的Pinia store,例如:
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    name: 'John Doe',
  }),
  actions: {
    setName(name) {
      this.name = name
    },
  },
})
  1. 在Vue应用程序中注册Pinia store,您需要在入口文件中创建Pinia实例并将其注册到Vue应用程序中。例如:
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import { useUserStore } from './store/user'

const app = createApp(App)

app.use(createPinia())
app.provide('userStore', useUserStore())

app.mount('#app')

在上面的示例中,我们使用provide API将useUserStore()实例注册为名为’userStore’的全局可注入实例。

  1. 在组件中使用Pinia store,您可以在任何Vue组件中使用创建的Pinia store。例如,在组件A和组件B中,您可以使用以下方式导入user store:
import { useUserStore } from '../store/user'

export default {
  setup() {
    const userStore = useUserStore()

    return {
      name: userStore.name,
      setName: userStore.setName,
    }
  },
}

在上面的示例中,我们使用useUserStore()函数从’./store/user.js’中导入我们的Pinia store,并在setup()函数中使用store的属性和操作。

  1. 在组件A或组件B中更新user store中的状态,例如:
import { useUserStore } from '../store/user'

export default {
  setup() {
    const userStore = useUserStore()

    const handleNameChange = (name) => {
      userStore.setName(name)
    }

    return {
      name: userStore.name,
      handleNameChange,
    }
  },
}

在上面的示例中,我们导入’…/store/user.js’中的user store,并在组件A中使用setName()操作更改store中的状态。

  1. 在组件B中读取user store中的状态,例如:
import { useUserStore } from '../store/user'

export default {
  setup() {
    const userStore = useUserStore()

    return {
      name: userStore.name,
    }
  },
}

在上面的示例中,我们导入’…/store/user.js’中的user store,并在组件B中使用store的name属性。

现在,您已经成功地在Vue 3项目中使用Pinia实现了任意组件之间的数据共享!

三、pinia中的getters

Vue 3项目中,使用Pinia状态管理仓库,可以使用getter来获取存储状态,这是一个非常有用的特性。getter可以用于计算或转换存储的状态,并且能够更新UI或在其他地方使用。

以下是一个使用getter的示例:

import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    firstName: 'John',
    lastName: 'Doe',
  }),
  getters: {
    fullName() {
      return `${this.firstName} ${this.lastName}`
    },
  },
})

在上面的例子中,我们在user store中定义了一个getter函数fullNamegetter函数返回由firstNamelastName组合成的完整名称。

现在,可以在组件中使用getter来获取完整名称,并将其显示在UI中,如下所示:

<template>
  <div>{{ fullName }}</div>
</template>

<script>
import { useUserStore } from '../store/user'

export default {
  setup() {
    const userStore = useUserStore()

    return {
      fullName: userStore.fullName,
    }
  },
}
</script>

在上述代码中,我们在组件中使用useUserStore钩子获取store实例,然后返回完整名称getter。最后,在模板中将fullName绑定到UI元素,以便在屏幕上显示完整名称。

通过使用getter,您可以轻松地计算和转换状态,并将其暴露给Vue组件中使用。在实际开发中,getter的应用场景非常广泛,比如处理复杂的计算逻辑,根据状态属性的值决定下一步要执行的操作等等。

四、pinia的组合式写法

在Vue 3项目中,除了可以使用Options API来定义Pinia状态管理仓库之外,还可以使用Composition API。下面是一个使用Composition API来定义和使用Pinia状态管理仓库的示例:

//定义组合式API仓库
import { defineStore } from "pinia";
import { ref, computed,watch} from 'vue';
//创建小仓库
let useTodoStore = defineStore('todo', () => {
    let todos = ref([{ id: 1, title: '吃饭' }, { id: 2, title: '睡觉' }, { id: 3, title: '打豆豆' }]);
    let arr = ref([1,2,3,4,5]);

    const total = computed(() => {
        return arr.value.reduce((prev, next) => {
            return prev + next;
        }, 0)
    })
    //务必要返回一个对象:属性与方法可以提供给组件使用
    return {
        todos,
        arr,
        total,
        updateTodo() {
            todos.value.push({ id: 4, title: '组合式API方法' });
        }
    }
});

export default useTodoStore;

上述代码中使用ref定义的todosarr 就相当于选项式中的state中的数据;使用computed计算属性计算的total就相当于选项式中的getters中的属性;updateTodo方法就相当于写在选项式actions中的方法

五、pinia和vuex的对比

特性 Vuex (Vue2) Pinia (Vue3)
数据存储 State 存储在 Store 中 State 存储在 Store 中
数据修改 commit/mutation action
响应式 使用 Vue 响应式系统实现 使用 Vue 3 的响应式系统实现
数据获取 getters getters
模块化 模块按照功能划分,每个模块有自己的 state、mutation、action 和 getter 模块按照功能划分,每个模块有自己的 state、action 和 getter
TypeScript 支持 需要额外安装 @vue/cli-plugin-typescript 插件,并在 store 中进行类型定义 内置 TypeScript 支持,使用起来更加方便
插件 支持插件(例如 logger 插件) 支持插件(例如 devtools 插件)
热重载 支持热重载 支持热重载

需要注意的是,Vue3 中的 Pinia 不仅支持 Vue2 中 Vuex 所有的功能,而且使用起来更加方便,对 TypeScript 的支持也更加友好。而且 Pinia 只依赖于 Vue3 的响应式系统,所以可以很容易地跨平台使用。

六、总结

综上所述,Pinia(大菠萝)是Vue 3中一个非常重要的状态管理库,它能够帮助我们更好地管理和共享组件中的数据。通过本文的介绍,您已经学会了如何在Vue 3中使用Pinia,以及一些最佳实践来帮助您更好地使用它。当然,这只是入门级别的介绍,并且Pinia仍然有很多特性和功能可以探索。如果您想深入学习更多关于Pinia的内容,建议您查阅官方文档。希望本文对您在Vue 3中使用Pinia提供了一些帮助,祝您在开发中愉快!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3中使用pinia(大菠萝)状态管理仓库 的相关文章

随机推荐

  • 输出整数m中删除n位之后的最大(小)数(保持各位顺序不变)

    这个题不知道ac没有 因为是随便看到的一个题 没办法测 如果有错误请帮我指出来 看到很多复杂度很高的暴力破解方法 有三层循环的那种 我这个复杂度应该会低一点 思路 先将结果初始化最后m n个字符 放在res中 从res的第一位开始 在它前面
  • C# ADSL自动拨号实现代码

  • docker安装mysql8

    docker 默认mysql版本为8 0 docker pull mysql 启动mysql8 首先需要新建目录及文件 文件 F mydocker mysql8 config my cnf 目录 F mydocker mysql8 data
  • java数组专题

    下文笔者讲述求数组并集的方法分享 如下所示 实现思路 1 定义一个set集合 2 将数组中的元素都放入set中 则可实现数组并集 例 package com java265 other import java util HashSet im
  • QT 切换界面时候布局错乱

    偶然发现 在win下 全屏显示 showFullScreen 时候 label 如果开启 自动换行功能会出现 布局错乱QLabelt gt setWordWrap true
  • 机器学习里的 kernel 是指什么?

    转自我的知乎回答 机器学习里的 kernel 是指什么 我换个角度来解释这个问题 机器学习在做回归或者分类时有一个很朴实的想法 预测 x 的值 那就在训练集 X 中寻找那些与 x 相似的样本 再把这些样本的值加权作为预测值 这里有两个问题
  • Unity 导出XCode工程运行报错: ‘UnityFramework/UnityFramework.h‘ file not found

    简介 近期项目升级到2019 4 10f1版本 在用自动化打包的时候 遇到了一些问题 其中一个是 在导出XCode工程之后 运行工程的时候 编译报错 UnityFramework UnityFramework h file not foun
  • ​CVPR 2023

    论文链接 https arxiv org pdf 2306 02763 pdf 代码链接 https github com ZhenglinZhou STAR 要解决的问题 人脸关键点检测标注中存在语义歧义问题 语义歧义是指不同的标注者对同
  • x86 32位机的特权保护

    优先级划分 指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础 本文将试图讲解为大家解决两大问题 win32汇编中为什么找不到中断指令的应用 比如int 7ch windows错误的 蓝屏 是从哪里来的 保护模式下 中断或异常往往
  • idea2021如何开启RunDashboard

    一般来说如果你的微服务项目中拥有多个子模块 idea会自动识别 不需要进行以下操作 只要你一运行多个子模块就会自动出现 如果没有出现 那就只有手动添加了 1 找到workspace xml项目所在的磁盘路径 idea gt workspac
  • CTF图片隐写题

    1 隐藏在图片属性里的信息或者以文本形式打开能直接获取的信息 例如实验吧里的一道题 这个背影我给满分 就是将信息隐藏在属性里 又或者文本形式能直接看到的 分别是黑客榜中榜游戏和南邮平台的两道题
  • 按键控制数码管0-99显示,十位不跳,用定时器T0中断

    如果直接在主函数中写按键控制数码管0 99显示 不管怎么延时数码管十位上的数都会闪 原因就是单片机的机器周器太快 人的按键速度是ms级的 所以等你人操作完了 单片机早就执行了不知道多少遍 解决方法就是用中断 这里采用定时器T0溢出中断 工作
  • 单目标应用:基于蛇群优化算法(SO)的无人机(UAV)三维路径规划(提供MATLAB代码)

    一 蛇群优化算法SO 蛇群优化算法 Snake Optimizer SO 由Fatma A Hashim和Abdelazim G Hussien于2022年提出 该算法思路新颖 快速高效 模拟了蛇的觅食和繁殖行为 SO具体原理参考如下链接
  • PyQt5 组件之QMenuBar

    QMenuBar简介 在QMainWindow对象的标题栏下方 水平的QMenuBar被保留显示QMenu对象 QMenuBar类提供了一个可以包含一个或多个QAction对象或 级联的QMenu对象 要创建一个弹出菜单 Pyqt提供了cr
  • FM33G0X之上电过程引脚配置

    八 FM33G0X之上电过程引脚配置 使用官方例程的代码初始化 在实际测试中会出现 配置成输出的引脚在上电过程中会将电平拉高 12v的输入电压 引脚可能会拉到3v 并持续一段时间 这对于实际应用中 是不应该出现的 比如一开始在io口配置中配
  • Visual C++ Redistributable 一键安装All In One Runtimes

    老版本的程序需要在客户端安装低版本的VC运行库Visual Studio 但网上第三方找到的软件要么无法下载 要么版本低 或者要求付费 而且常常有病毒 或者根本就是垃圾广告 因此从微软厂商下载 并编写了一个非常简单的脚本一键安装 右键以管理
  • webpack

    一 背景 随着我们的项目涉及到页面越来越多 功能和业务代码也会随着越多 相应的 webpack 的构建时间也会越来越久 构建时间与我们日常开发效率密切相关 当我们本地开发启动 devServer 或者 build 的时候 如果时间过长 会大
  • simcse模型

    一个对比学习的框架 作者在这里通过将一句话分两次过同一个模型 但使用两种不同的dropout 这样得到的两个sentence embedding就作为模型的正例 而同一个batch中的其他embedding就变为了负例 第二个代理任务就更加
  • linux虚拟机BIOS禁用Intel VT-x,电脑重启开启CPU虚拟化

    安装虚拟机centOS64的时候出现下面这个问题 通过 任务管理器 查看性能 CPU 发现是 已禁用 解决办法 重启电脑 修改BIOS中CPU 的配置 重点是 重启电脑 重点是 重启电脑 重点是 重启电脑 重启的过程中才能修改 重启的时候
  • vue3中使用pinia(大菠萝)状态管理仓库

    在Vue 3中 状态管理是非常重要的一部分 而Pinia 大菠萝 作为一个全新的状态管理库 在Vue 3中提供了更好的状态管理方案 可以方便地实现任意组件之间数据共享 与VueX不同的是 Pinia并不依赖于Vue 3的响应式系统 而是通过