前端面试题2(vue)

发布于:2025-08-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

1、Vue 的生命周期钩子有哪些,每个步骤发生了什么,越详细越好 ?(腾讯、货拉拉、滴滴、58、同花顺)
引用自:https://blog.csdn.net/weixin_45925028/article/details/132580845
在这里插入图片描述vue生命周期就是指vue实例从创建到销毁的过程,在vue中分为8个阶段:创建前beforeCreate/后created,载入前beforeMount/后mounted,更新前beforeUpdate/后updated,销毁前beforeDestroy/后destroyed。
beforeCreate:这个阶段实例已经初始化,只是数据观察与事件机制尚未形成,不能获取DOM节点(没有data,没有el)
在new一个vue实例后,只有一些默认的生命周期钩子和默认事件,其他的东西都还没创建。在beforeCreate生命周期执行的时候,data和methods中的数据都还没有初始化。不能在这个阶段使用data中的数据和methods中的方法

created:实例已经创建,仍然不能获取DOM节点(有data,没有el)
使用场景:模板渲染成html前调用,此时可以获取data和methods,可以初始化某些属性值,然后再渲染成视图,异步操作可以放在这里
data 和 methods都已经被初始化好了,如果要调用 methods 中的方法,或者操作 data 中的数据,最早可以在这个阶段中操作

beforeMount:是个过渡阶段,此时依然获取不到具体的DOM节点,但是vue挂载的根节点已经创建(有data,有el)
执行到这个钩子的时候,在内存中已经编译好了模板了,但是还没有挂载到页面中,此时,页面还是旧的
mounted:数据和DOM都已经被渲染出来了
使用场景:模板渲染成html后调用,通常是初始化页面完成后再对数据和DOM做一些操作,需要操作DOM的方法可以放在这里
执行到这个钩子的时候,就表示Vue实例已经初始化完成了。此时组件脱离了创建阶段,进入到了运行阶段。 如果我们想要通过插件操作页面上的DOM节点,最早可以在和这个阶段中进行
beforeUpdate:检测到数据更新时,但在DOM更新前执行
当执行这个钩子时,页面中的显示的数据还是旧的,data中的数据是更新后的, 页面还没有和最新的数据保持同步
updated:更新结束后执行
使用场景:需要对数据更新做统一处理的;如果需要区分不同的数据更新操作可以使用$nextTick
页面显示的数据和data中的数据已经保持同步了,都是最新的
beforeDestroy:当要销毁vue实例时,在销毁前执行
Vue实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁
destroyed:销毁vue实例时执行
这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于不可用状态。组件已经被销毁了。

2、哪些钩子中可以获取到 DOM 节点? (快手)
mounted 、updated、beforeDestroy

3、Vue 数据响应式原理(腾讯、58、快手、网易、小米、百度、知乎)
vue2 采用Object.defineProperty实现

  • 数据劫持:在vue中,当你把一个普通js对象传给vue实例作为data选项时,vue将遍历次对象所有的属性,并使用Object.defineProperty()把这些属性全部转为getter/setter。这样,vue能够追踪到属性的变化,并在属性被访问和修改时执行相应的操作
  • 依赖追踪:vue内部维护了一个依赖收集的系统,每个响应式对象都有一个对应的依赖集合,当数据被访问时,会把当前的Watcher(观察者)记录下来。这样,当数据发生变化时,依赖于这个数据的所有Watcher都会被通知,进而更新相应的视图。
  • 派发更新:当响应式数据发生变化时,vue会遍历依赖集合,通知相关的Watcher更新视图

vue3采用proxy实现
Proxy 可以创建一个对象的代理,从而实现对目标对象的操作拦截,Vue 3 正是利用这一特性,将用户定义的数据(如 data、reactive 创建的对象)包装成代理对象。
reactive():将对象转换为响应式对象。
ref():将基本类型(如 number、string)或对象封装成响应式引用。


网站公告

今日签到

点亮在社区的每一天
去签到