• 技术文章 >web前端 >Vue.js

    【整理分享】一些常见Vue面试题(附答案解析)

    青灯夜游青灯夜游2023-02-06 20:14:40转载79

    本次给大家分享一些关于Vue的常见面试题,带你梳理基础知识,增强Vue知识储备,值得收藏,快来看看吧!

    Vue 常见面试题总结

    MVVM模型?

    MVVM,是Model-View-ViewModel的简写,其本质是MVC模型的升级版。其中 Model 代表数据模型,View 代表看到的页面,ViewModelViewModel之间的桥梁,数据会绑定到ViewModel层并自动将数据渲染到页面中,视图变化的时候会通知ViewModel层更新数据。以前是通过操作DOM来更新视图,现在是数据驱动视图

    Vue的生命周期

    每个 Vue 组件实例在创建后都会经过一系列的初始化过程,这个过程中会运行叫做生命周期钩子的函数,以便于用户在特定的阶段有机会添加自己的代码。

    Vue 的生命周期可以分为8个阶段:创建前后、挂载前后、更新前后、销毁前后,以及一些特殊场景的生命周期。Vue 3 中还新增了是3个用于调试和服务端渲染的场景。【相关推荐:vuejs视频教程web前端开发

    Vue 2中的生命周期Vue 3中的生命周期描述
    beforeCreatebeforeCreate创建前,此时datamethods的数据都还没有初始化
    createdcreated创建后,data中有值,尚未挂载,可以进行一些Ajax请求
    beforeMountbeforeMount挂载前,会找到虚拟DOM,编译成Render
    mountedmounted挂载后,DOM已创建,可用于获取访问数据和DOM元素
    beforeUpdatebeforeUpdate更新前,可用于获取更新前各种状态
    updatedupdated更新后,所有状态已是最新
    beforeDestroybeforeUnmount销毁前,可用于一些定时器或订阅的取消
    destroyedunmounted销毁后,可用于一些定时器或订阅的取消
    activatedactivatedkeep-alive缓存的组件激活时
    deactivateddeactivatedkeep-alive缓存的组件停用时
    errorCapturederrorCaptured捕获一个来自子孙组件的错误时调用
    renderTracked调试钩子,响应式依赖被收集时调用
    renderTriggered调试钩子,响应式依赖被触发时调用
    serverPrefetch组件实例在服务器上被渲染前调用

    父子组件的生命周期:

    Vue.$nextTick

    在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

    nextTick 是 Vue 提供的一个全局 API,由于 Vue 的异步更新策略,导致我们对数据修改后不会直接体现在 DOM 上,此时如果想要立即获取更新后的 DOM 状态,就需要借助该方法。

    Vue 在更新 DOM 时是异步执行的。当数据发生变化,Vue 将开启一个异步更新队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入队列一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。nextTick方法会在队列中加入一个回调函数,确保该函数在前面的 DOM 操作完成后才调用。

    使用场景:

    Vue 实例挂载过程中发生了什么?

    挂载过程指的是 app.mount()过程,这是一个初始化过程,整体上做了两件事情:初始化建立更新机制

    初始化会创建组件实例、初始化组件状态、创建各种响应式数据。

    建立更新机制这一步会立即执行一次组件的更新函数,这会首次执行组件渲染函数并执行patchvnode 转换为 dom; 同时首次执行渲染函数会创建它内部响应式数据和组件更新函数之间的依赖关系,这使得以后数据发生变化时会执行对应的更新函数。

    Vue 的模版编译原理

    Vue 中有个独特的编译器模块,称为compiler,它的主要作用是将用户编写的template编译为js中可执行的render函数。
    在Vue 中,编译器会先对template进行解析,这一步称为parse,结束之后得到一个JS对象,称之为抽象语法树AST;然后是对AST进行深加工的转换过程,这一步称为transform,最后将前面得到的AST生成JS代码,也就是render函数。

    Vue 的响应式原理

    虚拟DOM

    diff 算法

    1、概念:

    diff算法是一种对比算法,通过对比旧的虚拟DOM和新的虚拟DOM,得出是哪个虚拟节点发生了改变,找出这个虚拟节点并只更新这个虚拟节点所对应的真实节点,而不用更新其他未发生改变的节点,实现精准地更新真实DOM,进而提高效率。

    2、对比方式:

    diff算法的整体策略是:深度优先,同层比较。比较只会在同层级进行, 不会跨层级比较;比较的过程中,循环从两边向中间收拢。

    Vue中key的作用?

    key的作用主要是为了更加高效的更新虚拟 DOM

    Vue 判断两个节点是否相同时,主要是判断两者的key元素类型tag。因此,如果不设置key,它的值就是 undefined,则可能永远认为这是两个相同的节点,只能去做更新操作,将造成大量的 DOM 更新操作。

    为什么组件中的 data 是一个函数?

    在 new Vue() 中,可以是函数也可以是对象,因为根实例只有一个,不会产生数据污染。

    在组件中,data 必须为函数,目的是为了防止多个组件实例对象之间共用一个 data,产生数据污染;而采用函数的形式,initData 时会将其作为工厂函数都会返回全新的 data 对象。

    Vue 中组件间的通信方式?

    v-show 和 v-if 的区别?

    使用场景:
    如果需要非常频繁地切换,则使用v-show较好,如:手风琴菜单,tab 页签等; 如果在运行时条件很少改变,则使用v-if较好,如:用户登录之后,根据权限不同来显示不同的内容。

    computed 和 watch 的区别?

    运用场景:
    计算属性一般用在模板渲染中,某个值是依赖其它响应对象甚至是计算属性而来;而侦听属性适用于观测某个值的变化去完成一段复杂的业务逻辑。

    v-if 和 v-for 为什么不建议放在一起使用?

    Vue 2 中,v-for的优先级比v-if高,这意味着v-if将分别重复运行于每一个v-for循环中。如果要遍历的数组很大,而真正要展示的数据很少时,将造成很大的性能浪费。

    Vue 3 中,则完全相反,v-if的优先级高于v-for,所以v-if执行时,它调用的变量还不存在,会导致异常。

    通常有两种情况导致要这样做:

    $set

    可手动添加响应式数据,解决数据变化视图未更新问题。当在项目中直接设置数组的某一项的值,或者直接设置对象的某个属性值,会发现页面并没有更新。这是因为Object.defineProperty()的限制,监听不到数据变化,可通过this.$set(数组或对象,数组下标或对象的属性名,更新后的值)解决。

    keep-alive 是什么?

    设置了keep-alive缓存的组件,会多出两个生命周期钩子:activateddeactivated
    首次进入组件时:beforeCreate --> created --> beforeMount --> mounted --> activated --> beforeUpdate --> updated --> deactivated
    再次进入组件时:activated --> beforeUpdate --> updated --> deactivated

    mixin

    mixin(混入), 它提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。

    使用场景: 不同组件中经常会用到一些相同或相似的代码,这些代码的功能相对独立。可以通过mixin 将相同或相似的代码提出来。

    劣势:

    插槽

    slot插槽,一般在组件内部使用,封装组件时,在组件内部不确定该位置是以何种形式的元素展示时,可以通过slot占据这个位置,该位置的元素需要父组件以内容形式传递过来。slot分为:

    Vue 中的修饰符有哪些?

    在Vue 中,修饰符处理了许多 DOM 事件的细节,让我们不再需要花大量的时间去处理这些烦恼的事情,而能有更多的精力专注于程序的逻辑处理。Vue中修饰符分为以下几种:

    对 SPA 的理解?

    双向绑定?

    子组件是否可以直接改变父组件的数据?

    Vue Router中的常用路由模式和原理?

    1、hash 模式:

    2、history 模式:

    利用 HTML5 History Interface 中新增的pushState()replaceState()方法。
    这两个方法应用于浏览器的历史记录栈,在当前已有的backforwardgo 的基础上,他们提供了对历史记录进行修改的功能。
    这两个方法有个共同点:当调用他们修改浏览器历史记录栈后,虽然当前url改变了,但浏览器不会刷新页面,这就为单页面应用前端路由“更新视图但不重新请求页面”提供了基础
    特点:虽然美观,但是刷新会出现 404 需要后端进行配置。

    动态路由?

    很多时候,我们需要将给定匹配模式的路由映射到同一个组件,这种情况就需要定义动态路由。例如,我们有一个 User组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用动态路径参数(dynamic segment)来达到这个效果:{path: '/user/:id', compenent: User},其中:id就是动态路径参数。

    对Vuex的理解?

    页面刷新后Vuex 状态丢失怎么解决?

    Vuex 只是在内存中保存状态,刷新后就会丢失,如果要持久化就需要保存起来。

    localStorage就很合适,提交mutation的时候同时存入localStorage,在store中把值取出来作为state的初始值即可。

    也可以使用第三方插件,推荐使用vuex-persist插件,它是为 Vuex 持久化储存而生的一个插件,不需要你手动存取storage,而是直接将状态保存至 cookie 或者 localStorage中。

    关于 Vue SSR 的理解?

    SSR服务端渲染(Server Side Render),就是将 Vue 在客户端把标签渲染成 html 的工作放在服务端完成,然后再把 html 直接返回给客户端。

    了解哪些 Vue 的性能优化方法?

    (学习视频分享:vuejs入门教程编程基础视频

    以上就是【整理分享】一些常见Vue面试题(附答案解析)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:面试 Vue.js
    上一篇:一文聊聊vue怎么阻止重复请求 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • vue什么情况用slot• 一文详解Vue+flex布局实现TV端城市列表• vue ie8 不兼容提示怎么解决• Vue怎么替换本地图片• vue中console.log不输出内容怎么办• vue文件上传不能大于10mb怎么实现
    1/1

    PHP中文网