前端 vue 面试题 (一)

文章目录

    • v-if,v-show差别
    • v-for和v-if
    • 虚拟dom解决什么问题
    • vue的data为什么返回函数不返回对象
    • 比较vue,react
    • vue双向绑定原理
    • vue虚拟dom 的diff算法
    • vue 虚拟dom的diff算法的时间复杂度
    • vue2与vue3的区别
    • vue数据缓存,避免重复计算
    • 单页应用怎么跨页面传参
    • vue中key的作用

前端 vue 面试题 (一)_第1张图片

v-if,v-show差别

v-if 和 v-show 是 Vue.js 中用于条件性渲染的两个指令,它们有一些重要的区别。

初始化渲染时的差别:

v-if:只有在表达式为真时才会渲染元素,否则元素不会存在于 DOM 中。
v-show:元素总是会被渲染,只是通过 CSS 控制其显示或隐藏。

性能差别:
v-if:当条件为假时,DOM 元素会被销毁,再次为真时重新创建。因此,在条件频繁切换时,可能会有一些性能开销。
v-show:无论条件是真还是假,DOM 元素总是保持在 DOM 树中,只是通过 CSS 的 display 属性来控制显示或隐藏。在条件频繁切换时,相对而言性能开销较小。
适用场景:

v-if:适用于在运行时很少改变条件的情况,因为它有一些 DOM 操作的开销,适合在条件切换不频繁的场景。
v-show:适用于需要频繁切换条件,并且元素的初始化渲染开销较小的情况。

v-for和v-if

如果是vue2 ,当v-for和v-if同时出现在同一个标签上,v-for的优先级高于v-if,每次循环都会进行v-if的判断,开销较大。
如果是vue3,当v-for和v-if同时出现在同一个标签上,v-if的优先级高于v-for。

虚拟dom解决什么问题

提高性能:
减少直接操作真实DOM的开销: 直接对真实DOM进行频繁的操作可能会导致页面性能问题,因为DOM操作是相对昂贵的。虚拟DOM允许框架在内存中构建一个虚拟的DOM树,通过对虚拟DOM进行操作,减少对真实DOM的直接操作次数。

批量更新: 虚拟DOM可以进行批量的、异步的DOM更新,而不是每次数据变化都立即操作真实DOM。通过在内部进行批处理,减少了大量中间状态的计算和重绘,提高了性能。

Diff算法: 虚拟DOM 本身就是一个复杂的对象,核心是实现了一套高效的Diff算法,可以在前后两个虚拟DOM树之间进行比较,比较的是两个对象的差异,不是比较真是的dom是否相同。找出最小的变更,并将这些变更应用到真实DOM上。这种策略避免了全量的DOM操作,提高了性能。

vue的data为什么返回函数不返回对象

当你将 data 定义为一个普通对象时,这个对象会在组件间共享。如果多个组件使用相同的对象引用,它们将共享相同的状态,这可能导致不可预测的行为,特别是在涉及到响应式数据和状态管理时。

通过返回一个函数,Vue.js 可以为每个组件实例创建一个独立的数据对象,确保它们之间的状态不会相互干扰。这种做法也符合 Vue.js 的响应式数据系统的设计,使得当数据发生变化时,相关的组件可以正确地进行更新。

比较vue,react

Vue.js和React.js都是流行的JavaScript库,用于构建用户界面,但它们有一些关键的区别。以下是一些Vue.js和React.js之间的主要区别:

  1. 设计和理念:

    • Vue.js: 设计简单、灵活,更容易上手。Vue强调渐进式框架,可以逐步地应用到项目中。
    • React.js: 设计更加灵活且功能强大,但可能对初学者有一定的学习曲线。React注重构建可复用的组件。
  2. 模板语法和 JSX:

    • Vue.js: 使用基于HTML的模板语法,将模板直接写在HTML中。
    • React.js: 使用JSX(JavaScript XML),这是一种在JavaScript中嵌套XML标签的语法。JSX允许在JavaScript代码中直接编写类似XML的结构。
  3. 组件通信:

    • Vue.js: 支持父子组件通信、兄弟组件通信、以及通过事件总线或Vuex(状态管理库)进行跨组件通信。
    • React.js: 父子组件通信通过props,而跨组件通信通常需要通过提升状态(lifting state up)或使用全局状态管理库,如Redux。
  4. 状态管理:

    • Vue.js: 包含了Vuex,一个专门用于状态管理的库。Vuex提供了一种集中式管理状态的方式。
    • React.js: 可以使用Context API来进行状态管理,但更常见的是使用独立的状态管理库,如Redux。
  5. 生命周期:

    • Vue.js: 拥有明确的生命周期钩子,例如beforeCreatecreatedmounted等。
    • React.js: 也有生命周期方法,包括componentDidMountcomponentWillUnmount等。
  6. 指令和特性:

    • Vue.js: 提供了丰富的指令,如v-ifv-forv-bind等,用于操作DOM。
    • React.js: 使用属性(props)和状态(state)来管理组件的渲染和行为。
  7. 学习曲线:

    • Vue.js: 相对较低的学习曲线,尤其适合初学者。
    • React.js: 初始学习曲线可能较陡峭,但一旦掌握了基本概念,会变得更容易。
  8. 社区和生态系统:

    • Vue.js: 在中国社区有较大影响力,生态系统不如React庞大,但在一些场景中更受欢迎。
    • React.js: 拥有庞大的社区和生态系统,广泛应用于大型项目和企业级应用。

vue双向绑定原理

前端 vue 面试题 (一)_第2张图片

Vue的双向数据绑定是通过其响应式系统来实现的。Vue使用了一种称为"响应式数据绑定"的机制,该机制基于ES5的Object.defineProperty,以及ES6的Proxy来实现。下面是Vue双向绑定的基本原理:

  1. 数据劫持: Vue会对数据对象进行递归遍历,对对象的每个属性都使用Object.definePropertyProxy进行劫持。这样,当访问或修改对象的属性时,Vue就能够截获这个操作,进行相应的处理。

  2. 创建Watcher: Vue会为模板中使用到的每个数据属性创建一个Watcher对象。Watcher对象会订阅数据对象的变化,在数据变化时负责更新视图。

  3. 模板编译: Vue会将模板编译成渲染函数,渲染函数中包含了对数据的访问,这些访问触发了数据的get操作,从而建立了依赖关系。

  4. 触发更新: 当数据发生变化时,通过set方法通知相关Watcher对象,Watcher对象再调用渲染函数,最终更新视图。

  5. 双向绑定: 对于表单元素(例如