9道vue面试题

2.VUE组件data为什么必须是函数

答:Vue组件可能存在多个实例,如果使用对象形式定义data,则会导致它们共用一个data对象,那么状态变更将会影响所有组件实例,这是不合理的。
采用函数形式定义,在initData时会将其作为工厂函数返回全新的data对象,有效规避多实例之间状态污染问题。
而在Vue根实例创建过程中则不存在该限制,也是因为根实例只能有一个,不需要担心这种情况。

3.Vue中key的作用和工作原理

  • key的作用主要是为了高效的更新虚拟DOM,其原理是vue在patch过程中通过key可以精准判断两个节点是否是同一个,从而避免频繁更新不同元素,使得整个patch过程更加高效,减少DOM操作量,提高性能。
  • 另外,若不设置key还可能在列表更新时引发一些隐蔽的bug。
  • vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

4.你怎么理解vue中的diff算法?

  • diff算法是虚拟DOM技术的必然产物:通过新旧虚拟DOM作对比(即diff),将变化的地方更新在真实DOM上;
    另外,也需要diff高效的执行对比过程,从而降低时间复杂度为0(N).
  • vue 2.x中为了降低Watcher粒度,每个组件必须有一个Watcher与之对应,只有引入diff才能精确找到发生变化的地方。
  • vue中的diff执行的时刻是组件实例执行其更新函数时,它会比对上一次渲染结果oldVnode和新的渲染结果newVnode,此过程成为patch.
  • diff过程整体遵循深度优先、同层比较的策略;两个节点之间比较会更具它们是否拥有子节点或者文本节点做不同操作;
    比较两组子节点是算法的重点,首先假设头尾节点可能相同做4次比对尝试;
    如果没有找到相同节点才按照通用方式遍历查找,查找结束再按情况处理剩下的节点;
    借助key通常可以非常准确的找到相同节点,因此整个patch过程非常高效。

5.谈一谈对vue组件化的理解

  • 组件是独立和可复用的代码组织单元。组件系统是Vue核心特性之一,它使开发者使用小型、独立和通??筛从玫淖榧菇ù笮拖钅浚?/li>
  • 组件化开发能大幅提高应用开发效率、测试性、复用性等;
  • 组件使用按分类有:页面组件、业务组件、通用组件;
  • vue的组件是基于配置的,我们通常编写的组件是组件配置而非组件,框架后续会生成其构造函数,它们基于VueComponent,扩展于Vue;
  • vue中常见组件化技术有:属性prop,自定义事件,插槽等,它们主要用于组件通信、扩展等;
  • 合理的划分组件,有助于提升应用性能;
  • 组件应该是高内聚、低耦合的;
  • 遵循单向数据流的原则。

6.谈一谈对vue设计原则的理解?

答:首先就是渐进式JavaScript框架:与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。
Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。
另一方面,当与现代化的工具链以及各种支持类库结合时,Vue也完全能够为复杂的单页应用提供驱动。

易用性

vue提供数据响应式、声明式模板语法和基于配置的组件系统等核心特性。
这些使我们只需要关注应用的核心业务即可,只要会写js,html和css就能轻松编写vue应用。

灵活性

渐进式框架的最大优点就是灵活性,如果应用足够小,我们可能仅需要vue核心特性即可完成功能;
随着应用规模不断扩大,我们才可能逐渐引入路由、状态管理、vue-cli等库和工具;
不管是应用体积还是学习难度都是一个逐渐增加的平和曲线。

高效性

超快的虚拟DOM和diff算法使我们的应用拥有最佳的性能表现。
追求高效的过程还在继续,vue3中将引入Proxy对数据响应式改进以及编译器中对于静态内容编译的改进都会让Vue更加高效。

7.对MVC、MVP和MVVM的理解

MVC

具备着View、Controller和Model
Model:负责保存应用数据,与后端数据进行同步
Controller: 负责业务逻辑,根据用户行为对Model数据进行修改
View: 负责视图展示,将Model中的数据可视化出来

MVP

MVP与MVC很接近,P指的是Presenter,presenter可以理解为一个中间人。
它负责着View和Model之间的数据流动,防止view和model之间直接交流。

MVVM(Model-View-ViewModel)

ViewModel通过实现一套数据响应式机制自动响应Model中数据变化;
同时ViewModel会实现一套更新策略自动将数据变化转换为视图更新;
通过事件监听响应View中用户交互修改Model中数据。
这样再ViewModel中就减少了大量DOM操作代码。
MVVM在保持View和Model松耦合的同时,还减少了维护他们关系的代码,使用户专注于业务逻辑,兼顾开发效率和可维护性。

总结

这三者都是框架模式,它们设计的目标都是为了解决Model和View的耦合问题。
MVC模式出现较早应用在后端,在前端领域的走起也有应用。
它们的优点是分层清晰,缺点是数据流混乱,灵活性带来的维护性问题。
MVP模式在是MVC的进化形式,Presenter作为中间层负责MV通信,解决了两者耦合问题,但P层过于臃肿会导致维护问题。
MVVM模式在前端领域有广泛应用,它不仅解决MV耦合问题,还同时解决了维护两者映射关系的大量繁杂代码和DOM操作代码,在提高开发效率、可读性同时还保持了优越的性能表现。

8.你了解哪些Vue性能优化方法

  • 路由懒加载
const router = new VueRouter({
  routes: [
    {path: '/foo',component: ()=>import('./Foo.vue')}
  ]
})
  • keep-alive缓存页面
<template>
  <div id="app">
    <keep-alive>
      <router-view />
    </keep-alive>
  </div>
</template>
  • 使用v-show 复用DOM
  • v-for 遍历避免同时使用v-if
<template v-if="show">
   <p v-for="v in list" :key="v.id">外层包一个template<p>
</template>
  • 长列表性能优化
    如果列表是纯粹的数据展示,不会有任何变化,就不需要做响应化
export default {
  data: ()  => ({
    users: []
  }),
  async created() {
    this.users = Object.freeze(获取来的数据)
  }
}

如果是大数据长列表,可采用虚拟滚动,只渲染少部分区域的内容

<recycle-scroller :items="items" :item-size="24">
  <template v-slot="{item}">
    <FetchItemView :item="item" @vote="voteItem(item)" />
  </template>
</recycle-scroller>
  • 事件的销毁
    Vue组件销毁时,会自动解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。
created() {
  this.timer = setInterval(this.refresh, 2000)
},
beforeDestroy () {
  clearInterval(this.timer)
}

  • 图片懒加载
    对于图片过多的页面,为了加载页面速度加速。所以很多时候我们需要将页面内未出现在可是区域内的图片先不做加载,等到滚动到可视区域后再去加载
  <img v-lazy="/static/img/1.png">

参考项目: vue-lozyload https://github.com/hilongjw/vue-lazyload

  • 第三方插件按需引入
    像element-ui这样的第三方组件库可以按需引入,避免体积较大。
import Vue from 'vue'
import {Button, Select} from 'element-ui'
Vue.use(Button)
Vue.use(Select)
  • 无状态的组件标记为函数式组件
<template functional>
</template>
  • 子组件分割
  • 变量本地化
const base = this.base //不要频繁引用this.base
  • 服务端渲染 - SSR

9.你对Vue3.0的新特性有没有了解?

  • 更快
    1.虚拟DOM重写
    2.优化slots的生成
    3.静态树提升
    4.静态属性提升
    5.基于Proxy的响应式系统
  • 更小
    1.通过摇树优化核心库体积
  • 更容易维护
    1.TypeScript + ??榛?/li>
  • 更加友好
    1.跨平台:编译器核心和运行时核心与平台无关,使得Vue更容易与任何平台一起使用
  • 更容易使用
    1.改进的TypeScript支持,编辑器能提供强有力的类型检查和错误及肩高
  • 更好的调试支持
  • 独立的响应化???/li>
  • Composition API
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351