美文网首页
vue 面试题2020-05-07

vue 面试题2020-05-07

作者: 一心一念一间 | 来源:发表于2020-10-16 10:36 被阅读0次
    1. vue父子组件生命周期调用顺序
      加载渲染过程 和先序深度遍历顺序有关
      父beforeCreate-->父created --> 父beforeMount -->子beforeCreate -->子created-->子beforeMounted -->子mounted-->父mounted
      子组件更新过程
      父boforeUpdate -->子boforeUpdate-->子updated-->父updated
      父组件更新过程
      父beforeUpdate-->父uptated
      销毁过程
      父beforeDestory-->子beforeDestory-->子desroyed-->父destoryed
      理解:
      组件的调用顺序都是先父后子,渲染完成的顺序肯定是先子后父
      组件的销毁操作是先父后子,销毁完成的顺序是先子后父

    2. vue中相同的逻辑如何抽离
      vue.mixin 用法 给组件每个生命周期,函数都混入一些公共逻辑

    3. 为什么使用异步组件 异步组件是一个函数
      import() 如果组件功能多打包的结果会变大,可以采用异步方式加载组件,实现文件的分割加载

    4. 插槽与作用域插槽区别
      创建组件虚拟节点时,会将组件的儿子的虚拟节点保存起来,当初始化组件时,通过插槽属性将儿子进行分类{a:[vnode],b:[vnode]}
      渲染组件时会拿对应的slot属性的节点进行替换操作(插槽的作用域为父组件)
      作用域插槽
      在解析的时候,不会作为组件的孩子节点。会解析成函数,当子组件渲染时,会通知此函数进行渲染(插槽的作用域为子组件)

    5. keep-alive
      缓存组件,当组件切换时不会对当前组件进行卸载,常用的2个属性 include.exclude 2个生命周期 actived deactived

    6. hash路由和history路由

    7. vue-router 中的导航守卫有哪些 完整的导航解析流程

    8. vuex action 和 mutation区别
      mutation 是同步更新数据 用的$watch
      action 是异步操作

    9. vuex工作原理

    10. 箭头函数 与this ,能否用 new执行?
      1 没有自己的this,继承的上下文的this,call apply 所以不能改变this
      2 箭头函数中没有arguments,只能通过…arg获取传递的参数数组
      3 箭头函数 没有prototype ,没有this ,所以不能用new

    1. 编码优化
      1 不要将所有的数据都放到data中,data中的数据都会增加getter和setter,会收集对应的watcher
      2v-for 绑定事件时用事件代理
      3 spa页面采用 keep-alive 缓存组件
      4 拆分组件 提高复用
      5 key 写上
      6 object.freeze 冻结数据 静态数据可以冻结一下
      7 合理使用懒加载 异步组件
      8 数据持久化问题
    2. vue 加载性能优化
      长列表插件 vue-virtual-scroll-list
      图片懒加载 vue-lazyload
      用户体验
      app-skeleton 骨架屏 先显示个框
      app-shell APP壳 先显示个导航等
      pwa 离线缓存 用的很少了

    SEO优化
    预渲染插件 prerender-spa-plugin
    服务端渲染 ssr


    • 2. async await promise setTimeout 执行顺序 事件循环
      微任务 async 中的 await promise 中的resolve reject
      宏任务 ajax setTimeout 事件绑定
    • 3.
    var a = {
      i:1,
      toString(){   //  对象中的方法
        return this.i++
      },
      aa:()=>{  //与上一个写法区别? 这种是为了箭头函数写法
        console.log(2)
      } 
    }
    if(a ==1 && a == 2 && a ==3){
      console.log(1)
    }
    
    • 4. 脚手架配置 webpack 配置都有哪些
    • 5. vue 2.0 3.0 双向数据绑定原理
      2.o 缺点 1 需要对原始数据克隆一份 2 还得对每一个属性分别设置Object.definePrototype 3 数据都需要先声明到data中
      2.0 Object.definePrototype 来数据劫持的,大概逻辑是… 3.0 proxy 拦截器 来做的,相对于2.0 有哪些提升?
      以上缺点 proxy都解决了
         var obj = {name:'',age:22}
         obj = new Proxy(obj,{
           get(target,prop){
            return target[prop]
           },
           set(target,prop,value){
            target[prop] = value
           }
         })
    

    双向绑定 就是监听 onchange oninput 事件呗 mvc比mvvm 少了一层,视图更改,更新数据 就是监听input change事件

    • 6 跨域解决方案 实现原理
      jsonp 只支持get 有缓存 不安全 现在几乎不用了,之前用
      CORS 跨域资源共享 全都在 服务器端设置就好 缺点 只能写一个域 ,token 上送有点问题
      proxy 代理 webpack 中配置 proxy + nginx反向代理
    • 7. 组件通信 集合
      属性传递 只能父传子
      发布订阅 (eventBus)on/emit 子改父 自己写就是callback 回调函数
      Provide/inject 祖先与后代传递信息 通过上下文传递
      Slot
      parent/children
      Vuex 公共状态管理(一刷新就没了) 或者localstorage 本地存储,得设置一个过期限制
    • 8 diff 算法 事件复杂度 和算法原理
      两个数的完全的diff算法事件复杂度o(n3),vue 中做了优化,值对同级的元素进行比较,时间复杂度为o(n)
      先同级比较,再比较子节点,同级一样,直接复用
      先判断一方有儿子没儿子的情况,老的有新的没有,直接把老的儿子删除,新的有老的没有,把新的儿子插入到老的父节点中
      比较都有儿子的情况 最复杂
      递归比较子节点
    • 9. ajax 请求放在哪个生命周期中
      在created 的时候,视图中的dom都没有渲染处理啊,所以此时如果直接去操作DOM节点,无法找到相关的元素
      在mounted中,此时DOM已经渲染出来了,所以可以直接操作DOM节点
      一般情况 都放到mounted中,保证逻辑的统一性,因为生命周期都是同步执行的ajax是异步的。放在mounted中,不会等待ajax执行完后才执行后面的生命周期,
      服务端渲染不支持mounted方法,所以在服务端渲染的情况下统一放到created中
    • 10 何时使用beforeDestory
      可能在当前页面中使用了$on 方法 都需要在组件销毁前解绑
      清除自己定义的定时器
      解除事件绑定 scroll mousemove
    • 11.vue中模板编译原理 很复杂 模板引擎的实现吧
      将template 转化为render函数
      template模板— AST语法树 用一个对象来描述真实的js语法 -》变成render方法
    • 12.vue中v-if v-show 的区别
      v-if 如果条件不成立 不会渲染当前指令所在节点的DOM元素
      v-show 只是切换 当前dom的显示隐藏
      v-show 底层是complie编译成指令东西 匹配show指令 再控制隐藏
      v-if 是变成三元表达式了
    • 13. 为什么v-for 和v-if 不能连用
      v-for 比v-if优先级高一些 ,连用的话 循环的时候,会把v-if 给每个元素都添加一下,造成性能问题
    • 14 用vnode 描述一个dom节点
      虚拟节点就是用一个对象来描述真实的dom元素
      template—>ast树—>codegen—>转化为render函数—>内部调用createElement方法—>虚拟DOM
    • 15 v-for 中为什么加key
      Key主要做DOM-diff 且不能用index 。不加key的话 因为vue比对,一样的标签,会直接复用,删除的话不会删除第一个,会删除最后一个。 不加key,vue默认会加key,是索引。
    • 16. mixin mergeOptions
    • 17. 渲染更新 过程
      【Vue.extend 方法用来创建组建的】… 渲染组件时,通过Vue.extend方法构建子组件的构造函数,并进行实例化,最终手动调用$mount() 进行挂载。更新组件时会进行patchvnode 流程,核心是diff算法。
    • 18 组件中的data为什么是一个函数
      组件复用,函数能形成封闭作用域,避免组件复用数据互相影响
      同一个组件被复用多次,会创建多个实例。这些实例用的是一个构造函数,如果data是一个对象的话。那么多有组件就共享了一个对象了。 New Vue 中data可以是对象,应为它不会被公用。一个项目只能new一个实例。
    • 19 vue中的事件绑定
      1 原生绑定 普通标签 用的是 addEventListener
      2 组件绑定 用的是$on 发布订阅
    • 20 v-model 实现原理 如何自定义v-model
      组件的v-model 是input+value的语法糖 可以更改方法为change 更改属性为 checked
      原生的v-model 会根据标签和type 生成不同的事件和属性
      const VueTemplateCompiler = require(‘vue-template-compiler’)
      Const ele = VueTemplateComplie.compile(‘<input type=‘checkbox’ v-model = ‘value’/>’)
      console.log(ele.render)
      以上三行可用来测试 编译成什么东西
      加lazy 变成change事件 不加就是监听input事件
    • 21 v-html 会导致哪些问题
      xss攻击 (直接在input中输入获取cookie代码等) v-html 会清空替换掉标签内的子元素
      1382 -1411
    • 22 vue 父子组件生命周期调用顺序

    相关文章

      网友评论

          本文标题:vue 面试题2020-05-07

          本文链接:https://www.haomeiwen.com/subject/uaftnhtx.html