Vue面试题(第一版)

Vue面试题(第一版)

vue设计模式(MVVM)
  1. MVVM是 Model-View-ViewModel的缩写。mvvm是一种设计思想。

  2. Model层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;

  3. View层代表UI组件,它负责将数据模型转化成UI展现出来

  4. ViewModel是一个同步View和Model的对象。

  5. 在MVVM架构下,View和Model之间并没有直接的联系,而是通过ViewModel进行交互,Model和VIewModel之间的交互是双向的,因此View数据的变化会同步到Model中,而Model数据的变化也会立即反应到View上。

  6. ViewModel通过双向数据绑定把View层和Model层连接到一起,而View和Model之间的同步工作全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由MVVM来统一管理。

MVVM和MVC的区别

mvc和mvvm其实区别并不大,都是一种设计思想。主要是mvc中的Controller演变成mvvm中的ViewModel。mvvm主要解决了mvc中大量的操作DOM,使页面渲染性能降低,加载速度变慢,影响用户体验。

vue生命周期
  1. 什么是生命周期?

    Vue实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。

  2. Vue生命周期的作用是什么?

    他的生命周期中有多个事件钩子,让使用者在控制整个Vue实例的过程时更容易形成好的逻辑。

  3. Vue生命周期总有几个阶段?

    它总共分为8个阶段:创建前/后(breforeCreate,created)、载入前/后(breforeMount,mounted)、更新前/后(beforeUpdate,updated)、销毁前/后(breforeDestory,destory)

    1. 创建前/后:在beforeCreate阶段,Vue实例的挂载元素el还没有。
    2. 载入前/后:在beforeMount阶段,Vue实例的$el和data都初始化了,但还是挂载之前的虚拟的dom节点,data.message还未替换。在mounted阶段,Vue实例挂载完成,data.message成功渲染。
    3. 更新前/后:当data变化时,会触发beforeUpdate和updated方法。
    4. 销毁前/后:在执行destory方法后,对data的改变不会再触发周期函数,说明此时Vue实例已经解除了事件监听以及dom的绑定,但是dom结构依然存在。
  4. 第一次页面加载会触发哪几个钩子函数?

    beforeCreate,created,beforeMount,mounted

  5. DOM渲染在哪个生命周期就已经完成?

    DOM渲染在mounted中就已经完成

  6. 每个生命周期适合哪些场景

    beforeCreate:可以在加个loading事件,在加载实例时触发

    created:初始化完成时的事件写这里,如loading事件的结束,异步请求也适宜在这里调用

    mounted:挂载元素,获取到DOM节点

    updated:如果对数据统一处理,在这里写相应函数

    beforeDestory:可以做确认事件停止的确认框

    nextTick:更新数据后立即操作DOM

v-show与v-if的区别
  • v-show是切换css,v-if是完整的销毁和重新创建
  • 使用频繁切换时用v-show,运行时较少改变时用v-if
  • v-if="false",v-if是条件渲染,当false时不会渲染
开发中常用的指令有哪些
  • v-model:一般用在表达输入,实现表单控件和数据的双向数据绑定

  • v-html:更新元素的innerHTML

  • v-show与v-if:条件渲染

    使用v-if时,如果值为false时,页面不会生成这个标签

    v-show则是不管值为truefalse,都会生成标签,只是css中的display显示或隐藏

  • v-on:click:简写@click,绑定事件,可以触发指定事件处理函数

  • v-for:源数据多次渲染元素或模板块

  • v-bind:属性名:简写:属性名,当表达式的值改变时,可以直接改变DOM

    语法:v-bind:tit="msg"   简写: :title="msg"
    
路由跳转方式
  • 声明式跳转,即标签跳转

    <router-link to="/foo">Go to Foo</router-link>
    
  • 编程式导航,即js跳转

    this.$router.push({ path: "" })
    
computed和watch有什么区别
  • computed:

    • computed是计算属性,计算值,多用于计算值的场景
    • computed具有缓存性,computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时才会重新调用对应的getter;来计算
    • computed适用于计算比较消耗性能的计算场景
  • watch:

    • 更多只是观察的作用,类似于某些数据的监听回调;用于观察props$emit或者本组件的值,当数据变化是来执行回调监听
    • 无缓存性,页面重新渲染时值不变化也会执行

    小结:

    1. 当我们要进行数值计算时,而且依赖其他数据,那么设计为computed
    2. 如果只是需要在某个数据变化时做一些事情,使用watch来观察数据变化
keep-alive

keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,避免重新渲染,其特性入下:

  • 一般结合路由和动态组件一起使用,用于缓存组件
  • 提供include和exclude属性,两者都支持字符串或正则表达式,include表示只有名称匹配的组件会被缓存,exclude表示任何名称匹配的组件都不会被缓存,其中exclude的优先级比include高
  • 对应两个钩子函数activated和deactivated,当组件被激活时,触发钩子函数activated,当组件被移出时,触发钩子函数deactivated。
nextTick()
  • 在下次DOM更新循环结束之后执行延迟回调。在修改数据之后,立即使用这个回调函数,获取更新后的DOM

    vm.msg = "nextTick"
    Vue.nextTick(function() {
        // DOM 更新
    })
    
key

key是为Vue中vnode标记的唯一id,通过key,diff操作更准确、更快速

  • 准确
    • 如果不加key,那么vue会选择复用节点(Vue的就地更新策略),导致之前的状态被保留下来,会产生一系列的bug
  • 快速
    • key的唯一性可以被Map数据结构充分利用
组件之间的通信
  1. 父组件与子组件通信
// 父组件通过标签上面定义传值
<template>
    <Main :obj="data"></Main>
</template>
<script>
    import Main from "./main.vue";
    export default{
        name: "parent",
        data() {
            return {
                data: "我要传值给子组件"
            }
        },
        components: {
            Main
        }
    }
</script>
// 子组件通过props方法接受数据
<template>
    <div>{{data}}</div>
</template>
<script>
    export default{
        name: "son",
        props: ["data"]
    }
</script>
  1. 子组件向父组件传递参数
// 父组件监听派发的事件接收参数
<template>
    <main @msgFun="events">点我</main>
</template>
<script>
    import Main from "./main.vue";
    export default{
        name: "parent",
        methods: {
            events: function(msg) {
                console.log(msg);
            }
        }
    }
</script>

// 子组件通过$emit方法传递参数
<template>
    <div @click="handleClick">点我</div>
</template>
<script>
    export default{
        name: "main",
        data() {
            return {
                msg: "子组件参数"
            }
        },
        methods: {
            handleClick() {
                this.$emit("msgFun", this.msg)
            }
        }
    }
</script>
  1. 非父子,兄弟组件之间通信

    通过实例一个Vue实例Bus座位媒介,要相互通信的兄弟组件之中,都引入Bus,然后通过分别调用Bus事件触发和监听来实现通信和参数传递

// Bus.js
import Vue from "vue";
export default new Vue();
// 兄弟组件
<template>
    <div @click="handleToBus">点我</div>
</template>
<script>
    import Bus from "./bus.js";
    export default{
        methods: {
            handleToBus() {
                Bus.$emit("on", "来自兄弟组件");
            }
        }
    }
</script>

// 另一个兄弟组件
<script>
    import Bus from "./Bus.js";
    export default{
        data() {
            return {
                message: ""
            }
        },
        mounted() {
            Bus.$on("on", (msg) => {
                this.message = msg;
            })
        }
    }
</script>
Vue项目优化
  1. 代码层面的优化

    1. v-if 和 v-show 区分使用场景
    2. computed 和 watch 区分使用场景
    3. v-for 遍历必须为 item 添加 key,避免同时使用 v-if
    4. 长列表性能优化
    5. 事件的销毁
    6. 图片资源懒加载
    7. 第三方插件按需引入
    8. 路由懒加载
    9. 优化无限列表性能
    10. 服务端渲染SSR 或 预渲染
  2. webpack层面的优化

    1. webpack对图片进行压缩

    2. 减少ES6转为ES5的冗余代码

    3. 提取公共代码

    4. 提取组件的css

    5. 优化SourceMap

    6. 构建结果输出分析

    7. Vue项目的编译优化

  3. 基础的web技术的优化

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

推荐阅读更多精彩内容