【Pinia状态管理】Pinia和Vuex的对比;创建Pinia的Store;Pinia核心概念State、Getters、Actions

news2024/11/27 4:22:02

目录

  • 1_Pinia和Vuex的对比
    • 1.1_介绍pinia
    • 1.2_Pinia和Vuex的区别
  • 2_创建Pinia的Store
    • 2.1_安装使用
    • 2.2_Store
    • 2.3_定义一个Store
  • 3_Pinia核心概念State
    • 3.1_认识和定义State
    • 3.2_操作State
  • 4_Pinia核心概念Getters
    • 4.1_认识
    • 2.2_访问Getters
  • 5_Pinia核心概念Actions
    • 5.1_认识
    • 5.2_Actions执行异步操作

1_Pinia和Vuex的对比

1.1_介绍pinia

Pinia(发音为/piːnjʌ/,如英语中的“peenya”)是最接近piña(西班牙语中的菠萝)的词;

  • Pinia开始于大概2019年,最初是作为一个实验为Vue重新设计状态管理,让它用起来像组合式API(Composition API)。
  • 从那时到现在,最初的设计原则依然是相同的,并且目前同时兼容Vue2、Vue3,也并不要求使用Composition API;
  • Pinia本质上依然是一个状态管理的库,用于跨组件、页面进行状态共享(这点和Vuex、Redux一样);

访问官网


1.2_Pinia和Vuex的区别

有Vuex,为什么还要用Pinia?

  • Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法;
  • 最终,团队意识到Pinia已经实现了Vuex5中大部分内容,所以最终决定用Pinia来替代Vuex;
  • 与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的仪式,提供了 Composition-API 风格的 API;
  • 最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持;

和Vuex相比,Pinia有很多的优势:

  • 比如mutations消失,减少冗长的步骤
  • 更友好的TypeScript支持,Vuex之前对TS的支持很不友好;
  • 不再有modules的嵌套结构,可以灵活使用每一个store,它们是通过扁平化的方式来相互使用的;
  • 也不再有命名空间的概念,不需要记住它们的复杂关系;

在这里插入图片描述


2_创建Pinia的Store

2.1_安装使用

执行安装命令,二选一

yarn add pinia

npm install pinia

在src/store/路径下,或者src/pinia/路径下,创建index.js文件,写入下方的代码,然后就成功创建一个pinia并可导出使用

import { createPinia } from 'pinia'

const pinia = createPinia()

export default pinia

2.2_Store

什么是Store?

  • 一个 Store (如 Pinia)是一个实体,它会持有为绑定到组件树的状态和业务逻辑,也就是保存了全局的状态;
  • 比较像始终存在,并且每个人都可以读取和写入的组件;
  • 可以在应用程序中定义任意数量的Store来管理的状态;

Store有三个核心概念:

  • state、getters、actions;
  • 等同于组件的data、computed、methods;
  • 一旦 store 被实例化,就可以直接在 store 上访问 state、getters 和 actions 中定义的任何属性;

2.3_定义一个Store

Store在它被使用之前是不会创建的,可以通过调用use函数来使用Store。

比如下面,counter.js是已经定义好的一个状态管理文件

<template>
  <div class="home">
    <h2>Home View</h2>
    <h2>count: {{ counterStore.count }}</h2>
    <h2>count: {{ count }}</h2>
    <button @click="incrementCount">count+1</button>
  </div>
</template>

<script setup>
  import { storeToRefs } from 'pinia'
  import useCounter from '@/stores/counter';

  const counterStore = useCounter()

  const { count } = storeToRefs(counterStore)

  function incrementCount() {
    counterStore.count++
  }

</script>

注意Store获取到后不能被解构,那会失去响应式,为了从 Store 中提取属性同时保持其响应式,需要使用storeToRefs()


3_Pinia核心概念State

3.1_认识和定义State

state 是 store 的核心部分,因为store是用来帮助管理状态的。 在 Pinia 中,状态被定义为返回初始状态的函数;

比如下面/src/store/user.js的代码

import { defineStore } from 'pinia'

const useUser = defineStore("user", {
  state: () => ({
    name: "coder",
    age: 18,
    level: 100
  })
})

export default useUser

3.2_操作State

读取和写入 state, 默认情况下,可以通过 store 实例访问状态来直接读取和写入状态;

import useUser from '@/stores/user';
const userStore = useUser()

userStore.age++
userStore.name = "xixi"

重置 State,可以通过调用 store 上的 $reset() 方法将状态 重置 到其初始值;

const userStore = useUser()
userStore.$reset()

改变State

  • 除了直接用 store.age++ 修改 store,还可以调用 $patch 方法;
  • 它允许使用部分“state”对象同时应用多个更改;
const userStore = useUser()

userStore.$patch({
  name: "hhh",
  age: 25,
  leval: 50
})

替换State, 可以通过将其 $state属性设置为新对象来替换 Store 的整个状态:

userStore.$state({
  name: "hehe",
  age: 10,
  leval: 2
})

4_Pinia核心概念Getters

4.1_认识

Getters相当于Store的计算属性computed:

  • 它们可以用 defineStore() 中的 getters 属性定义;
  • getters中可以定义接受一个state作为参数的函数;

比如src/store/counter.js

// 定义关于counter的store
import { defineStore } from 'pinia'

import useUser from './user'

const useCounter = defineStore("counter", {
  state: () => ({
    count: 99,
    friends: [
      { id: 111, name: "xixi" },
      { id: 112, name: "kobe" },
      { id: 113, name: "james" },
    ]    
  }),
  getters: {
    // 基本使用
    doubleCount(state) {
      return state.count * 2
    }
})  
export default useCounter                             

2.2_访问Getters

访问当前store的Getters

const conterStore = useCouter()
console.log(counterStore.doubleCount)
console.log(counterStore.doubleCountAddOne)

Getters中访问自己的其他Getters, 可以通过this来访问到当前store实例的所有其他属性;

  getters: {
   // 1.基本使用
    doubleCount(state) {
      return state.count * 2
    },
    // 2.一个getter引入另外一个getter
    doubleCountAddOne() {
      // this是store实例
      return this.doubleCount + 1
    },
  }  

访问其他store的Getters

  getters: {
  // getters中用到其他的store中的数据
    showMessage(state) {
      // 1.获取user信息
      const userStore = useUser()

      // 2.获取自己的信息

      // 3.拼接信息
      return `name:${userStore.name}-count:${state.count}`
    }
  }  

Getters也可以返回一个函数,这样就可以接受参数

  getters: {
    // getters也支持返回一个函数
    getFriendById(state) {
      return function(id) {
        for (let i = 0; i < state.friends.length; i++) {
          const friend = state.friends[i]
          if (friend.id === id) {
            return friend
          }
        }
      }
    }
  }  

5_Pinia核心概念Actions

5.1_认识

Actions 相当于组件中的 methods,可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑;

和getters一样,在action中可以通过this访问整个store实例的所有操作;

  actions: {
    increment() {
      this.count++
    },
    incrementNum(num) {
      this.count += num
    }
  }    

5.2_Actions执行异步操作

Actions中是支持异步操作的,且可以编写异步函数,在函数中使用await;

在这里插入图片描述


在action中可以通过`this`访问整个store实例的所有操作;
  actions: {
    increment() {
      this.count++
    },
    incrementNum(num) {
      this.count += num
    }
  }    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nat. Mach. Intell 2023 | DrugBAN+:域自适应的可解释双线性插值网络改进药物-靶标预测(DTI)

DrugBAN&#xff1a;Interpretable bilinear attention network with domain adaptation improves drug–target prediction 论文&#xff1a;Interpretable bilinear attention network with domain adaptation improves drug–target prediction | Nature Machine Intellige…

Python爬虫基础之正则表达式

目录 一、什么是正则表达式&#xff1f; 二、re.compile()编译函数 三、group()获取匹配结果函数 四、常用匹配规则 4.1匹配单个字符 4.2匹配前字符次数 4.3匹配原生字符串 4.4匹配字符串开头和结尾 4.5分组匹配 五、re.match()开头匹配函数 六、re.search()全文搜索…

MusicBrainz Picard for Mac :音乐文件ID3编辑器

MusicBrainz Picard for Mac是一款macOS平台的音乐文件ID3编辑器&#xff0c;能够帮助我们在Mac电脑上编辑音乐文件的ID3标签信息&#xff0c;包括艺人、专辑等信息&#xff0c;非常快速和简单方便。Picard是下一代MusicBrainz标记应用程序。 这个新的标签概念是面向专辑的&…

Socks5代理 vs. Socks4代理:特点和区别解析

在网络通信中&#xff0c;使用代理服务器可以提供更安全、匿名的连接。其中&#xff0c;Socks5和Socks4是两种常见的代理协议。本文将深入探讨它们之间的特点和区别&#xff0c;帮助您选择适合自己需求的代理类型。 1.特点概述 -Socks5&#xff08;Socket Secure 5&#xff0…

数字孪生+燃气管理,解锁智慧燃气管理新模式

文章来源&#xff1a;网络 关键词&#xff1a;智慧燃气、智慧燃气数字化、数字孪生、智慧燃气平台、设备设施数字化 智慧燃气作为新兴行业应用&#xff0c;是智慧城市必不可少的一部分&#xff0c;而数字孪生是推动智慧燃气数字化、智能化发展的新动能。 01燃气行业现状 1…

vue3-vuex持久化实现

vue3-vuex持久化实现 一、背景描述二、实现思路1.定义数据结构2.存值3.取值4.清空 三、具体代码1.定义插件2.使用插件 四、最终效果 一、背景描述 有时候我们可能需要在vuex中存储一些静态数据&#xff0c;比如一些下拉选项的字典数据。这种数据基本很少会变化&#xff0c;所以…

element表格底部合计功能--给定的多维数组和键值获取函数,创建一个可查找特定键对应值的函数(JS自己写函数)

效果图如下&#xff1a; 代码&#xff1a; import { flattenDeep } from "lodash";export function getFinder(array, getKey, getVal (item, index) > item) {const store new Map();const eles flattenDeep(array);eles.forEach((ele, index) > {const ke…

opencv鼠标事件函数setMouseCallback()详解

文章目录 opencv鼠标事件函数setMouseCallback()详解1、鼠标事件函数&#xff1a;&#xff08;1&#xff09;鼠标事件函数原型&#xff1a;setMouseCallback()&#xff0c;此函数会在调用之后不断查询回调函数onMouse()&#xff0c;直到窗口销毁&#xff08;2&#xff09;回调函…

Virtuoso: 工艺库、仿真模型

1、添加仿真模型时&#xff0c;仿真模型有.scs和.lib的格式&#xff0c; 感谢这个大佬的解惑&#xff01;附上他的文章链接&#xff1a;Virtuoso 工艺库安装方法&#xff08;小白版&#xff09; - 知乎 添加.lib格式模型就如下&#xff1a; 2、各大MOS的Level仿真模型 引用: H…

pytorch异常——RuntimeError:Given groups=1, weight of size..., expected of...

文章目录 省流异常报错异常截图异常代码原因解释修正代码执行结果 省流 nn.Conv2d 需要的输入张量格式为 (batch_size, channels, height, width)&#xff0c;但您的示例输入张量 x 是 (batch_size, height, width, channels)。因此&#xff0c;需要对输入张量进行转置。 注意…

Mybatis中 list.size() = 1 但显示 All elements are null

一、Bug展示 二、原因分析 2.1.情形一&#xff1a;Mybatis的XML中返回类型映射错误 <select id"selectByDesc" parameterType"com.task.bean.OrderInfo"resultType"com.task.bean.OrderInfo">select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_S…

十七、命令模式

一、什么是命令模式 命令&#xff08;Command&#xff09;模式的定义&#xff1a;将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行储存、传递、调用、增加与管理。   命令…

使用element-ui中的el-table回显已选中数据时toggleRowSelection报错

最近在写一个后台&#xff0c;需要在表格中多选&#xff0c;然后点击编辑按钮的时候&#xff0c;需要回显已经选中的表单项 <el-table v-loading"loading" :data"discountList" :row-key"(row) > row.id" refmultipleTable selection-cha…

蓝牙链接上的标准串行 (COMx)

1 Preface/Foreword 电脑与蓝牙设备&#xff08;手机&#xff0c;音响&#xff09;连接时&#xff0c;电脑会虚拟出一个串口设备&#xff0c;并在设备管理其中的串口模块下列出。 2 删除方法 在已配对的设备列表中将设备移除。

【Centos8_配置单节点伪分布式Spark环境】

安装centos8 jdk部署伪分布式spark环境 安装Centos8 环境下的JDK 下载jdk linux版本 下载链接&#xff1a; jdk-8u381-linux-x64.tar.gz 将该文件上传到Centos8 主机 部署配置jdk&#xff08;java8&#xff09; # 解压到指定路径 [lhangtigerkeen Downloads]$ sudo tar …

初始react和使用——事件处理、样式处理和组件

一、react官网 1、官网下载 官网分别有中英文两种&#xff1a; 中文官网&#xff1a;React 官方中文文档 – 用于构建用户界面的 JavaScript 库 英文官网&#xff1a;https://reactjs.org/ 2、react简介 react是用于构建用户界面的JavaScript库&#xff0c;起源于Facebook的…

Python入门自学进阶-Web框架——40、redis、rabbitmq、git——3

git&#xff0c;一个分布式的版本管理工具。主要用处&#xff1a;版本管理、协作开发。 常见版本管理工具&#xff1a; VSS —— Visual Source Safe CVS —— Concurrent Versions System SVN —— CollabNet Subversion GIT GIT安装&#xff1a;下载安装文件&#xff1a;…

Nexus仓库介绍以及maven deploy配置

一 、Nexus仓库介绍 首先介绍一下Nexus的四个仓库的结构&#xff1a; maven-central 代理仓库&#xff0c;代理了maven的中央仓库&#xff1a;https://repo1.maven.org/maven2/&#xff1b; maven-public 仓库组&#xff0c;另外三个仓库都归属于这个组&#xff0c;所以我们的…

Oracle21C--Windows卸载与安装

卸载方法&#xff1a; &#xff08;1&#xff09;WinR&#xff0c;输入services.msc,打开服务&#xff0c;把Oracle相关的服务全部停止运行&#xff08;重要&#xff09; &#xff08;2&#xff09;WinR&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;删除Oracle开…