pinia和vuex的区别

news2025/1/16 8:08:40

pinia和vuex的区别

什么是“状态管理模式”?

const Counter = {
  // 状态
  data () {
    return {
      count: 0
    }
  },
  // 视图
  template: `
    <div>{{ count }}</div>
  `,
  // 操作
  methods: {
    increment () { 
      this.count++
    }
  }
}

createApp(Counter).mount('#app')


这个状态自管理应用包含以下几个部分:

  • 状态,驱动应用的数据源;

  • 视图,以声明方式将状态映射到视图;

  • 操作,响应在视图上的用户输入导致的状态变化

    以下是一个表示“单向数据流”理念的简单示意:
    在这里插入图片描述
    但是,当我们的应用遇到多屏幕编辑 Markdown文章功能;

  1. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  2. 增加了 检查列表 功能。

量架构。

vuex是采用集中式管理组件依赖的共享数据的一个工具,可以解决不同组件数据共享问题

在这里插入图片描述

  • 修改state状态必须通过mutations
  • mutations只能执行同步代码,类似ajax,定时器之类的代码不能在mutations中执行
  • 执行异步代码,要通过actions,然后将数据提交给mutations才可以完成
  • state的状态即共享数据可以在组件中引用
  • 组件中可以调用action

pinia

Pinia 是 Vue.js 的轻量级状态管理库,它允许您跨组件/页面共享状态。最近很受欢迎。它使用 Vue 3 中的新反应系统来构建一个直观且完全类型化的状态管理库。

其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。

设置

Vuex 设置

npm install vuex --save
# or npm
yarn add vuex --save

要创建store,你可以使用包含创建基本store所需的states、actions和 getter 的对象调用 createStore 方法:

import Vue from 'vue'
import { Vuex } from 'vuex'
Vue.use(Vuex)

const useStore = new Vuex.Store({
  // 仓库 基本上是一个容器
  state: {
    todos: [
      { id: 1, text: '...', done: true },
    ],
    count: 0
  },
  //类似于vue中的计算属性
  getters: {
    doneTodos (state) {
      return state.todos.filter(todo => todo.done)
    },
    getCount(state, count){
      state.count = count;
    }
  },
  // 同步函数 修改state函数
  mutations: {
    increment (state) {
      state.count++
    },
    setCount(state){
      state.count++;
    }
  },
  // Action 提交的是 mutation,而不是直接变更状态。
   //  Action 可以包含任意异步操作。
  actions: {
    increment (context) {
      context.commit('increment')
    }
  },
  //将store分割成模块(module),每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:
   modules: {
   }
})

export default useStore

对于大型的项目把vuex相关代码分割到模块中

在这里插入图片描述

为什么Vuex要通过mutations修改state,而不能直接修改?

因为state是实时更新的,mutations无法进行异步操作,而如果直接修改state的话是能够异步操作的,当你异步对state进行操作时,还没执行完,这时候如果state已经在其他地方被修改了,这样就会导致程序存在问题了。所以state要同步操作,通过mutations的方式限制了不允许异步。

怎么保持页面刷新vuex数据不丢失?

将vuex中的数据直接保存到浏览器缓存中(sessionStorage、localStorage、cookie)

在父页面向后台请求远程数据,并且在页面刷新前将vuex的数据先保存至sessionStorage

created() {
    // 判断缓存中是否有数据
    if (seIuY3ore')) {
      // Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
      this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem('store'))));
    }
    // 监听 在页面刷新时将vuex里的信息保存到sessionStorage里
    window.addEventListener('beforeunload', () => {
      sessionStorage.setItem('store', JSON.stringify(this.$store.state));
    });
  }

vuex-persistedstate插件

npm install vuex-persistedstate --save
可以选择数据存储的位置,可以是localStorage/sessionStorage/cookie,此处以存储到sessionStorage为例,配置如下:
import createPersistedState from "vuex-persistedstate"

const store = new Vuex.Store({
  // ...
  plugins: [createPersistedState({
      storage: window.sessionStorage
  })]
})

pinia设置

yarn add pinia@next
# or npm
npm install pinia@next

Pinia是一个围绕Vue 3 Composition API的封装器。

import type { App } from 'vue';
import { createPinia } from 'pinia';

const store = createPinia();

export function setupStore(app: App<Element>) {
  app.use(store);
}

export { store };

为了创建一个store,你用一个包含创建一个基本store所需的states、actions和getters的对象来调用 defineStore 方法。

import en-dash, --- ivrsefinetoo e{
  id: 'todo', // 唯一值
  state: () => ({
   count: 0,
   title: "hello",
   list: [1, 2, 3, 4]
  }),
  // 用来封装计算属性 有缓存功能  类似于computed
  getters: {
     getCount(): Number{
       // this指向的便是store实例
       return this.count;
     },
     getCountAdd(): string{
       return this.title+ this.getCount; // 调用其它getter
     }
  },
  // 支持同步和异步
  actions: {
    setCount(){
       this.count++
    }
  }
  
  // 数据持久化
  // npm i pinia-plugin-persist
  persist: {
  **LaTeX** 数学表达式[here][1].

##, / 新的甘特图功能,丰富你的文章
 ``rmaid
gantt
        //key的名称
        title Adding GANTT diagram functionality to mermaid
        storage: sessionStorage,
        已完成 进去              :done,    des1, 2014-01-06,2014-01-08
        进行中     `

Pinia没有modules,如果想使用多个store,直接定义多个store传入不同的id即可,如:

`   f"

p:act const storeA = defineStore("storeA", {...});
export const storeB = defineStore("storeB", {...});
export const storeC = defineStore("storeB", {...});

├── modulers
│ ├── user (具体模块,以实际项目为准)
│ │ └── index.ts (store定义)
│ │ └── types.ts (store类型)
├── index.ts (用于导出store)

**数据持久化使用pinia-plugin-persist **

export const useTodoStore = defineStore({
  id: 'todo', // 唯一值
  // 数据持久化
  persist: {
    enabled: true, // 开启缓存 
    strategies: [
      {
        // 可以自定义,不填默认是store的ID
        key: 'user',
        //更改默认存储,可以更改为localStorage
        section 现有任务
        // 可以选择哪些进入存储,这样就不用全部都进去存储了
        // 默认是全部进去存储
        paths: ['list']
      }
    ]
  }
})

使用

pinia使用

import { storeToRefs } from 'pinia'  // 使用storeToRefs方法解构
export default defineComponent({
  setup() {
    const todo = useTodoStore()
    
    
    // 解构 可以保证解构出来的数据也是响应式的 
    let { count, title} = storeToRefs(todo)
    
    // 修改值
    todo.count = 2
    // 批量修改多个值
    todo.$patch({
      counter: store.count ++,
      title: 'work',
    )}
    // $patch工厂函数方式
    todo.$patch((state) => {
      state.count = 99;
      state.title = 'work'
    })
    //  $state 缺点是必须修改整个对象
    todo.$state = { count: 88, title: '修改值' }
    // 使用action 修改
    todo.increment()
    
    
    // 重置 初始值
    todo.$reset()
    
    
    return {
      // 只允许访问特定的state  获取
      state: todo.title,
    }
  },
})


请注意,在访问其属性时省略了 store 的 state 对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QE0Ja7c6-1672971388997)(https://secure2.wostatic.cn/static/x6TFWNNQMHTcX4eRYPt55v/image.png?auth_key=1672971368-8uk7go5wrAQSEahNSKmBRd-0-a3fe237b5412b64770514076eff2c1b0)]

vuex使用

export default {
  data(){
    return{
      count: this.$store.state.count
    }
  },
  computed: {
    count: {
      get () {
        return this.$store.state.count
      },
      set (value) {
        this.$store.commit('count', value)
      }
    }
  }
}

性能对比

Pinia和Vuex都非常快,在某些情况下,使用Pinia的web应用程序会比使用Vuex更快。这种性能的提升可以归因于Pinia的极轻的重量,Pinia体积约1KB。

尽管Pinia是在Vue devtools的支持下建立的,但由于Vue devtools没有暴露出必要的API,所以一些功能如时间旅行和编辑仍然不被支持。当开发速度和调试对你的项目来说更重要时,这是值得注意的。

优缺点

  • Vuex的优点

    支持调试功能,如时间旅行和编辑(vuex执行的错操作会被记录下来,返回回退到此操作的状态)

    适用于大型、高复杂度的Vue.js项目

  • Vuex的缺点

    从 Vue 3 开始,getter 的结果不会像计算属性那样缓存

  • Pinia的优点

    完整的 TypeScript 支持:与在 Vuex 中添加 TypeScript 相比,添加 TypeScript 更容易极其轻巧(体积约 1KB)

    支持插件扩展功能

    支持模块热更新无需加载页面可以修改容器,可以保持任何现有的状态

    pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑减少了我们工作量。

    action支持同步和异步

    支持服务端渲染

  • Pinia的缺点

    不支持时间旅行和编辑等调试功能

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

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

相关文章

字符串题记

经典字符串leetcode题 文章目录经典字符串leetcode题反转字符串第一种方法&#xff1a;使用string里的库函数reverse第二种方法&#xff1a;使用自己写的swap函数第一种swap函数第二种swap函数151.翻转字符串里的单词28. 实现 strStr()KMP算法459.重复的子字符串第一种&#xf…

UE4 后期材质节点学习

以下对应的效果&#xff1a; 材质后期在这里进行设置&#xff1a; 在这里调整场景的整体的饱和度 场景的对比度 灰度系数的调整 高光度/图像增益 灰阶偏移的设置 想了解这些专业名词可以看&#xff1a;相机gain lift gamma offset参数意义_baobei0112的博客-CSDN博客_相机gai…

Redis学习笔记(一)Linux下安装部署Redis

一、下载Redis 1、进入官网&#xff0c;进入download页面 https://redis.io/download&#xff0c;找到“List of all releases and hash digests”&#xff0c;点击“ listing of all previous Redis releases on the releases page”&#xff0c;可以进入所有版本下载页面。 …

STM32——DMA直接存储器访问

文章目录一、DMA直接存储器存取DMA简介二、存储器映像三、DMA框图四、DMA基本结构五、DMA请求&#xff08;触发源&#xff09;六、数据宽度与对齐七、存储器到存储器的DMA转运原理图关键代码八、外设到存储器的DMA转运原理图硬件链接图关键代码九、其他一、DMA直接存储器存取 …

【图像分类】4.ResNet残差模块卷积网络的神

ResNet重要性不必多说了吧&#xff0c;论文引用破10w&#xff0c;是我见过最多的&#xff0c;yyds&#xff01; 在对照博主霹雳吧啦和官方pytorch的代码下&#xff0c;手撸一个resnet。如果没有看着代码写&#xff0c;不确定自己是否能根据论文写出model&#xff0c;而且写优雅…

java学习day69(乐友商城)用户注册

今日目标&#xff1a; 创建用户中心 了解面向接口开发方式 实现数据校验功能 实现短信发送功能 实现注册功能 实现根据用户名和密码查询用户功能 1.创建用户中心 用户搜索到自己心仪的商品&#xff0c;接下来就要去购买&#xff0c;但是购买必须先登录。所以接下来我们编…

STM32MP157驱动开发——Linux IIO驱动(下)

STM32MP157驱动开发——Linux IIO驱动&#xff08;下&#xff09;0.前言一、IIO 触发缓冲区1.IIO 触发器2.申请触发器3.释放触发器4.注册触发器5.注销触发器6. IIO 缓冲区7.向驱动程序添加触发缓冲功能8.驱动编写9.触发缓冲测试10.缓冲区读取二、测试App三、测试结果0.前言 上一…

【C++高阶数据结构】B树、B+树、B*树

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

高等数学(第七版)同济大学 习题11-3 (前7题)个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题11-3&#xff08;前7题&#xff09; 函数作图软件&#xff1a;Mathematica 1.计算下列曲线积分&#xff0c;并验证格林公式的正确性&#xff1a;\begin{aligned}&1. \ 计算下列曲线积分&#xff0c;并验证格林公式的正…

PyTorch深度学习快速入门教程

PyTorch深度学习快速入门教程1、Pytorch加载数据2、Tensorbord的使用3、Transforms的使用4、常见的Transforms5、torchvision中的数据集使用6、DataLoader的使用7、神经网络的基本骨架—nn.module8、卷积操作9、神经网络—卷积层10、神经网络—池化层的使用11、神经网络—非线性…

靴子落地!Mobileye正式启动4D成像雷达量产进程

4D毫米波雷达赛道正在变得越来越拥挤。 在传统雷达时代&#xff0c;全球主要的市场参与者屈指可数&#xff0c;博世、大陆、安波福、海拉等少数几家巨头几乎垄断前装市场。如今&#xff0c;随着4D时代的开启&#xff0c;越来越多的新进入者希望能够实现换道超车&#xff0c;这…

Jar 组件自动化风险监测和升级实践

背景 以 Xstream、Jackson、Fasjson 等为代表的 Jar 组件高危漏洞层出不穷&#xff0c;安全组每年 N 次推动业务线进行第三方 Jar 组件升级&#xff0c;每次升级动辄涉及成百上千个应用服务&#xff0c;给双方都带来了沉重的负担。为了降低安全组在 Jar 组件升级期间的工作量&…

JS 如何利用浏览器的 cookie 保存用户名

前言 浏览器的cookie可以用来存储一些少量的网站信息,比如登录的用户名,用于提高用户体验非常有帮助 有的一些网站在第一次登录后,在指定的时间范围内容,下次在打开网站,再次登录时,不用每次都重新输入用户名的 或在做一些购物车效果时,也可以使用cookie,保持一个状态持续多…

【数据结构与算法——C语言版】3. 二分查找

前言 本文将介绍在线性表查找中非常常用的一种查找算法——二分法&#xff0c;先介绍二分查找法的核心思路&#xff0c;然后进行代码讲解&#xff0c;最终给出二分查找法的时/空复杂度&#xff0c;并比较其和上篇文章【数据结构与算法——C语言版】2. 数组介绍的顺序查找的区别…

神经网络漫谈(一)

神经网络漫谈(一) 发表时间&#xff1a; 2023年1月6日创作地点&#xff1a;湖北省武汉市作者&#xff1a;ixy_com&Bill Kromydas封面图片来源&#xff1a;Towards Data Science 1、背景 基本概念&#xff1a;神经网络&#xff0c;也称为人工神经网络 (ANN) 或模拟神经…

基础数据结构——二叉树

目录 一、二叉树性质 1、满二叉树、完全二叉树 2、平衡二叉树 3、不平衡二叉树 二、二叉树的存储 1、普通做法 2、竞赛做法 三、二叉树的遍历 1、宽度优先遍历 2、深度优先遍历 &#xff08;1&#xff09;先&#xff08;根&#xff09;序遍历 &#xff08;2&#x…

【java中的集合框架】学习接触java中的集合,走上学习数据结构道路

前言&#xff1a; 大家好&#xff0c;我是良辰呀&#x1f3eb;&#x1f3eb;&#x1f3eb;&#xff0c;从今天开始&#xff0c;我们一起来探索数据结构的知识海洋。期待与大家结伴同行&#xff0c;gogogo。&#x1f36c;&#x1f36c;&#x1f36c; &#x1f9d1;个人主页&…

【自学C++】C++命名空间

C命名空间 C命名空间教程 C 中的命名空间实际上就是一个由程序设计者命名的内存区域&#xff0c;程序设计者可以根据需要指定一些有名字的空间域&#xff0c;把一些全局实体分别放在各个命名空间中&#xff0c;从而与其他全局实体分隔开来。 命名空间是 ANSI C 引入的可以由…

前端入门笔记 03 —— Web(html CSS)布局

常用布局 包含两个定义&#xff1a; 尺寸 定位 定义通过CSS拾取网页元素&#xff0c;控制他们控制普通文档流&#xff0c;周边元素&#xff0c;父容器&#xff0c;浏览器窗口 覆盖默认布局行为盒子模型普通文档流 &#xff08;左到右&#xff0c;上到下&#xff09; 块级元素…

2022年中国数字化十大转型趋势

推动数字化发展既是数字时代构筑竞争新优势的战略选择&#xff0c;也是加快构建“双循环”新发展格局和打造高质量发展新引擎的现实需要。我国高度重视数字化发展&#xff0c;不断完善政策措施&#xff0c;着力推动数字化转型。从行业发展看&#xff0c;构建以数据为驱动、以客…