1. Vue 框架的优点是什么?

(1)轻量级框架:只关注视图层,大小只有几十Kb;

    (2)简单易学:文档通顺清晰,语法简单;

    (3)数据双向绑定,数据视图结构分离,仅需操作数据即可完成页面相应的更新;

    (4)组件化开发:工程结构清晰,代码维护方便;

    (5)虚拟 DOM加载 HTML 节点,运行效率高。

2. 什么是 MVVM?

MVVM 是Model-View-ModelView的缩写,是一种脱胎于 MVC 模式的设计模式

    Model 代表数据层,负责存放业务相关的数据;

    View 代表视图层,负责在页面上展示数据;

    ViewModel 是的作用是同步 View 和 Model 之间的关联,其实现同步关联的核心是DOM ListenersData 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 事件配置前调用。此时不能访问 dataref,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 面试题总结的更多相关文章

  1. 2019前端面试系列——Vue面试题

    Vue 双向绑定原理        mvvm 双向绑定,采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty()来劫持各个属性的 setter.getter,在数 ...

  2. php开发面试题---vue面试题(vue.js的好处及作用)

    php开发面试题---vue面试题(vue.js的好处及作用) 一.总结 一句话总结: 双向数据绑定:在做ajax的时候,更新实在是太方便了 用数据绑定的思想,vue可以简单写单个页面,也可以写一个大 ...

  3. Vue 面试题汇总

    Vue 面试题汇总 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  4. 【前端面试】Vue面试题总结(持续更新中)

    Vue面试题总结(持续更新中) 题目参考链接 https://blog.csdn.net/weixin_45257157/article/details/106215158 由于已经有很多前辈深造VU ...

  5. 法门扫地僧总结vue面试题(部分来源网络)

    Front-End 前端开发工程师面试宝典!   (本文部分有转载,不定期更新!)             前言(README.md) 本仓库是我整理的前端常见面试题,大部分由我整理,其中个别部分参考 ...

  6. Vue面试题整理

    1:什么是MVVM MVVM是是Model-View-ViewModel的缩写,Model代表数据模型,定义数据操作的业务逻辑,View代表视图层,负责将数据模型渲染到页面上,ViewModel通过双 ...

  7. vue面试题总汇

    active-class是哪个组件的属性? vue-router模块的router-link组件. 嵌套路由怎么定义? 在实际项目中我们会碰到多层嵌套的组件组合而成,但是我们如何实现嵌套路由呢?因此我 ...

  8. vue面试题!!!

    由于公司需要,需要把项目拆分,前端使用vue框架.最近面试vue总结的试题 1:mvvm框架是什么?它和其他框架的区别是什么? mvvm 全称model view viewModel,model数据模 ...

  9. 本人编写的一份前端vue面试题

    说明,此题目本人自出,做过本人所在公司的前端面试题,在此共享给大家 1. 如何在vue组件中实现v-model的功能?(只需给出关键代码) 2. 简述你知道的生命周期函数和执行时机 3. 谈谈你对计算 ...

  10. vue面试题,知识点汇总(有答案)

    一. Vue核心小知识点 1.vue中 key 值的作用 key 的特殊属性主要用在 Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes.如果不使用key,Vue会使用一种最大限度减少动态 ...

随机推荐

  1. 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号

    [NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...

  2. Spring Boot 自带缓存及结合 Redis 使用

    本文测试环境: Spring Boot 2.1.4.RELEASE + Redis 5.0.4 + CentOS 7 自带缓存 如果没有使用缓存中间件,Spring Boot 会使用默认的缓存,我们只 ...

  3. Windows下django项目部署 通过Apache2.4+mod_wsgi

    经过几天踩坑,记录在Windows10下通过Apache2.4部署Django项目的过程 运行环境: 先说下环境,怎么安装倒是其次的,版本很重要,我是根据mod_wsgi的版本要求下载的各个版本(py ...

  4. Zookeeper(5)---分布式锁

    基于临时序号节点来实现分布式锁 为什么要用临时节点呢?如果拿到锁的服务宕机了,会话失效ZK自己也会删除掉临时的序号节点,这样也不会阻塞其他服务. 流程: 1.在一个持久节点下面创建临时的序号节点作为锁 ...

  5. 老猿Python博客文章目录索引

    本目录提供老猿Python所有相关博文的一级目录汇总,带星号的为收费专栏: 一.专栏列表 本部分为老猿所有专栏的列表,每个专栏都有该专栏置顶的博文目录: 专栏:Python基础教程目录 专栏:* 使用 ...

  6. Python函数的关键字参数

    除了位置参数的函数参数使用方式,还有一种在函数调用时指定形参等于指定实参的参数使用模式,该模式称为关键字参数.关键字参数使用可以不按形参的顺序传递实参,系统按形参的名字确认实参传递给哪个参数. 具体内 ...

  7. PyQt(Python+Qt)学习随笔:信号签名(signature of the signal)是什么?

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.概念解释 函数签名:由函数的参数个数与其类型组成.函数在重载时,利用函数签名的不同即参数个数与类 ...

  8. 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis由低级别(C)升级到高级别(P)的步骤和注意事项, 及对用户现有应用的潜在影响,是否需要停机时间窗口,以及这个时间窗口需要多少的预估问题

    问题描述 由于Azure Redis的性能在不同级别表现不同,当需要升级/缩放Redis的时候,从使用者的角度,需要知道有那些步骤? 注意事项? 潜在影响?停机事件窗口? 升级预估时间? 解决方案 从 ...

  9. APP软件系统测试

    1.功能模块测试 2.交叉事件测试 3.压力测试 存储压力测试 边界压力测试 响应能力压力测试 网络流量测试 4.容量测试 5.安装卸载测试 6.易用性.用户体验测试 7.UI界面测试

  10. Tomcat 知识点总结

    Tomcat 学习笔记.本文相关配置均为 tomcat8 下,其他版本可能略有不同.如有错误请多包涵. 架构 首先,看一下整个架构图 接下来简单解释一下. Server:服务器.Tomcat 就是一个 ...