vue 面试题

74 阅读2分钟

v-show 和 v-if 的区别:

    ​v-show 通过 CSS display 控制显示和隐藏

    ​v-if 组件真正的渲染和销毁,而不是显示和隐藏

    ​频繁切换显示状态用 v-show ,否则用 v-if

为何在 v-for 中用 key:

​必须用 key ,且不能是 index 和 random

    ​diff 算法中通过 tag 和 key 来判断,是否是 sameNode

    ​减少渲染次数,提升渲染性能

描述 Vue 组件生命周期(父子组件):

    挂载阶段:beforeCreate;created;beforeMount;mounted;

    ​更新阶段:beforeUpdate;updated

    销毁阶段:beforeDestroy;destroyed

created:实例初始化,页面还没有真正的渲染;mounted:渲染完成;

生命周期(父子组件):index(父);list(子)

创建由外至里,渲染由里至外;
index created > list created > list mounted > index mounted

index before update > list before update > list update > index update

父beforeCreate -> 父created -> 父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted->父beforeUpdate->子beforeUpdate->子updated->父updated->父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

Vue 组件常见的通讯方式:

    ​父子组件 props 和 this.$emit

    ​自定义事件 event.no event.no  event.off   event.$emit

    ​vuex

双向数据绑定 v-model 的实现原理:

    ​input 元素的 value = this.name

    ​绑定 input 事件 this.name = $event.target.value

    ​data 更新触发 re-render

http://img.mukewang.com/szimg/6404e5650991bcff08160389.jpg

computed 有何特点:

    ​缓存,data 不变不会重新计算

    ​提高性能

为何组件 data 必须是个函数:​实际vue是个class,每个vue文件使用相当于对组件实例化,多个data中的数据会共享,参数发生改变时会随之变化

ajax 请求应该放在哪个生命周期:

​    ​mounted

    ​JS 是单线程的,ajax 异步获取数据

    ​放在 mounted 之前没有用,只会让逻辑更加混乱

如何将组件所有的 props 传递给子组件:

    $poprs

    <User v-bind = "$props" />

如何自己实现 v-model:

// 手写 v-model
<template>
    <!-- 例如:vue 颜色选择 -->
    <input type="text"
        :value="text1"
        @input="$emit('change1', $event.target.value)"
    >
    <!--
        1. 上面的 input 使用了 :value 而不是 v-model
        2. 上面的 change1 和 model.event1 要对应起来
        3. text1 属性对应起来
    -->
</template>

<script>
export default {
    model: {
        prop'text1'// 对应 props text1
        event'change1'
    },
    props: {
        text1String,
        default() {
            return ''
        }
    }
}
</script>

多个组件有相同的逻辑,如何抽离:

    mixin

    以及 mixin 的一些缺点

何时使用异步组件:

    加载大组件

    路由异步加载

何时使用 keep-alive:

    缓存组件,不需要重复渲染

    如多个静态 tab 页的切换

    优化性能

何时需要使用 beforeDestory:

    解绑自定义事件 event.$off

    清除定时器

    解绑自定义的 DOM 事件,如 window scroll 等

作用域插槽

Vuex 中 action 和 mutation 有何区别:

action 中处理异步,mutation 不可以

    mutation 做原子操作

    action key整合多个 mutation

Vue-router 常用的路由模式

    hash 默认

    H5 history (需要服务端支持)

    两者比较

监听 data 变化的核心 API 是什么:

    ​Object.defineProperty

    ​以及深度监听、监听数组

    ​有何缺点

Vue 如何监听数组变化:

    ​Object.defineProperty 不能监听数组变化

    ​重新定义原型,重写 push pop 等方法,实现监听

    ​Proxy 可以原生支持监听数组变化

请描述响应式原理:

    ​监听 data 变化

    ​组件渲染和更新的流程

Vue 为何是异步渲染,$nextTick 何用:

    ​异步渲染(以及合并 data 修改),以提高渲染性能

    ​$nextTick 在 DOM 更新完之后,触发回调

​Vue 常见性能优化方法:

    ​合理使用 v-show 和 v-if

    ​合理使用 computed

    ​v-for 时加 key,以及避免和 v-if 同时使用 

    ​自定义事件、DOM 事件及时销毁

    ​合理使用异步组件

    ​合理使用 keep-alive

    ​data 层级不要太深

    ​使用 vue-loader 在开发环境做模板编译(预编译)

    ​webpack 层面的优化

    ​前端通用的性能优化,如图片懒加载

    ​使用SSR

    ​