事关我对于前端面试题的收集--第一弹

294 阅读3分钟

“这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

写在前面: 前段时间是在找工作,一直在寻找些线上面试,电话面试,然后碰到了很多有意思的面试题,有些知道解法,有些还不知道答案,记录一下.

事关我对于前端面试题的收集--第一弹

说一下Vue2和Vue3的区别

  • Options API ---> Composition API
  • 响应式底层实现由Object.defineproperty变更为Object.proxy
  • 生成BlockTree vue2的渲染跟组件大小有关,对于静态展示列表会有不必要的性能浪费,vue3里生成BlcokTree,它是将模板基于动态节点指令切割的嵌套区块,所以vue3的渲染指跟动态节点的数量有关系,因为本身静态数据就不需要响应式.
  • 会在生成虚拟dom的时候新增一个静态标记patchflag,在每次数据更新的时候,只对比带有patchflag的节点

知道Vue里面的mixin吗,说一说

这是一个类似于组件的东西,mixin里面有生命周期,data以及methods等元素,可以通过混入的方式封装一些复用性代码.

同名数据以组件内数据优先,同名生命周期函数会进行合并,且混入的代码先执行,同名对象如methods等,先进行对象合并,若有同名对象,取组件内对象键值对.

vue.extend()也以同样的策略执行

//可以这样使用
import {mixin1} from './mixin.js'
export default{
    mixins:[mixin1],
    data(){
        return{
        
        }
    }
}

//也可以全局注入
Vue.mixin({
    data(){
        return{}
    },
    methods:{
        
    }
})

说一说$nexttick

作用

当在vue中操作dom之后,可以用nexttick来手动刷新dom,就类似用nexttick来手动刷新dom,就类似用set去修改响应式数据一样.

实现原理

判断浏览器的MutationObserve事件监听dom更新,vue用异步队列的方式来控制DOM更新和nextTick回调先后执行,让nextTick里的代码放在UI render步骤后面执行,就能访问到更新后的DOM了

Vuex的实现原理

基于vue的数据双向绑定实现,跟vue框架高度绑定

原理其实就是在vue实例上全局注册了一个store对象(通过vue的mixin机制) , 在每个组件的beforeCreated生命周期里添加到每个组件里面,用vue.mixin注入的方式.

store里面的state, 存入vue实例的data,具有响应式 , getter类似计算属性 , mutation 类似于 methods, 通过dispath可以触发actions里面的方法 , 通过commit可以触发mutation里面的方法

v-for和v-if的优先级

v-for跟v-if在编译时的过程

v-for的优先级比v-if高,因为在template编译的时候,会使用parse方法解析模板代码成AST树,接着在codegen过程中,会先解析AST树中的与v-for相关的属性,再解析与v-if相关的属性,在编译的过程中v-for的判断是在v-if的前面.

注意

避免一起使用,因为v-for的优先级更高,如果v-if判断为false,然后v-for遍历渲染完节点再删除掉,很浪费性能

父子组件的生命周期执行顺序

组件渲染:

父bc-> 父c-> 父bm-> 子bc-> 子c-> 子bm-> 子m-> 父m

组件更新:

父bu ->子bu ->子u ->父u

组件销毁

父bd-> 子bd-> 子d-> 父d

Vue的mixin(混入)的生命周期跟父子组件生命周期执行顺序一致

End