pinia与Vuex高频面试题

1. 谈谈你对vuex的理解?

所谓的vuex其实就是vue官方给我们提供的一个状态管理工具,通过vuex我们可以实现组件之间数据共享的问题

vuex一共有5大核心,分别是
state,里面保存的是状态,也可以理解为是数组,
getters,他们用来获取state里面的状态,并且可以对state的数据进行处理之后在返回,有点类似于vue的计算属性
mutations,他的作用主要是用来修改state里面的数据,不过在mutations里面只能进行同步的操作
actions,这个actions也可以去改变state的状态,不过在actions里面定义的方法可以进行异步操作
modules,如果当我们的项目比较大的时候,那么保存的状态也会增加,如果都写到index.js文件里面,文件的内容就会变得特别臃肿,后期难以维护,所以我们可是使用modules进行模块化的处理,将多个状态抽离到对应js文件里面,最后在modules进行合并,这样后期就方便维护了.

如果我们要获取state里面的状态,我们可以通过this.$store.state来进行获取,如果要调用getters里面的方法,我们可以通过this.$store.getters来进行调用,如果要调用muations里面的方法我们需要使用this,$store.commit来触发,如果调用actions里面的方法,我们一般通过this.$store.dispacth来进行触发. 除了这种方式以外,我们还可以通过辅助函数的方式来进行调用和触发(mapState, mapMutation,mapAction,mapGetters)mapState、mapGetters在computed里调用,mapMutation,mapAction在methods里调用

在项目当中如果要改变state的状态,我们一般是在组件里面调用this.$store.dispatch方式来触发actions里面的方法,在actions里面的方法通过commit来调用mutations里面定义的方法来改变state,同时这也是vuex的执行机制

不过vuex也有一些弊端,比如浏览器刷新的时候,vuex的数据会丢失,我们一般结合本地存储来解决,当我们在mutations里面改变state的时候在通过localStorage或者sessionStorage存储到本地,然后在state的状态的属性值那块写一个三元表达式,如果本地存在数据的话则读取本地存储的数据,否则就赋值为null在项目当中我一般使用vuex会保存用户信息和token以及其他的一些状态. 以上就是我对vuex的理解.

2.Vuex 和单纯的全局对象有什么区别?

Vuex 的状态存储是响应式的。当 Vue 组件从store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样可以方便地跟踪每一个状态的变化,从而能够实现一些工具帮助更好地了解我们的应用。

3.为什么 Vuex 的 mutation 中不能做异步操作?

Vuex 中所有的状态更新的唯一途径都是mutation异步操作通过Action 来提交 mutation 实现,这样可以方便地跟踪每一个状态的变化,从而能够实现一些工具帮助更好地了解我们的应用。

每个 mutation 执行完成后都会对应到一个新的状态变更,这样devtools就可以打个快照存下来,然后就可以实现time-travel了。

如果 mutation 支持异步操作,就没有办法知道状态是何时更新的,无法很好的进行状态的追踪,给调试带来困难。

4.DIFF 算法的原理

在新老虚拟 DOM 对比时:

首先,对比节点本身,判断是否为同一节点,如果不为相同节点,则删除该节点重新创建节点进行替换

如果为相同节点,进行 patchVnode,判断如何对该节点的子节点进行处理,先判断一方有子节点一方没有子节点的情况(如果新的children 没有子节点,将旧的子节点移除)

比较如果都有子节点,则进行 updateChildren,判断如何对这些新老节点的子节点进行操作(diff 核心)。匹配时,找到相同的子节点,递归比较子节点在 diff 中,只对同层的子节点进行比较,放弃跨级的节点比较,使得时间复杂从 O(n

3)降低值 O(n),也就是说,只有当新旧children都为多个子节点时才需要用核心的 Diff 算法进行同层级比较。

5.Vuex 有哪几种属性?

有五种,分别是 State、 Getter、Mutation 、Action、Module

state => 基本数据(数据源存放地)

getters => 从基本数据派生出来的数据

mutations => 提交更改数据的方法,同步

actions => 像一个装饰器,包裹

mutations,使之可以异步。

modules => 模块化 Vuex

6.虚拟 DOM 的解析过程

虚拟 DOM 的解析过程:

首先对将要插入到文档中的 DOM 树结构进行分析,使用js 对象将其表示出来,比如一个元素对象,包含 TagName、props 和Children这些属性。然后将这个 js 对象树给保存下来,最后再将DOM片段插入到文档中。

当页面的状态发生改变,需要对页面的 DOM 的结构进行调整的时候,首先根据变更的状态,重新构建起一棵对象树,然后将这棵新的对象树和旧的对象树进行比较,记录下两棵树的的差异。最后将记录的有差异的地方应用到真正的DOM 树中去,这样视图就更新了。

7.Pinia 是什么?和 Vuex 有什么区别?

Pinia 是 Vue 官方推荐的状态管理库,支持 Vue 2/3。

区别:

  • 更简洁的 API(无需 mutations,直接修改 state)。
  • 完整的 TypeScript 支持。
  • 模块化设计(无需嵌套模块)。
  • 支持 Composition API 和 Options API。
  • 更轻量(约 1KB)。

8.为什么 Pinia 移除了 mutations?

简化流程,直接通过 actions 修改 state,减少代码冗余。

9.Pinia 如何支持调试?

支持 Vue DevTools,可追踪 state 变化和 actions 调用。

10.Pinia 的 store 之间如何通信?

直接导入另一个 store 并调用其方法。

相关推荐
赵庆明老师1 分钟前
vben开发入门5:vite.config.ts
前端·html·vue3·vben
qq_12084093711 分钟前
Three.js 工程向:实例化渲染 InstancedMesh 的批量优化
前端·javascript
起这个名字5 分钟前
LangGraphJs 核心概念、工作流程理解及应用
前端·人工智能
小赵同学WoW6 分钟前
vue组件基础知识
前端
牛奶15 分钟前
浏览器藏了这么多神器,你居然不知道?
前端·chrome·api
WebInfra20 分钟前
Rspack 2.0 正式发布!
前端·javascript·前端框架
极速蜗牛27 分钟前
Cursor最近变傻了?
前端
码字小学妹37 分钟前
Claude Opus 4.7 接入指南(2026):国内配置 + xhigh 推理 + 成本计算
前端
小赵同学WoW38 分钟前
插槽【vue2】与 【vue3】对比
前端
代码随想录39 分钟前
Agent大厂面试题汇总:ReAct、Function Calling、MCP、RAG高频问题
前端·react.js·前端框架