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