Pinia 是否可以代替 Vuex ?

2023-10-30

一、介绍

Vue 3.0 出来之前,数据存储的主流依旧是 Vuex。但是,当 Vue 3.0 问世后,官方为了迎合 Componsition API,进而设计了全新的状态管理 Pinia,而且未来的 Vuex 5 中提及的功能点正是 Pinia 目前已实现的。

! Vuex 5 提及的功能点:

  • 更好的兼容 Componsition AP
  • 更好的支持 TypeScript
  • 优化 modules 的嵌套结构
  • 支持热加载,无需刷新页面
二、对比
PiniaVuex 对比:
  • Pinia 没有 mutations,且 actions 支持同步/异步,Vuex 同步 mutations,异步 actions
  • Pinia 相比 Vuex 拥有更好的 TypeScript 支持
  • Pinia 不再需要 modules 的嵌套结构,独立的 store,扁平化处理得以更好的代码分割
  • Pinia 支持热加载,无需重载页面,保持现有状态
  • PiniaVue 3 中支持缓存,而 Vuex 则不再支持
  • Pinia 相比 Vuex 更加轻量化(体积约为 1K)
  • Pinia 支持 $reset 方法,可以初始化 state
  • Pinia 不支持 time-travel 功能,相对于 Vuex 调试功能还不成熟
  • Pinia 同样也支持 Vue 2.0
三、使用
  • 1. 安装

    npm i pinia@next -S

  • 2. 注册

    index.js

    import { createApp } from 'vue'
    import element from 'element-plus'
    import '@/assets/css/index.css'
    import router from '@/router/index'
    import App from './App'
    import { createPinia } from 'pinia'
    
    const app = createApp(App)
    
    app.use(element).use(router).use(createPinia()).mount('#root')
    
  • 3. 创建单个 store

    store/user.js

    import { defineStore } from 'pinia'
    
    export const userStore = defineStore('user', {
      state: _ => {
        return {
          username: '张同学'
        }
      },
      getters: {
    
      },
      actions: {
        // 重置数据
        _reset() {
          this.$reset()
        }
      }
    })
    
  • 4. 组件内引用

    Home.vue

    <template>
      <div>
        姓名:{{ user_store.username }}
        <br />
        <el-button @click="change_username">修改名称</el-button>
        <el-button @click="user_store._reset()">重置</el-button>
      </div>
    </template>
    
    <script>
    import { userStore } from '../store/user'
    
    export default {
      setup() {
        let user_store = userStore() // 初始化 user_store
        
        return { user_store }
      }
    }
    </script>
    
  • 5. 更新 store 数据的4种方式
    • (1):直接修改特定的值
      let user_store = userStore()
      
      /**
       * @description 修改用户名称
       */
      let update = _ => {
        user_store.username = '张三'
      }
      
    • (2):利用 $patch 批量修改
      let user_store = userStore()
      
      /**
       * @description 修改用户名称
       */
      let update = _ => {
        user_store.$patch({
        	username: '张三' 
        })
      }
      
    • (3):利用 $patch 单个修改特定的值
      let user_store = userStore()
      
      /**
       * @description 修改用户名称
       */
      let update = _ => {
        user_store.$patch(state => {
          state.username = '张三'
        })
      }
      
    • (4):利用 Actions 修改
      let user_store = userStore()
      
      /**
       * @description 修改用户名称
       */
      let update = _ => {
        user_store.update_username('张三')
      }
      
      // 修改用户名称
      update_username(value) {
        this.username = value
      }
      
  • 6. 其他

    从下面的截图我看可以看到自身的一些属性、方法等,诸如:$reset$patch 以及热更新相关的方法
    在这里插入图片描述
    关于 Pinia 数据持久化的问题,暂时没有完美的解决方案,待研究

四、总结

由于 Pinea 是轻量级的,体积很小,它适合于中小型应用。它也适用于低复杂度的 Vue.js 项目,因为一些调试功能,如时间旅行和编辑仍然不被支持。未来将 Vuex 用于中小型 Vue.js 项目是过度的,因为它重量级的,对性能有很大影响。因此,Vuex 适用于重量级、高复杂度的 Vue.js 项目。

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

Pinia 是否可以代替 Vuex ? 的相关文章

  • 将 Javascript 对象的属性从 string 更改为 int

    我有一个对象数组 每个对象具有三个属性 年份 总计 人均 例子 0 Object per capita 125 8 total 1007 2 year 2009 这些属性是字符串 我想创建一个循环来遍历数组并将它们转换为 int 我尝试了以
  • 在 HTML5 Javascript 中将 BlobBuilder 转换为字符串

    function blobToString blob var reader new FileReader var d reader onloadend function d callback reader result console lo
  • 可能未处理的承诺拒绝(id 0)类型错误 GET 或 HEAD 请求不允许主体

    import React from react import FlatList ActivityIndicator Text View from react native export default class FetchExample
  • JavaScript 添加布尔值

    console log true true 2 console log typeof true true number console log isNaN true true false 为什么两个布尔类型相加会产生一个数字 我有点理解 如
  • 显示具有多个父代的 D3 树

    我目前有this http bl ocks org mbostock 4339083图已实现 我希望在描述具有多个父节点的子节点时保持结构和可折叠性 有没有办法做到这一点 我研究了力图 但我也想保留一组层次结构 这意味着 1 级的父级可以有
  • 浏览器视口大小(以设备像素为单位)

    Goal 我希望 Flash 能够获得有关浏览器视口宽度和高度 以设备像素为单位 的准确信息初始化 调整大小或浏览器缩放事件时 规格 我需要将 flash 嵌入到在 chrome safari firefox 等中运行的 html 页面中
  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • 在渲染组件之前从 api 获取数据

    我在渲染页面之前发送 2 个 api 请求 const Profile template profile attributes null photos data function return attributes Profile attr
  • 通过 JavaScript 获取表单名称

    我有一个简单的问题 但我在网上找不到好的解决方案 我有这个 HTML 代码
  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript推送函数中的动态变量

    我在 JavaScript 中使用推送功能 var chartData for var i 0 i lt 3 i chartData push date new Date year s mon s date s hr s min s sec
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • $resource.query 返回分割字符串(字符数组)而不是字符串

    我正在使用像下面这样的 Angular resource angular module app factory data function resource var Con resource api data update method P
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供

随机推荐

  • PCB走线线宽电流对照表

    在PCB设计的过程中 大电流电路需要特别留意其参数 其几个个决定性因数包括 材质 厚度和宽度 下表为普通铜电路板计算参考
  • LayUI框架——选项卡

    目录 前言 1 动态实现选项卡 1 1 优化dao类 1 2 优化前端JSP页面 1 3 引入头部hand jsp页面 1 4 优化后台主界面js 2 运行效果图 前言 首先效果展示 1 动态实现选项卡 继 上篇博客 实现的导航栏 本篇实现
  • c语言分支结构程序设计教学设计 赛课,《分支结构程序设计》教学设计.doc

    分支结构程序设计 教学设计 潮州市饶平县华侨中学 邮编515700 张远航 Email zyuanhang 教学分析与教学设计思路 一 教学对象分析与教学设计 本教案适用于高中二年级学生 这一阶段的学生具备一定的数学基础和具有一定的比较 归
  • 利用python编程,制作自己的游戏“外挂”!

    Python简介及应用领域 Python是一种解释型脚本语言 可以应用于以下领域 Web 和 Internet开发 科学计算和统计 人工智能 教育 桌面界面开发 软件开发 后端开发 网络爬虫 编程用的好 不仅可以提高工作效率 还能让玩游戏变
  • FastAPI学习(二)——FastAPI+Jinjia2模板渲染网页(跳转返回渲染页面)

    文章目录 一 简单实现 1 依赖库安装 2 建立目录 3 item html文件代码 4 main py文件代码 5 浏览器输入 二 借用bootstrap模板 1 目录结构与名称 2 index html代码 3 main py代码 4
  • 值得收藏 Modbus RTU 协议详解

    值得收藏 Modbus RTU 协议详解 目录 值得收藏 Modbus RTU 协议详解 Modbus是什么 Modbus分类 Modbus通讯过程 Modbus RTU协议数据帧结构 功能码01 读线圈状态 功能码02 读离散量输入 功能
  • matlab 锐化降噪,matlab 图形锐化 滤波

    help imread help fspecial imfilt 帮助稳定中有较多的示例 fspecial 函数 功能 产生预定义滤波器 格式 H fspecial type H fspecial gaussian n sigma 高斯低通
  • 精密全波整流电路

    精密全波整流电路 单运放型 利用单运放构成的精密全波整流电路主要有两种 一种称之为 T 型 另一种称为 型 T 型精密全波整流电路的原理图如下 图1 T型精密全波整流电路 上面电路中 R1 R3 2 R2 当输入为正电压时 D1 导通D2截
  • HarmonyOS“一次开发,多端部署“优秀实践——玩机技巧,码上起航

    随着终端设备形态日益多样化 分布式技术逐渐打破单一硬件边界 一个应用或服务 可以在不同的硬件设备之间按需调用 互助共享 让用户享受无缝的全场景体验 作为应用开发者 广泛的设备类型也能为应用带来广大的潜在用户群体 一个应用要在多类设备上提供统
  • 【vscode安装以及c++环境配置】

    TOC vscode安装以及c 环境配置 VScode安装 安装vscode vscode官方下载 C 环境配置 安装c 环境 MinGw官方下载网址 下载版本选择 Architecture 如果电脑系统是64位就选x86 64 如果电脑系
  • 论文笔记之CentripetalNet

    提出使用向心偏移来对同一实例中的角点进行配对 此外又设计了一个 corner star deformable convolution network 十字星可变形卷积网络来适应corner特征 CVPR2020接收 论文地址 https a
  • 斐波那契数列的两种解题思路:递归VS迭代

    一 问题描述 要求输入一个整数n 请你输出斐波那契数列的第n项 二 算法分析 给出一系列斐波拉契数列 0 1 1 3 5 8 13 21 通过观察 很容易发现 1 n 0 1 f n f n 1 f n 2 n gt 1 三 算法设计 递归
  • 如何将数据从Activity返回到Fragment——onActivityResult

    一段时间没有写了 背景是这样的 MainActivity中启动Fragment Fragment启动OtherActivity 在OtherActivity中的数据需要返回到Fragment中 关于数据是怎么传输的 可以看这里 传送门 An
  • spring-boot-configuration-processor问题

    spring boot configuration processor问题 配置 application yml 时没有关联提示 配置好的属性提示 Cannot resolve configuration property xxxx 解决方
  • 【Mybatis】mysql插入记录后返回自增主键id的方法和注意事项

    插入记录后返回自增主键id mapping文件的insert标签中加入如下标签 指明主键名 keyProperty 执行方式 order 为新增完再返回执行 因为只有插入完成后获取的id才是最新的 返回值是Integer类型 也就是新增后返
  • Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)

    系列文章 2 15 0之前版漏洞相关文章 Log4j2注入漏洞 CVE 2021 44228 万字深度剖析 一 开篇与基础知识 Log4j2注入漏洞 CVE 2021 44228 万字深度剖析 二 漏洞原理 Log4j2注入漏洞 CVE 2
  • 卡尔曼滤波学习笔记

    Kalman Filter 直观理解 1 描述 2 例子 适用范围 1 线性系统 2 噪声服从高斯分布 相关公式 1 原始公式 2 预测公式 3 更新公式 4 初值赋予 5 总结 应用例子 代码实现 公式理解 1 协方差矩阵的理解 1 1
  • 火柴棍等式

    描述 给你n根火柴棍 你可以拼出多少个形如 A B C 的等式 等式中的A B C是用火柴棍拼出的整数 若该数非零 则最高位不能是0 用火柴棍拼数字0 9的拼法如图所示 注意 1 加号与等号各自需要两根火柴棍 2 如果A B 则A B C与
  • qt---收音机多柱进度条实现

    1 底层用普通进度条 实现进度显示 2 放置label 背景图 放置柱状 垂直线 线条透明 3 设置为透明状态
  • Pinia 是否可以代替 Vuex ?

    文章目录 一 介绍 二 对比 Pinia 与 Vuex 对比 三 使用 1 安装 2 注册 3 创建单个 store 4 组件内引用 5 更新 store 数据的4种方式 1 直接修改特定的值 2 利用 patch 批量修改 3 利用 pa