面试题-vue深入面试题

① v-if 和 v-for 那个优先级更高?如果两者写在同一个标签,该如何优化?

  • 通过源码了解到render函数中,v-for优先级高于v-if
  • 解决方法:在v-for外层嵌套一个template标签,在该标签上进行v-if,可能会避免不必要的循环来提高性能。
如果v-for中,item根据条件渲染,则用计算属性,将需要渲染的过滤出来,提高性能。

② 为何组件的data需要是一个函数,而根实例却可以是对象形式?

  • 因为Vue组件可能存在多个实例,如果使用对象形式的data,则会导致他们共用一个data对象,那么状态变更将会影响所有组件实例,这样是不合理的。采用函数形式定义,在初始化data时,源码中的工厂函数会返回全新的data对象,有效规避污染问题。而在vue根实例创建过程中,则不存在该问题。因为根实例只有一个。

③ 为何要使用key?

  • 一句话概括:可以提高diff算法效率,提高性能。
  • 详细:key的作用是为了高效的更新虚拟DOM,通过源码分析出,patch过程中需要通过key可以精准判断出两个节点是否是同一个,从而避免频繁更新,使得整个patch过程更加高效。减少DOM操作提高性能。
  • 另外:不设置key还可能在更新列表时引发一些隐蔽的bug。

④ 介绍以下diff算法?

  • 我认为diff算法是虚拟DOM的必要产物,在比较DOM的时候,如果拿两个真实DOM比较,考虑到时间复杂度的话,是不可取的。所以需要采用虚拟DOM来提高比较效率。
  • diff过程:
    • diff过程整体遵循深度优先、同层比较的策略;比较两组子节点,如果没有找到相同子节点,就会采用通用方法进行遍历比较,查找结束后会按情况处理剩下的节点。借助key通常可以非常精确的找到相同节点。因此整个patch过程非常高效。

⑤ 介绍以下vue的思想

  • vue是渐进式,易用的一个JavaScript框架
渐进式
  • 有核心功能和附加产物,如果做做简单功能则学习核心功能即可,如果项目较为庞大需要用到vue-router、vuex等路由和状态管理插件,则需要额外学习。循序渐进的过程就叫做渐进式。
易用性
  • 只需要会css、js、html就可以进行上手开发,文档教程有中文较为详细。

⑥ MVC、MVP、MVVM区别?

  • 他们都是一种架构模式,MVVM是由MVC、MVP衍生出来的一种产物。都是为了解决Model和View耦合的问题。
MVC
  • 前端的MVC具备着:viewcontrollermodel三个层面。
    • view:负责视图展示,将model中的数据可视化
    • controller:负责业务逻辑,根据用户行为对Model数据进行修改
    • model:负责保存应用数据,与后端数据进行同步
  • 缺点:不得不把一个完整的页面分割,导致代码编写效率低下。
MVP
  • 主要把controller层换成了Presenter 层,减少view层的逻辑操作
  • 同事数据流都是双向的,view不能直接操作model,必须经过presenter层的处理
  • 缺点:逻辑都在presenter层,导致该层过于臃肿
MVVM
  • viewmodelviewModel
    • view:视图展示层
    • model:数据层,与后端数据同步
    • viewModel:逻辑层
  • 特点:
    1. viewModel有一套数据响应机制和一套视图更新策略来完成数据的双向绑定。
    2. 通过事件监听响应view中用户操作修改model中数据。
    3. 这样就在viewModel中减少了大量的DOM操作代码。使用户专注逻辑,兼顾开发效率和维护性。

⑦ Vue的优化

路由懒加载
  • 动态引入组件,需要用到的时候在进行加载。
const router = new VueRouter({
  routes:[
    {path:'/foo' , component: () => {import ( './Foo.vue' ) } }
  ]
})
keep-alive 缓存页面
  • 通过配置include,exclude进行区分。
<template>
  <div id="app">
    <keep-alive>
      <router-view />
    </keep-alive>
  </div>
</template>
v-show 渲染常切换组件
v-for避免和v-if同时出现在一个标签
  • 因为v-for 比 v-if优先级高,这会造成渲染错误。
  • 解决方法:在v-for外层包一个 template标签,在template标签上进行v-if
长列表优化(策略:利用cpu资源换内存资源)
  • 如果是静态数据,那么可以将数据在计算属性中返回并且Object.freeze()进行冻结,这样可以减少读取操作的次数。
  • 如果是动态数据,可以采用虚拟滚动:监听用户滚动行为,做出响应视图更新(只渲染少部分内容区域)
  • 虚拟滚动插件:vue-virtual-scroller 、vue-virtual-scroll-list
事件销毁
  • 订阅发布事件
  • 定时器任务
  • vue组件销毁时,会自动解绑它的全部指令以及事件监听器,但是仅限于组件本身的事件。
图片懒加载
  • vue-lazyload插件
 <img v-lazy="1.png">
第三方插件按需引入
  • element-ui里的组件
变量本地化
  • 遇到需要频繁操作的变量,建议用变量存到本地,在进行操作,可以减少读取操作。

SSR 服务端渲染

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容