Vue 面试题总结
1. Vue 框架的优点是什么?
(1)轻量级框架:只关注视图层,大小只有几十Kb;
(2)简单易学:文档通顺清晰,语法简单;
(3)数据双向绑定,数据视图结构分离,仅需操作数据即可完成页面相应的更新;
(4)组件化开发:工程结构清晰,代码维护方便;
(5)虚拟 DOM加载 HTML 节点,运行效率高。
2. 什么是 MVVM?
MVVM 是Model-View-ModelView的缩写,是一种脱胎于 MVC 模式的设计模式。
Model 代表数据层,负责存放业务相关的数据;
View 代表视图层,负责在页面上展示数据;
ViewModel 是的作用是同步 View 和 Model 之间的关联,其实现同步关联的核心是DOM Listeners和 Data Bindings两个工具。DOMListeners 工具用于监听 View 中 DOM 的变化,并会选择性的传给 Model;Data Bindings 工具用于监听 Model 数据变化,并将其更新给 View。
3. Vue 中组件之间传值的方法有哪些?
父组件向子组件传值:
(1)父组件在子组件标签中绑定自定义属性;
(2)子组件通过 props 属性进行接收。
//父组件
export default { components:{ Child } }
<Child :name="123" />
//子组件
export default { props: ["name"]//此处亦可指定数据类型 }
子组件向父组件传值:
(1)在父组件在子组件标签中绑定自定义事件;
(2)子组件通过this.$emit()方法触发自定义事件,传值给父组件。
//父组件
export default { components:{ Child }, data:{ name:"123" }, methods:{ changeName(value){
this.name = value } } }
<Child @changeName="changeName" />
//子组件
export default { methods:{ changeParentName:(value)=>{ this.$emit("changeName","456") } } }
<button @click="changeParentName">改变父组件的name</button>
兄弟组件之间传值:
(1)共同传给父组件,再由父组件分发(状态提升);
(2)使用Vuex;
(3)利用bus 事件总线。
let bus = new Vue()
A组件:methods :{ 函数{bus.$emit(‘自定义事件名’,数据)} //发送
B组件:created(){bus.$on(‘A发送过来的自定义事件名’,函数)} //进行数据接收
4. Vue 中常见的生命周期钩子函数有哪些?
Vue 中常见的生命周期钩子函数总共有八个:
(1)创建阶段
BeforeCreate:该函数在 Vue 实例初始化后,组件创建、数据监测(data observer)、watch/event 事件配置前调用。此时不能访问 data、ref,Vue 实例对象上仅有生命周期函数及部分默认事件。
Created:该函数在 Vue 组件创建完成后调用。此时数据监测、事件配置已完成,data 对象已可访问,但组件尚未被渲染成 HTML 模板,ref 仍为 undefined,$el 尚不可用。
如此阶段要对 DOM 进行操作,就应将操作放在
Vue.nextTick的回调函数中。因为此阶段 DOM 尚未被渲染,无法执行 DOM 操作。Vue.nextTick会在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后可以获取更新后的 DOM。
(2)挂载阶段
BeforeMount:该函数在组件挂载前调用,此时 HTML 模板编译已完成,虚拟 DOM 已存在,$el 为可用状态,但 ref 仍不可用。
一般在此阶段进行初始数据的获取操作。
Mounted:该函数在组件挂载完成后调用。此时$el元素已被vm.$el替代,ref可进行操作。
一般在此阶段进行异步请求的发送操作。mounted 不会保证所有的子组件也都一起被挂载。如果希望等到整个视图都渲染完毕,可以在 mounted 内部使用
vm.$nextTick。
(3)更新阶段
BeforeUpdate:该函数在数据更新、虚拟 DOM 打补丁前调用。
此阶段适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
Updated:该函数在数据更新、虚拟 DOM 打补丁完成后调用。
(4)卸载阶段
BeforeDestory:该函数在实例销毁前调用,此时实例完全可用,ref 仍然存在。
一般在此阶段进行性能优化操作,如清除定时器,防止内存泄露。
Destroyed:该函数在实例销毁后调用,此时 Vue 里的所有指令均被解绑,所有事件监听器已被移除,ref 状态为 undefined。
组件销毁时,先销毁父组件,再销毁子组件。
针对 keep-alive 组件还有两个钩子函数:
activated:在被 keep-alive 缓存的组件激活时调用。
deactivated:在被 keep-alive 缓存的组件停用时调用。
还有一个错误处理捕获函数:
errorCaptured:在捕获到一个来自子孙组件的错误时调用。
5. 为什么 Vue 组件中 data 必须是一个函数?
如果 data 是一个对象,当复用组件时,因为 data 都会指向同一个引用类型地址,其中一个组件的 data 一旦发生修改,则其他重用的组件中的 data 也会被一并修改。
如果 data 是一个返回对象的函数,因为每次重用组件时返回的都是一个新对象,引用地址不同,便不会出现如上问题。
6. Vue 中 v-if 和 v-show 有什么区别?
v-if 在进行切换时,会直接对标签进行创建或销毁,不显示的标签不会加载在 DOM 树中。v-show 在进行切换时,会对标签的 display 属性进行切换,通过 display 不显示来隐藏元素。
一般来说,v-if 的性能开销会比 v-show 大,切换频繁的标签更适合使用 v-show。
7. Vue 中 computed 和 watch 有什么区别?
计算属性 computed:
(1)支持缓存,只有依赖数据发生变化时,才会重新进行计算函数;
(2)计算属性内不支持异步操作;
(3)计算属性的函数中都有一个 get(默认具有,获取计算属性)和 set(手动添加,设置计算属性)方法;
(4)计算属性是自动监听依赖值的变化,从而动态返回内容。
侦听属性 watch:
(1)不支持缓存,只要数据发生变化,就会执行侦听函数;
(2)侦听属性内支持异步操作;
(3)侦听属性的值可以是一个对象,接收 handler 回调,deep,immediate 三个属性;
(3)监听是一个过程,在监听的值变化时,可以触发一个回调,并做一些其他事情。
watch: {
obj: {
//handler接收两个参数(newVal:新值,oldVal:旧值
handler: function(newVal, oldVal){
console.log(newVal);
},
deep: true,//设置为true时会监听对象内部值的变化;
immediate: true//设置为true时会立即以表达式的当前值触发回调;
}
}
使用
immediate可以优化以下场景:组件创建的时候立即获取一次列表的数据,同时监听<input/>框,每当发生变化的时候重新获取一次筛选后的列表。
//优化前
created(){
this.fetchPostList()
},
watch: {
searchInputValue(){ this.fetchPostList() }
}
//优化后
watch: {
searchInputValue:{ handler: 'fetchPostList', immediate: true }
}
8. $nextTick 是什么?
Vue 实现响应式并不是在数据发生后立即更新 DOM,使用 vm.$nextTick 是在下次 DOM 更新循环结束之后立即执行延迟回调。在修改数据之后使用,则可以在回调中获取更新后的 DOM。
9. v-for 中 key 的作用是什么?
key 是 Vue 使用 v-for 渲染列表时的节点标识。使用了 key 之后,当列表项发生变化时,Vue 会基于 key 的变化而重新排列元素顺序,并且移除 key 不存在的元素,提升运行效率。
10. Vue 的双向数据绑定原理是什么?
Vue 采用数据劫持+订阅发布模式实现双向绑定。通过 Object.defineProperty()方法来为组件中 data 的每个属性添加 get 和 set 方法,在数据变动时,触发 set 里相应的监听回调函数,将变动信息发布给订阅者。主要有以下步骤:
(1)组件初始化时:
a. 创建一个dep 对象作为观察者(依赖收集、订阅发布的载体);
b. 通过Object.defineProperty()方法对 data 中的属性及子属性对象的属性,添加 getter 和 setter 方法; 调用 getter 时,便去 dep 里注册函数。调用 setter 时,便去通知执行刚刚注册的函数。
(2)组件挂载时:
a. compile解析模板指令,将其中的变量替换成数据。然后初始化渲染页面视图,并将每个指令对应的节点绑定上更新函数、监听函数。后续一旦数据发生变化,便会更新页面。页面发生变化时也会相应发布变动信息;
b. 组件同时会定义一个watcher 类作为订阅者,watcher 可以视作 dep 和组件之间的桥梁。其在实例化时会向 dep 中添加自己,同时自身又有一个 update 方法,待收到 dep 的变动通知时,便会调用自己的 update 方法,触发 compile 中的相应函数完成更新。
11. 如何动态更新对象或数组的值?
因为 Object.defineProperty()的限制,Vue 无法监听到对象或数组内部某个属性值的变化,因此在直接设置以上两类数据的值时,页面不会实时更新。此时可以通过 this.$set 方法来解决:
//this.$set(要改变的数组/对象,要改变的位置/key,要改成的value) this.$set(this.arr, 0, "OBKoro1");
// 改变数组 this.$set(this.obj, "c", "OBKoro1"); // 改变对象
数组原生方法造成的数据更新,可以被 Vue 监听到。如 splice()push()pop()等。
12. 常用的事件修饰符有哪些?
.stop:阻止冒泡;
.prevent:阻止默认行为;
.self:仅绑定元素自身可触发;
.once:只触发一次..
13. Vue 如何获取 DOM 元素?
首先先为标签元素设置 ref 属性,然后通过 this.$refs.属性值获取。
<div ref="test"></div>
const dom = this.$refs.test
14. v-on 如何绑定多个事件?
可以通过 v-on 传入对象来绑定多个事件:
<!--单事件绑定-->
<input type="text" @click="onClick">
<!--多事件绑定-->
<input type="text" v-on="{ input:onInput,focus:onFocus,blur:onBlur }">
15. Vue 初始化页面闪动问题如何解决?
出现该问题是因为在 Vue 代码尚未被解析之前,尚无法控制页面中 DOM 的显示,所以会看见模板字符串等代码。
解决方案是,在 css 代码中添加 v-cloak 规则,同时在待编译的标签上添加 v-cloak 属性:
[v-cloak] { display: none; }
<div v-cloak>
{{ message }}
</div>
16. Vue 如何清除浏览器缓存?
(1)项目打包的时候给每个打包文件加上 hash 值,一般是在文件后面加上时间戳;
(2)在 html 文件中加入 meta 标签,content 属性设置为no-cache;
(3) 在后端服务器中进行禁止缓存设置。
17. Vue-router 路由有哪些模式?
一般有两种模式:
(1)hash 模式:后面的 hash 值的变化,浏览器既不会向服务器发出请求,浏览器也不会刷新,每次 hash 值的变化会触发 hashchange 事件。
(2)history 模式:利用了 HTML5 中新增的 pushState() 和 replaceState() 方法。这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。
18. Vue-cli 项目中每个文件夹和文件的用处大致是什么?
(1)bulid 文件夹:存放 webpack 的相关配置以及脚本文件,实际开发中一般用来配置 less、babel 和配置 webpack.base.config.js 文件。
(2)config 文件夹:常用到此文件夹下的 config.js (index.js) 配置开发环境的端口号,是否开启热加载或者设置生产环境的静态资源相对路径、是否开启 gzip 压缩、npm run build 命令打包生成静态资源的名称和路径等。
(3)node_modules 文件夹:存放 npm install 命令下载的开发环境和生产环境的各种依赖。
(4)src 文件夹 :存放组件源码、图片样式资源、入口文件、路由配置等。
19. Vue-cli 项目中 assets 和 static 文件夹有什么区别?
两者都是用于存放项目中所使用的静态资源文件的文件夹。其区别在于:
** assets 中的文件在运行 npm run build 的时候会打包,简单来说就是会被压缩体积,代码格式化之类的。打包之后也会放到 static 中。static 中的文件则不会被打包**。
将图片等未处理的文件放在assets中,打包减少体积。而对于第三方引入的一些资源文件如iconfont.css等可以放在static中,因为这些文件已经经过处理了。
20. Vuex 是什么?有哪几种属性?
Vuex 是专为Vue设计的状态管理工具,采用集中式储存管理 Vue 中所有组件的状态。
(1)state属性:基本数据;
(2)getters属性:从 state 中派生出的数据;
(3)mutation属性:更新 store 中数据的唯一途径,其接收一个以 state 为第一参数的回调函数;
const store = new Vuex.Store({
state: {
count: 1,
},
mutations: {
increment(state) {
// 变更状态
state.count++;
},
},
});
(4)action 属性:提交 mutation 以更改 state,其中可以包含异步操作;
const store = new Vuex.Store({
state: {
count: 0,
},
mutations: {
increment(state) {
state.count++;
},
},
actions: {
increment2(context) {
context.commit('increment');
},
fun(context) {
context.dispatch('increment2');
},
},
});
(5)module 属性:用于将 store分割成不同的模块。
const moduleA = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态
Vue 面试题总结的更多相关文章
- 2019前端面试系列——Vue面试题
Vue 双向绑定原理 mvvm 双向绑定,采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty()来劫持各个属性的 setter.getter,在数 ...
- php开发面试题---vue面试题(vue.js的好处及作用)
php开发面试题---vue面试题(vue.js的好处及作用) 一.总结 一句话总结: 双向数据绑定:在做ajax的时候,更新实在是太方便了 用数据绑定的思想,vue可以简单写单个页面,也可以写一个大 ...
- Vue 面试题汇总
Vue 面试题汇总 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- 【前端面试】Vue面试题总结(持续更新中)
Vue面试题总结(持续更新中) 题目参考链接 https://blog.csdn.net/weixin_45257157/article/details/106215158 由于已经有很多前辈深造VU ...
- 法门扫地僧总结vue面试题(部分来源网络)
Front-End 前端开发工程师面试宝典! (本文部分有转载,不定期更新!) 前言(README.md) 本仓库是我整理的前端常见面试题,大部分由我整理,其中个别部分参考 ...
- Vue面试题整理
1:什么是MVVM MVVM是是Model-View-ViewModel的缩写,Model代表数据模型,定义数据操作的业务逻辑,View代表视图层,负责将数据模型渲染到页面上,ViewModel通过双 ...
- vue面试题总汇
active-class是哪个组件的属性? vue-router模块的router-link组件. 嵌套路由怎么定义? 在实际项目中我们会碰到多层嵌套的组件组合而成,但是我们如何实现嵌套路由呢?因此我 ...
- vue面试题!!!
由于公司需要,需要把项目拆分,前端使用vue框架.最近面试vue总结的试题 1:mvvm框架是什么?它和其他框架的区别是什么? mvvm 全称model view viewModel,model数据模 ...
- 本人编写的一份前端vue面试题
说明,此题目本人自出,做过本人所在公司的前端面试题,在此共享给大家 1. 如何在vue组件中实现v-model的功能?(只需给出关键代码) 2. 简述你知道的生命周期函数和执行时机 3. 谈谈你对计算 ...
- vue面试题,知识点汇总(有答案)
一. Vue核心小知识点 1.vue中 key 值的作用 key 的特殊属性主要用在 Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes.如果不使用key,Vue会使用一种最大限度减少动态 ...
随机推荐
- html基础标签用法
head title 行级双 网页标题标签 meta 单 存放网页重要信息,字符集,搜索索引,简介等(不显示) a 标签行内双标签 href="跳转路径", (JavaScript ...
- 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?
第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一. 案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...
- PyCharm中怎么将非当前工程文件的目录的文件加到当前工程中
在PyCharm已经建立工程文件的情况下,如果要将一个其他目录的文件导入到已有的工程中,唯一的方法如下: 通过File->Settings->Project->Project Str ...
- LeetCode初级算法之数组:1 两数之和
两数之和 题目地址:https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整 ...
- Object not found! The requested URL was not found on this server.... 报错解决方案
服务器(centos6.5) lnmp 报错如下 Object not found! The requested URL was not found on this server. The link ...
- 基于 Source Generators 做个 AOP 静态编织小实验
0. 前言 上接:用 Roslyn 做个 JIT 的 AOP 作为第二篇,我们基于Source Generators做个AOP静态编织小实验. 内容安排如下: source generators 是什 ...
- Kafka服务器后台启动
nohup bin/kafka-server-start.sh config/server.properties 1>/dev/null 2>&1 &
- HBase数据导入导出工具
hbase中自带一些数据导入.导出工具 1. ImportTsv直接导入 1.1 hbase中建表 create 'testtable4','cf1','cf2' 1.2 准备数据文件data.txt ...
- vue第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件)
第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件) #课程目标 掌握vue实例的相关属性和方法的含义和使用 了解vue的数据响应原理 熟悉创建组件,了解全局 ...
- Web服务器-并发服务器-Epoll(3.4.5)
@ 目录 1.介绍 2.代码 关于作者 1.介绍 epoll是一种解决方案,nginx就是用的这个 中心思想:不要再使用多进程,多线程了,使用单进程,单线程去实现并发 在上面博客实现的代码中使用过的轮 ...