当前位置: 首页 > article >正文

vue面试题整理(1.0)

一、对MVC,MVP,MVVM的理解

三者都是项目的架构模式(不是类的设计模式),即:一个项目的结构,如何分层,不同层负责不同的职责。

1.MVC

MVC的出现是用在后端(全栈时代)

M:model,模型:

主要完成业务功能,在数据库相关的项目中,数据库的增删改查属于模型。没有页面,是纯粹的逻辑。

V:view,视图:

主要负责数据的显示(HTML+CSS,动态网页(jsp,含有HTML的PHP文件))页面的展示和用户的交互。

C:controller,控制器:

主要负责每个业务的核心流程,在项目中体现在路由以及中间件上(nodeJs中的routes文件夹)

2.MVP

MVP是把MVC中的C改成了P。主要限制了M和V之间不能直接通信(互相调用,传递数据)。M和V之间的通信必须经过P。

P:Presenter,表示器

主要用于连接M层、V层,完成Model层与View层的交互,还可以进行业务逻辑的处理。

3.MVVM:

MVVM是把MVP中的P改成了VM。主要体现的是M和V之间的双向绑定。View的变动可以同步相应在Model,反之亦然。Vue就是一个MVVM的框架。准确来说,使用Vue框架完成项目时,使用的是MVVM模式。

VM:ViewModel

主要完成M和V的数据通信,并且是双向绑定。而View和Model之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由MVVM来统一管理。

总结:所有的MV*的项目的架构模式:都是为了完成项目代码的职责分工。

二、v-if和v-show区别

相同点:都是用来控制Dom元素的显示和隐藏。

不同点:

1.原理上:

v-if是通过添加和删除Dom元素,来控制Dom元素的显示和隐藏。

v-show是通过控制Dom元素样式的display属性的值,来控制Dom元素的显示和隐藏。

2.性能损耗

v-if:性能损耗主要体现在频繁切换时

v-show:性能损耗主要体现在首次。

3.应用场景:

v-if:用于切换不频繁的场景

v-show:用于切换频繁的场景。

4.安全性:
v-if:安全性好。(如果Dom元素不显示时,在Elements里根本看不到)

v-show:安全性不好。(如果Dom元素不显示时,在elements里依然可以看到,那么,懂程序的人,既可以修改)

三、computed和watch的区别

1.相同点:

都可以监听数据

2.不同点:

(1)概念:

computed:是计算属性,依赖其他属性值,并且computed的值有缓存,当依赖的属性值发生改变时,才会重新计算computed的值,默认是只读的(相当于getter函数),它也可以设置getter和setter函数来完成读和写。

watch:监听器,更多的是观察的作用,每当监听的数据变化时都会执行回调进行后续操作,它只能设置getter。watch默认只监听一层,如果要深度监听,让deep属性为true。

(2)作用:

computed:为了显示而用,降低了模板上代码复杂度。

watch:属性变化的检测(相当于事件),当属性的值发生变化时,可以调用函数。主要处理异步以及开销比较大的操作。简单粗暴的理解为:一个函数的执行时机。

(3)依赖模板调用:

computed:只能在模板上使用。

watch:不能在模板上使用。

(4)是否异步:

computed:不能有异步,只能同步。

watch:可以有异步。

(5)立即执行:

computed:是立即执行。

watch:默认不是立即执行。如果要立即执行,增加属性:immediate。

补充:在写代码时,把函数定义和调用时机分开。

四、Vue2的响应式原理

响应式:当js中的数据发生变化时,模板上会对应的发生变化。

1.数据劫持:

目的:当数据发生变化时,Vue框架会感知到。

怎么做的:利用ES5的Object.defineProperty()。当实例化组件时,Vue框架内部会把定义在组件data里的所有数据(属性),进行遍历,给每个数据(属性)增加setter和getter函数(同时会做订阅)。当数据发生变化时,会调用setter函数。当获取数据时,会调用getter函数。

2.发布订阅者模式:

目的:当数据发生变化时(其实就是调用setter函数时),会发布给所有订阅者。

怎么做的:当Vue组件实例化时,Vue框架内部会扫描模板,让模板上使用Vue语法(指令,{{}}等)的Dom元素去订阅对应的数据的变化。然后,当数据变化时,会更新所有订阅该数据的模板。

五、Vue3的响应式原理:

1.数据劫持:用proxy替换了Object.defineProperty。Proxy不需要循环,速度比Object.defineProperty快10倍。同时也解决了数组的劫持。(Vue2中用下标的方式改变数组不是响应式的)

2.发布订阅者模式:

内部有个Track函数:相当于订阅。

内部有个Trigger函数:相当于发布。

六、双向绑定的原理

1.双向绑定:视图层发生变化时,模型层会变化。模型层变化时,视图层会变化。

2.原理:

(1)通过事件和属性完成。

事件完成的:视图层影响模型层。

属性完成的是:模型层影响视图层(背后就是响应式原理)

3.Vue针对官方标签使用v-model指令,v-model指令针对不同的官方标签使用不同事件和属性。

(1)、针对文本框(单行和多行):value属性和Input事件。如果加上修饰符lazy。事件就变成了Change事件。

(2)、针对radio:使用的checked属性和Change事件。同时,需要给radio加上value属性。

(3)、针对checkbox:使用的checked属性和change事件。

(3.1)、如果应用在多选时,需要给checkbox加上value属性。

(3.2)、如果应用在单选时,不需要加。

(4)、针对select:使用value属性和change事件。

七、单项数据流

1.单项数据流是什么:

单项数据流是指父组件可以修改子组件的数据,反之不行(子组件不能修改父组件的数据)。

2.Vue框架的单项数据流:

Vue框架的Props是单项数据流。即:父组件可以修改子组件的Props。子组件不能通过修改Props的方式来修改父组件的数据(data),否则:

(1)、造成数据混乱:如:一个父级组件的数据传递给多个子组件,某个子组件如果通过Props修改父组件的数据,父级组件再修改其他子组件,其他子组件就会莫名其妙的被修改,造成数据混乱。

(2)、框架会给程序员爆出一个警告(特指:父组件给子组件传递的Props来自父组件的数据)

3.当父级的数据更新时,子组件的Props也会随之更新。

八、keep-alive

keep-alive是Vue提供的组件。

它有三个特征:

(1)、组件作用:keep-alive可以缓存组件及其状态(数据),避免了组件的频繁创建和销毁所带来的性能损耗。一般结合路由和动态组件一起使用。

(2)组件属性:提供include和exclude属性。include表示只有名称匹配的组件会被缓存,exclude表示任何名称匹配的组件都不会被缓存,其中exclude的优先级比include高。两者都支持字符串或正则表达式。

(3)keep-alive会触发两个钩子函数:activated和deactivated,当组件被移除时,触发钩子函数deactivated。

九、SPA的理解:

(1)单页面应用的概念:

SPA:single page application,单页面应用

就是整个项目只有一个HTML页面(文件),首次加载时,把所有的HTML,css,js全部加载下来。通过操作Dom的删除和创建(添加)来完成页面的切换。

(2)单页面应用优缺点

优点:单页面应用相对服务器压力小【因为:首次、或者只要HTML,css和js加载完毕后,切换页面是不用再去服务器请求HTML,css和js,而是直接操作Dom】

2.局部刷新,所以,用户体验好。【通过删除,添加,修改Dom的方式】

3.前后端分离

4.页面效果比较炫酷(比如切换页面内容时的转场动画)

缺点:

不利于搜索引擎优化SEO(search engine optimization)。如:百度,360等搜索引擎搜索、

2.初次加载时耗时多(可以使用路由懒加载解决)

3.导航不可用,如果一定要导航需要自行实现前进、后退(Vue-Router做好了)。页面复杂度提高很多。

4.容易造成css命名冲突【用scoped或者BEM的方式解决】

十、请问怎么理解虚拟Dom和Diff算法

1.什么是虚拟Dom和Diff算法:

虚拟Dom:用JS对象模拟的真实Dom,该JS对象包含了真实Dom的所有属性和内容,

Diff算法:用来比较两个虚拟Dom的不同之处,并在旧的虚拟Dom树上打上标记。

2.虚拟Dom和Diff算法的作用:

虚拟Dom和Diff算法结合起来,用来提升性能。可以减少无效的Dom渲染,即:减少了无效的重排和重绘。

3.步骤(思路,流程)

(1)产生两个虚拟Dom树:newVDom,oldVDom

(2)oldVDom和真实Dom树保持一致

(3)数据变化时,影响的是newDom

(4)操作newVDom后,通过Diff算法对比newVDom和oldVDom的差异


http://www.kler.cn/a/155151.html

相关文章:

  • 【C#设计模式(4)——构建者模式(Builder Pattern)】
  • 卷积神经网络之Yolo详解
  • IP数据云 识别和分析tor、proxy等各类型代理
  • Linux screen和cscope工具使用总结
  • Servlet入门 Servlet生命周期 Servlet体系结构
  • python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态
  • 深入理解 Vue 中的指针操作(二)
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • 跟我学c++高级篇——动态反射之一遍历
  • 代码浅析DLIO(四)---位姿更新
  • LeetCode(49)用最少数量的箭引爆气球【区间】【中等】
  • 基本计算器[困难]
  • 【日常踩坑】Debug 从入门到入土
  • 完美解决:wget命令下载时遇到“错误 308:Permanent Redirect。”
  • 大数据Hadoop-HDFS_架构、读写流程
  • 【小沐学Python】Python实现Web服务器(Flask+celery,生产者-消费者)
  • LeetCode每日一题 | LeetCode-1094.拼车
  • 栈实现队列,力扣
  • ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO
  • MVCC-
  • 【.NET全栈】.net的微软API接口与.NET框架源码
  • LLM推理部署(三):一个强大的LLM生态系统GPT4All
  • AI - FlowField(流场寻路)
  • 2023年第十二届数学建模国际赛小美赛B题工业表面缺陷检测求解分析
  • 外包干了2年,技术退步明显。。。
  • solidity案例详解(五)能源电力竞拍合约