VUE 面试题

本文深入解析Vue.js的关键特性,包括MVVM原理、响应式数据机制、数组变动检测等,并对比v-if与v-show的区别,详述组件生命周期及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、谈一下你对 MVVM 原理的理解

二、说一下响应式数据的原理

三、vue  是如何检测数组变化

四、为何 vue 采用异步渲染

五、nextTick 实现原理

六、vue 中 computed 的特点

七、watch 中的 deep:true 如何实现的

八、vue 组件的生命周期

1、生命周期:

2、掌握每个生命周期内部可以做什么事情

3、 ajax 请求放在那个生命周期中

九、Vue 中的模板编译原理

十、Vue中 v-if 和 v-show区别

总结



前言

如果哪里不正确欢迎指出问题,我会积极改正的。


一、谈一下你对 MVVM 原理的理解

二、说一下响应式数据的原理

  • 核心点:Object.defineProperty
  • 理解:vue 是利用了 Object.defineProperty 的方法里面的 setter、getter 方法的观察者模式来实现的。 

【vue 在初始化数据时候,会给 data 中的属性使用 Object.defineProperty 重新定义所有属性,当页面渠道对应的属性时,会进行依赖收集(收集当前组件的 watcher ),如果属性发生变化会通知相关历来进行更新操作。】

三、vue  是如何检测数组变化

  • 核心点:使用函数劫持方式,重写数组方法
  • 理解:更改数组原型;监控数组里面的每一项

vue 将 data 中的数组,进行了原型链重写。指向了自己定义的数组原型方法,这样当调用数组的 api 时,可以通知依赖更新。如果数组中包含着引用类型,会对数组中的引用类型再次进行监控。

四、为何 vue 采用异步渲染

  • 核心点:提高性能
  • 理解:vue 是组件级更新。如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染,为了性能考虑,vue 会在本轮数据更新后,再去异步更新。

五、nextTick 实现原理

  • 核心点:异步方法
  • 理解:nextTick 方法主要是使用 宏任务 和 微任务 ,定义了一个异步的方法。多次调用 nextTick 会将方法存入队列中,通过这个异步方法清空当前队列。

六、vue 中 computed 的特点

  • 核心点:具备缓存的,只有当依赖的属性发生变化时候才会更新视图

1、computed 和 method 区别:

  • computed 必须有返回值(通过对数据处理返回一个结果), method 则均可
  • 模板中调用时,computed 不加 (),methods 必须加 ()
  • computed 有缓存功能,methods 没有缓存(computed 初次调用会执行函数,然后会缓存结果。再次被调用时候,如果依赖的响应式数据未发生改变,则返回缓存结果;发生改变,则会再次执行函数并缓存结果。    methods 被调用的时每次都要执行函数)

2、computed 和 watch 区别

  • computed 有缓存功能,watch 没有
  • computed 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
  • watch 支持异步
  • computed 是依赖的数据发生改变时,重新调用;
  • watch 是监听的响应式数据发生改变时,重新调用

3、watch 和 methods 区别

  • methods是每次调用都会执行函数
  • watch 不需要被调用,并且只有监听的数据发生改变的时候才会重新调用

七、watch 中的 deep:true 如何实现的

  • 理解:当用户指定 watch 中的 deep 属性为 true 时,如果当前监控的值时数组类型,会对对象中的每一项进行求值,此时会将当前 watcher 存入到对应的属性的依赖中,这样数组中的对象发生变化时也会通知数据更新。

八、vue 组件的生命周期

1、生命周期:

     创建-加载-更新-销毁

  • beforeCreate
  • created
  • beforeMount
  • mounted
  • beforeUpdate
  • updated
  • beforeDestory
  • distoryed

2、掌握每个生命周期内部可以做什么事情

  • beforeCreate: 实例刚在内存中被创建,还未初始化好 data 和 methods 属性,可以进行ajax请求;
  • created: 实例已在内存中创建完成,data 和 methods 已经创建好,但还没有开始编译末班,如果调用 methods 中的方法或者操作 data 中的数据,最早只能在此中操作;
  • beforeMount: 完成模板编译,但还没有挂载到页面中;
  • mounted: 实例已经挂载完成,可以进行一些 DOM 操作;
  • beforeUpdate:  data 值是新的,但是页面显示数据还是旧的,此时没有开始重新渲染DOM节点;
  • updated: 可以执行依赖于DOM的操作,该钩子在服务器渲染阶段不可调用(因为在大多数情况下,此期间更改状态会导致无限循环;
  • beforeDestory: 此时,实例还未销毁,完全可用;(当前页面使用了 $on 方法,需要在组件销毁前解绑;清除自己定义的定时器,解除事件绑定)
  • distoryed: 可以执行一些优化操作,清空定时器,解除绑定事件(调用后,vue 实例指示的所有东西都会解除绑定,所有事件监听器都会被溢出,所有子实例都会被销毁)。

3、 ajax 请求放在那个生命周期中

  • 在 created 中,视图中 dom 并没有渲染出来,所以如果直接操作dom点,会无法找到相关元素
  • 在 mounted 中,dom已经渲染出来,可以直接操作dom节点

一般情况下,放在mounted 中,保证逻辑的统一性,因为生命周期是同步执行的,ajax 是异步执行的

服务器渲染不支持mounted方法,suo在服务端渲染额情况下,统一放到 created 中

九、Vue 中的模板编译原理

  • 核心点:将template 转换成 render 函数

十、Vue中 v-if 和 v-show区别

  • v-if :通过条件判断动态的进行增删DOM元素,可以和v-else搭配(频繁进行增删DOM操作会影响页面加载速度和性能)
  • v-show:通过条件判断动态的进行显示和隐藏元素( display:""  和 display:none),不可以和v-else搭配

总结

本文章仅限于我自己在面试中的总结,记录下来分享给大家,希望对大家有帮助!

同时也预祝大家面试成功!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值