Vue面试题总结(持续更新中)

Vue面试题总结(持续更新中)

题目参考链接

https://blog.csdn.net/weixin_45257157/article/details/106215158

由于已经有很多前辈深造VUE的某一块知识,所以我也是大树下好乘凉,进行总结与积累。

就有这篇博客,希望对各位面试求职的同学有所帮助。

注意:

每题都附上链接并不是说要参考这个链接的意思,而是他们的例子或者解释说明更好、更全与更方便理解。

学习方法:

多看理论总结,多跟着大佬写项目。当新的问题被你发现了,你就离大佬就不远了。

Vue的优点

  • 轻量级
  • 速度快
  • 简单易学
  • 低耦合
  • 可重用性
  • 独立开发
  • 文档齐全,中文文档

Vue父子组件通信

Vue的父子组件通信(十种)(转载) - 浅巷深念 - 博客园 (cnblogs.com)

prob :一般写道data里定义的变量

父组件传给子组件数值,子组件不要对其进行修改,而是需要找个变量将父组件传递的数值给赋值过来然后对变量进行操作,另外注意深浅拷贝。

$emit

从子组件向父组件通知并传递数值,与

prob
相反

怎么理解Vue的单项数据流

如何理解Vue中的单向数据流_星海拾遗的博客-CSDN博客_vue的单向数据流

数据总是从父组件传到子组件,子组件没有权力修改父组件床过来的数据,只能请求父组件对原始数据进行修改。

这样可以防止子组件意外修改父组件的状态,从而导致应用的数据流难以理解。

如何让CSS只在当前组件中起作用?

将当前组件的

<style>
修改为
<style scoped>

keep-alive的作用是什么?

<keep-alive></keep-alive>

keep-alive
可以在组件切换时,保存其包裹的组件的状态,使其不被销毁,防止多次渲染,即适用与需要频繁切换的组件需要缓存的情况。

如何获取DOM

原生JS的方法

原生js获取DOM对象的几种方法_飞翔在蓝天下的蜂鸟的博客-CSDN博客_获取dom

VUE的方法:

Vue中ref和$refs的介绍及使用_@Demi的博客-CSDN博客_ref vue

元素绑定ref之后,直接通过this.$refs即可调用,这样可以减少获取dom节点的消耗。

说出几种Vue当中的指令和它的用法

API — Vue.js 中文文档 (bootcss.com)

v-bind的用法
因为插值表达式

{{}}
不适合用在标签属性中,所以要通过指令对标签中的属性值动态绑定,下图
v-bind:href
可以简写成
:href
,另外标签语法也适用于绑定事件等等。

v-bind与v-model

分类 说明 写法
单向绑定(v-bind) 数据data流向页面,即Model改变,View也跟着变化,但View不能影响Model v-bind:value="data",简写
:value="data"
双向绑定(v-model) 数据不仅能从data流向页面,也能从页面流向data,涉及到MVVM设计模式 v-model:value="data",简写
v-model="data"
,通常固定在表单类元素上(如:input,select等)

MVVM各层在Vue案例中的对应的位置

v-for和v-if的优先级

vue的注意规范之v-if 与 v-for 一起使用_岁月如歌_的博客-CSDN博客_vuevfor和vif一起用

如果同时使用,会有个先后运行的优先级,

v-for
的优先级比
v-if
更高,这意味着
v-if
将分别重复运行于每个
v-for
循环中。

vue-loader
是什么,用途有哪些

Vue-loader 是什么?使用它的用途有哪些?_大春也有人抢?的博客-CSDN博客_vue-loader是什么,用途有哪些

vue
文件的一个加载器,将
template/js/style
转换为
js
模块

用途:js可以些es6、style样式

v-on
可以监听多个方法吗

v-on可以监听多个方法吗?_Billow_lamb的博客-CSDN博客_v-on可以监听多个方法吗

通过

v-on
指令可以监听
vue
methods
定义好的方法函数。

v-on
只用写入方法名即可,类似
v-on="onclick,onbure"
这种形式。

v-show和v-if指令的联系和区别

Vue内置指令——v-show和v-if指令_非早起选手的博客-CSDN博客_v-show 两个条件

v-if v-show
处理DOM 动态添加或删除DOM元素,所以有事件监听和相应的组件 通过设置DOM元素的display颜色属性控制显隐
性能消耗 切换消耗高 初始渲染消耗高
使用场景 不常需要用的 需要频繁切换的

Vue中为什么要使用key

详细讲解Vue中为什么要使用key_飞翔的柠檬的博客-CSDN博客_vue控制元素更新为什么使用key

給每个

dom
元素加上
key
作为唯一标识,
diff
算法可以准确识别这些
vnode
节点,使页面渲染更加快速。

原因:

准确:带key就有唯一的引用地址,在同值节点的情况下,避免就地复用。

快速:key可以生成唯一的哈希表,当然比遍历快

$nextTick
的作用

$nextTick 的作用 - 王子乔 - 博客园 (cnblogs.com)

由于

Vue
实现响应式并不是数据发生变化之后
DOM
立即变化,而是按一定的策略进行
DOM
的更新,所以在通过定义函数想要修改
data()
中的数据时,页面是无法获取
data
修改后的数据的。

解决方案:

使用

$nextTick
回调时,当
data
中的数据修改后,可以实时渲染更新页面

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

vue组件中的data为什么是一个函数_web青梅煮码的博客-CSDN博客_vue中的data为什么是一个函数

因为JS的特性,在Component中,data必须以函数的形式存在,不可以是对象。

写成函数:

数据以函数返回值的形式定义,这样每次复用组件的时候,都会返回一份新的data,相当于每个组件实例都有自己私有的数据空间,而这些组件只用负责维护数据即可。

写成对象:

所有组件都共用一个data,修改一个,另一个new同名对象也会跟着改变。

Vue
双向绑定的原理

vue是如何实现双向数据绑定的原理 - CSDN

Vue 双向数据绑定原理_手写Hello World工程师的博客-CSDN博客_vue实现双向绑定原理

核心:

在vue2.0中,双向绑定的核心是

object.defineProperty()

原理:

Vue
双向数据绑定是通过 数据劫持 + 发布者–订阅者 模式的方式实现。

通过

object.defineProperty()
来劫持各个属性的
setter、getter
,在数据变动时发布消息给订阅者,触发相应的监听回调。

例子:

当把JS对象传给

Vue
实例来作为它的
data
选项时,
Vue
将遍历他的属性
Property
,用
object.defineProperty
将属性转为
getter/setter

用户看不到

getter/setter
,但是在内部它们让
Vue
追踪依赖,在属性被访问和修改时通知改变。

过程:

Vue
的数据双向绑定将MVVM作为数据绑定的入口,整合
observer,compile和watch
三者。

通过

observer
监听自己的model的数据变化

通过

compile
来解析编译模板指令

利用

watcher
搭起
observer和compile
之间的通信桥梁

最终效果:数据发生变化,视图要跟着变化。视图变化,数据也跟着变化

多页面与单页面应用的区别

多页面与单页面应用的区别_心若向阳无谓悲伤的博客-CSDN博客_单页面应用和多页面应用的区别

单页面应用(SPA):指只有一个主页面的应用,页面的跳转通过显示页面片段的一部分(模拟跳转),一开始就要加载所有静态资源,所以初次等待耗时长,页面复杂度也高,当时对服务器的压力小,而且也不用再重新加载整个页面了。

多页面(MPA):就是一个应用中有多个页面,页面跳转实施整个页面刷新的,切换的过程就体验不好了,但是想应的实现难度和框架要求不会很高,平时做网站练习也选择这种方式。

父组件和子组件之间的生命周期钩子执行顺序

Vue——父子组件的生命周期(执行顺序)_默默花上开的博客-CSDN博客_父子组件生命周期

父组件和子组件之间的生命周期执行顺序_Felix_10的博客-CSDN博客_父组件和子组件生命周期顺序

渲染过程

父亲准备厨具后(父beforeCreate->父created),父亲炒菜准备(父beforeMount),儿子也跟着练手(子beforeCreate->子created->子beforeMount->子mounted),可父亲看不下去,只好亲自下厨(父mounted)

父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted

子组件更新

因为儿子在家,父亲是长辈,父亲先吃一口(父beforeUpdate),但是觉得被看着太尴尬了,就让儿子先吃,结果倒好,儿子一点面子都不给(子beforeUpdate->子updated),父亲也跟着开吃(父updated)

父beforeUpdate->子beforeUpdate->子updated->父updated

父组件更新

儿子不在家,父亲独自吃完

影响到子组件: - 父beforeUpdate -> 子beforeUpdate->子updated -> 父updated

不影响子组件: - 父beforeUpdate -> 父updated

销毁过程

父亲准备收拾碗筷(父beforeDestroy),但是儿子怎能不先表率(子beforeDestroy->子destroyed),最后父亲意思一下(父destroyed)

父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

Vue
生命周期

Vue的生命周期的详解_小小前端程序猿的博客-CSDN博客_vue生命周期

简单介绍:

每个

Vue
实例被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂在到DOM并再数据变化时更新DOM等。同时在这个过程也会运行生命周期钩子函数,用户可以在不同阶段添加自己的代码。

第一次页面加载触发的钩子:

beforeCreate->created->beforeMount->mounted

Vue
获取数据一般所在的周期函数:

created、beforeMount、mounted

created
mounted
的区别:

created和mounted的区别_在线小白www的博客-CSDN博客_created和mounted区别

created:在模板渲染成HTML前调用,即通常初始化某些属性值,然后再渲染视图。

mounted:再模板渲染成HTML后调用,通常是初始化页面完成后,再对HTML的DOM节点进行操作。

简单理解生命周期:

  • 创建前/后

beforeCreate
阶段:
Vue
实例的挂载元素
$el
和数据对象
data
都为
undefined
,还未初始化。

created
阶段:
Vue
实例的数据对象
data
有了,
$el
还没有

beforeMount
阶段:
Vue
实例的
$el
data
都初始化了,当挂载之前还是为虚拟的DOM节点,
data.message
还未替换

mounted
阶段:
Vue
实例挂载完成,
data.message
成功渲染

beforeUpdate 与 updated
阶段:只要数据更新

destroyed
阶段:
beforeDestroy
其实就提示已经到了要销毁的阶段,在
destroyed
后,对
data
的改变不会再触发周期函数,说明此时
Vue
实例已经解除事件监听以及和
DOM
的绑定,但是
DOM
的结构仍在。

Vuex

vuex是什么?怎么使用?哪种功能场景使用它?_Mr.Huang1014的博客-CSDN博客_vuex是什么?怎么使用?哪种功能场景使用它?

vuex
vue
框架中状态管理

5中属性:state、getters、mutations、actions、modules

state
:数据源存放地

getters
:从基本数据派生出来的数据

mutations
:提交更改数据的方法,同步方式

actions
:像一个装饰器,包裹
mutations
,使其可以异步
modules
:模块化
Vuex

Vuex
页面刷新数据丢失

持久化,本地存储保存数据,可选择

vuex-presist
插件,看自己要放到
cookie
还是
localstroage

Vue中 \(router\)\(route\) 的区别

【Vue】8.vue中 \(router和\) route的区别_Anabel Chen的博客-CSDN博客_ \(router和\) route的区别

$route
是路由信息的对象,包括
path、params、hash、query、fullPath、matched、name
等路由信息参数

$router
是路由实例对象,包括了路由的跳转方法,钩子函数等。

Vue 事件使用 event 对象

获取事件对象,方法参数传递

$event

<button @click='Event($event)'>事件对象

标签: Javascript

添加新评论