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 并调用其方法。

相关推荐
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 34--基础知识 9--文件上传功能
前端·python·测试工具·ui·pytest
.生产的驴2 小时前
泛微E10二开 前端Ecode拦截器
前端
亿元程序员2 小时前
PinK(Cocos4.0?)生成飞机大战,抢先体验全流程!
前端
晓得迷路了2 小时前
栗子前端技术周刊第 111 期 - Next.js 16.1、pnpm 10.26、Bun 1.3.5...
前端·javascript·bun
CodeSheep2 小时前
中国四大软件外包公司
前端·后端·程序员
七月shi人2 小时前
使用Node版本管理包n,在MAC电脑权限问题
前端·macos
shangxianjiao2 小时前
vue前端项目介绍项目结构
前端·javascript·vue.js
Mike_jia2 小时前
4ga Boards:重新定义高效协作的实时看板工具实战指南
前端
袖手蹲2 小时前
Arduino UNO Q使用Streamlit构建WebUI:零前端经验打造交互式硬件控制
前端