前言
收集了两周近 30 场面试遇到的问题,本文整理了其中 Vue 相关的面试题,由 ChatGPT 提供答案。
Vue 面试题
Vue 的实现原理是什么?
Vue 的实现原理是基于数据驱动视图的方式,即采用数据响应式原理,当数据发生变化时,驱动视图动态更新,实现双向绑定和单向数据流。其中包括响应式系统、模板引擎与虚拟DOM、渲染函数。
1、实现响应式系统:Vue 通过初始化实例时建立的Observer来处理数据响应,当数据变化时,会通知Dep实例,并重新渲染组件。 2、模板引擎与虚拟DOM:Vue 在初始化组件时,会把模板编译成虚拟DOM,不会立刻真用DOM渲染,以此提升渲染性能。 3、渲染函数:当Vue检测到数据变化时,会运行渲染函数创建页面,并与原来页面进行比较,发现出变化之处,只对变化的内容进行更新,以此提升性能。
Vue 中的双向数据绑定是什么?
Vue 的双向数据绑定是一种机制,用来实现视图和数据之间的联系。双向数据绑定能让我们能够在一个界面中改变某些数据,这些被修改的数据也能反映到界面中 elemets 上,也就是说,在一个界面中,你的输入和界面元素的状态可以保持同步。
Vue 中双向数据绑定的实现原理?
Vue 中实现双向数据绑定的原理是:Vue 通过 Object.defineProperty() ,重写了每个 Property 的 Setter 和 Getter 方法来对数据进行实时监听,当对象的值发生改变时,会触发 setter,然后更新 View;反之,当 View 发生改变时,会触发 getter,而 getter 由Vue 监听了,然后更新 Model。
Vue 中 Diff 算法的实现原理?
Vue 中的 Diff 算法是采用了简单的双指针算法来比较新旧 VNode(虚拟 DOM)树之间的差异。有两个指针分别指向新、旧 VNode 各自的子 VNode,新 VNode 的子 VNode 和旧 VNode 的子 VNode 依次比较,直到新 VNode 的子 VNode 中的指针位置比旧 VNode 的子 VNode 大(说明新 VNode 有多出来的 VNode),或者旧 VNode 的子 VNode 中的指针位置比新 VNode 的子 VNode 大(说明新 VNode 有少了的 VNode),或者两个指针同时相等但新旧 VNode 中的子 VNode 不相等(说明新旧 VNode 中的同一号子 VNode 不同)时停止。
若两个指针都比对到了对方的子 VNode 上,则认为整棵 VNode 树已经完全比对完毕,VNode 树没有发生变化。
若发现新 VNode 的子 VNode 有多出来的,则会将新 VNode 的子 VNode 挂载到 DOM 上,或者替换掉旧 VNode 的子 VNode;若发现新 VNode 的子 VNode 有少了的,则会将旧 VNode 的子 VNode 移除掉,从而实现了新旧 VNode 之间的比较,从而实现了 VNode 树的 Diff 算法。
Vue 和 React 原理上的区别?
Vue 是一个底层框架,而 React 是应用框架。
Vue 使用组件的语法与自定义元素以及它的绑定机制来构建用户界面,而 React 使用 JavaScript 对象来描述构建用户界面。
Vue 默认使用虚拟 DOM,而 React 则使用真实 DOM 来渲染节点。
Vue 能够更加灵活地实现状态管理,而 React 则更加清晰地实现状态管理。
Vue 支持实时渲染,而 React 无法实现实时渲染。
Vue 虚拟 DOM 实现原理?
Vue 虚拟 DOM 实现原理主要是通过对原始 DOM 元素进行复制(通过 Object.assign),创造出一个虚拟的 DOM 树,当在数据发送变化的时候,不会直接去更新原始 DOM,而是会比较新旧虚拟 DOM 的区别,然后按照新虚拟 DOM 来更新原始 DOM。这样可以有效减少重绘所带来的性能性能开销,提高渲染性能。
为什么Vue不用真实DOM来渲染节点?
Vue只需要一份虚拟DOM,在应用程序更新之后可以比较新旧虚拟DOM,确定准确的变化,这样就可以就可以非常快速的更新DOM而无需渲染整个树,从而减少了大量的计算时间。
Vue3 比 Vue2 最大的改变在哪里?
Vue3 的核心改变主要在以下方面:
- 采用新的构建系统和基于 Proxy 技术的响应式系统。
- 重新设计的组件系统,支持异步组件和服务端渲染。
- 增强的路由库,支持更高效的路由功能和更好的动态路由匹配。
- 更好的 TypeScript 支持,支持更多的语法。
- 支持本地策略缓存和渲染缓存,提升渲染性能。
- 优化的小程序支持,支持更多的小程序 API。
Vue 中渲染函数的原理?
Vue 的渲染函数可以用来生成一个虚拟 DOM 树,然后与真实 DOM 树进行比较,从而决定需要更新的 DOM 节点。Vue.js 对每一个元素都使用户提供的渲染函数,然后计算出它的虚拟 DOM 子树,比较它和它的前一个虚拟 DOM 的子树,然后确定最小的更新策略。这使得 Vue 在更新的时候,只更新视图中的必要的 DOM 更新,从而降低了页面的渲染时间。
Vue 中 Key 的原理是什么?
Vue 中的key是一个特殊的字符串标识符,把它指定给 Vue.js 中某个元素,以标识这个元素在数组中的位置。它的作用是使 Vue 在重新渲染列表的时候,能够追踪到列表的元素的位置,以确定该元素是新添加的还是被移动的,以此实现最佳的性能和渲染性能。
vue 通信方式有哪些?
Props
父组件通过 Props 向子组件传递参数,子组件可以通过 props 接收父组件传递的参数
Events
子组件可以通过 $emit 来触发父组件定义的事件,父组件可以通过 v-on 关键字来监听子组件触发的事件
Provide/Inject
父组件可以通过 provide 向它的子孙组件提供特定值,这个值可以通过 inject 获取
Vuex
使用 Vuex,可以在多个组件之间共享状态,并且可以实现不同组件之间的状态同步
vue 模板引擎实现原理?
Vue 模板引擎的实现原理如下:
- 使用 JavaScript 将模板字符串解析为抽象语法树 (AST)。
- 使用 AST 将抽象语法树编译为渲染函数,该函数将数据渲染为最终的 DOM 结构。
- 定义 Vue 的指令,如
v-for
、v-if
、v-show
等,用于对模板进行处理并生成对应的渲染函数。 - 在 Vue 实例中定义模板,在实例挂载时,解析模板并编译为渲染函数,并将渲染函数放入 Vue 实例中。
- 当数据变化时,调用渲染函数并将数据渲染到 DOM 中,实现视图响应式更新
Vue 生命周期有哪些?
Vue 生命周期
Vue 实例从创建到销毁的过程,就是生命周期。
Vue 的生命周期分为8个阶段:
- beforeCreate
- created
- beforeMount
- mounted
- beforeUpdate
- updated
- beforeDestory
- destoryed
Vue3 为什么不推荐使用 Mixin 了?
为什么不推荐使用 Mixin
Mixin 会使 Vue 的组件之间的可复用性急剧下降,因为 Mixin 会引入一些全局的属性和方法,对原有的组件产生混乱的影响。
Mixin 会导致组件的渲染结果不可预测,在组件之间混入同一个 Mixin 可能会有不一样的结果,而且很难追踪和调试。
Mixin 会导致自定义属性(props)和方法(methods)之间的命名冲突,从而破坏组件的功能,或者至少会使组件变得复杂和难以维护。
Mixin 会在一定程度上增加对组件的未知依赖,可能会导致意想不到的错误,而且也很难查找出来。
Vue3 相比 Vue2 改进?
Vue3 与 Vue2 相比改进
性能提升:Vue3 采用了新的渲染引擎,提升了整体渲染性能;
核心代码封装:Vue3 使用 ES6 将核心代码封装为模块,方便复用,减少代码体积;
TypeScript 支持:Vue3 全面支持 TypeScript,使开发更加简单,且更易于维护;
增强的 Composition API:Vue3 全新的 Composition API 替代旧的 Options API,增强了组件的复用能力,使组件的开发更灵活;
Fragments 支持:Vue3 支持 Fragments,可以将多个根节点放到单个模板中,可以更灵活地处理多根节点;
Teleport 支持:Vue3 支持 Teleport,可以在不同位置间传递组件,可以更灵活地定义视图;
SSR 改进:Vue3 对服务端渲染也做了一些改进,使加载更快,性能更优;
Virtual DOM 改进:Vue3 采用 Virtual DOM,优化了虚拟 DOM 的渲染机制,提升性能;
可靠的 UI 测试:Vue3 支持可靠的 UI 测试,使开发者更容易编写和维护单元测试。
Vue 的 key 为什么能优化列表性能?
Vue 的 key 是 Vue 所提供的一个属性,其作用是为 Vue 的每个元素赋予一个唯一的标示,在更新数据时,Vue 通过比较这个标示来区分新旧元素,以此来提高更新数据时列表渲染的性能。
Vue3 响应式实现原理?
Vue3 响应式实现原理?
Vue3 中的响应式实现原理基于 Proxy 对象。Proxy 对象用于定义和拦截对象属性的访问,可以拦截对象的以下操作:
- get
- set
- has
- deleteProperty
- ownKeys
- getOwnPropertyDescriptor
当在 Vue 的实例中声明一个属性时,Vue 将会通过 Proxy 重写对象的 getter 和 setter 方法,并将其变成响应式数据。当属性的值改变时,Vue 会自动更新对应的视图。
此外,Vue 还提供了一个 reactive 函数来让对象变成响应式,并可自定义 getter 和 setter 方法来实现响应式数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。