Vue面试题(第一版)

2020-04-28  本文已影响0人  程序猿阿峰

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的区别
开发中常用的指令有哪些
路由跳转方式
computed和watch有什么区别
keep-alive

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

nextTick()
key

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

组件之间的通信
  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 查找性能瓶颈
上一篇 下一篇

猜你喜欢

热点阅读