首页 > 其他分享 >vue面试1

vue面试1

时间:2024-03-08 19:22:41浏览次数:28  
标签:vue DOM event 面试 组件 data 监听

生命周期函数(父子)顺序

父beforeCreate  =>. 父created ==>. 父beforeMount ==> 子beforeCreate ==> 子created ==> 子beforeMount ==> 子mounted ==> 父mounted

更新顺序

父beforeUpdate ==> 子beforeUpdate ==> 子updated ==> 父updated

卸载顺序

父beforeDestory / 子beforeDestory / 子destroyed / 父destroyed

 

vue2自定义 v-model

props: ['text']  
model: {
   prop: 'text', event: 'change'
}
:value  @input="$emit('change')"

 

v-if(存在DOM销毁和创建,可以有多个互斥的分支)和v-show(使用 display: none 来控制是否显示)

v-html 会有XSS 风险,会覆盖 children 里面的内容

watch 深度监听一个对象,拿不到 oldvalue,因为是引用

 

v-for和v-if 不要在一个标签上面使用(在vue3上 v-if的优先级高于 v-for)

事件对象 $event 是原生的mouseEvent对象 和 react 不同 $event.target 是注册到的 div / @click定义的位置 $event.currentTarget 事件被注册到当前的元素,react是注册到 root 标签上的 但是 vue 不是   vue是异步渲染的,data修改之后 DOM不会立即渲染,多次 data修改做整合,只会触发渲染一次 但是可以在 $nextTick 中获取最新的DOM   slot 插槽 作用域插槽(使用子组件中的 data) 具名插槽(有名称)   动态组件 <component. :is='name'.  /> vue2只需要 名称, vue3必须是 一个具体的组件变量   异步组件 components: { FormDemo: () => import(.....) } 用到的时候才会去 加载对应的 js 文件,减小打包体积,提高性能     keepalive 用于频繁切换(常见性能优化) 缓存组件,不需要重复渲染

 

mixin的问题

变量来源不清晰,不利于阅读,重名(当有多个的时候), 功能不能有效拆分

组件和mixin 可能出现多对多的现象 mixinMounted 先执行 mounted 后执行

 

组件化:并不是新出现的。 后端原本就有 <%include. 文件。 %>

MVVM: 数据驱动视图,不需要修改DOM,只关注于业务逻辑

vue的响应式,自动触发视图更新

proxy 兼容性不好,且无法 poly fill   defineProperty 的缺点 无法监听到新属性 / 下标 的 值,同样也无法 删除,无法监听原声数组,需要特殊处理 需要使用Vue.set / delete   复杂对象

需要开始深度监听 (递归操作),而且在赋值时也要 深度监听(在 runtime 时执行),计算量大

 

vdom 核心减少计算次数的难度, 计算出最小的变更,然后执行DOM操作 { tag: 'div', props: { id: 'div1' }, children: [ ] } 使用JS来模拟DOM的结构   snabbdom 学习 vdom h / patch 函数 h 函数接受 vdom得出vnode, patch函数负责 挂载/更新/卸载 新旧vnode对比,得出最小更新范围,最后更新DOM   tag都可以有 key 属性 patchVnode / addVnode / removeVnode updateChildren key的重要性   diff 算法 是vdom中最核心,最关键的部分 并不是 vdom 独创的,如 Linux diff 比较2个JS对象也可以做 diff 库 jiff

 

树的时间复杂度为 O(n^3) 1000个节点,需要计算1000^3次 怎么办 优化时间复杂度到 O(n) ,怎么实现 1.只比较同一层级,不跨级比较 2.tag不相同,则直接删除重建,不再深度比较 3.tag和key相同,二者都相同,则认为是相同节点 日常中大多数就是同级比较  

编译模板

vue template complier 将模板编译为 render 函数 执行 render 函数生成 vnode

with 要慎用,它打破了作用域规则,易读性变差 vue-loader 会在开发环境下编译模板 vue组建中使用render函数代替template

 

 组件渲染更新过程

  • 初次渲染过程
1.解析模板为render函数(或者在开发环境下完成 vue-loader) 2.触发响应式,监听data属性 getter setter 3.执行render函数,生成vnode,patch(container, vnode) 当data里面的 数据没有在 template中用到,就不会出发 getter,也就不会被监听到 因为和视图没有关系,没有用到  
  • 更新过程
1.修改data,触发setter 此前getter中已经被监听 2.重新执行 render函数,生成newVnode 3.patch(vnode, newVnode)

异步渲染 减少DOM操作次数,提高性能     前端路由原理 hash变化会触发网页跳转,即浏览器的跳转 不会刷新页面,SPA必须的特点 hash永远不会提交到 server 端, 重写   window.onhashchange = (event) => { }   history 路由:URL规范的路由,跳转时不刷新页面 history.pushstate / onpopstate window.pushstate     hash 管理系统,能用就尽量使用,比如不需要 SEO history 可以考虑(to C 消费者)需要服务端支持     v-for中的key diff算法中通过 tag 和 key来判断是否是 sameNode   减少DOM操作次数,提高性能   v-model的原理:手动控制。value和 input 事件,重新出发re-render $props 传递给子组件   ajax 应该放在 mounted中: JS是单线程,放在mounted之前没有用,逻辑只会更加混乱   何时需要beforeDestory 解绑自定义事件 event$off 清除定时器 解除自定义的DOM事件,window.scroll   mutation 做原子操作 action 可以整合多个mutation操作   常见的性能优化 合理使用 v-show/ v-if / computed v-for 增加 key,以及避免 v-if 一起使用 销毁事件,避免越用越卡 合理使用异步组件 / keep-alive data 层级不要太深,因为需要深度监听 前端通用性能优化, 比如:图片懒加载     vue3有什么优势 性能更好,体积更小,更好的TS支持,更好的代码组织/逻辑复用 更多新功能,过度依赖 this,无法 treeshaking   vue3升级了那些功能 1.creatApp / emits 2.多事件处理 @click="one($event), two($event)" 3.fragment 以前必须是单一根节点 4.移除 .sync使用v-model代替 / 移除filter 5.异步组件 defineAsyncComponent 6.teleport / suspense     Reflect 反射到代理对象上来 规范化 / 标准化 / 函数化 代替了许多 Object 上的函数   proxy 如何实现监听 也是需要深度监听,并不是和defineProperty一样需要一次性监听 只有在get的时候才递归,而defineProperty需要开始就递归。提高了性能 可以原声监听数组变化 可监听新增和删除   .sync 实现:this.$emit('update: title', value)   watch和watchEffect 都可以监听,watch需要给出具体监听的值,watchEffect 则不需要 watchEffect 初始化会执行一次,要收集需要监听的数据   setup如何获取组件的实例: 没有 this getCurrentInstance, data数据需要在 onMounted中才有,此时还没有完成初始化   vite为什么这么快 开发环境无需打包,启动很快,因为开发环境使用ES6 module 生产环境使用 rollup 并不会快很多   可以远程引入CDN包 可以动态引入 const add = await import('.....').default 点击按钮后才加载   组合式API 和 react hooks的区别 setup(相当于一个生命周期)只会被调用一次,后者会被多次调用 前者没有 useMemo/ useCallback ,因为只会被调用一次,数据已经是必包中 前者无需考虑调用顺序,后者需要保证hooks的顺序一致          

 

标签:vue,DOM,event,面试,组件,data,监听
From: https://www.cnblogs.com/escapist/p/18061424

相关文章

  • Vue3 组合函数拖拽
    代码exportfunctionuseDragMouse(dom,container){letcontainerX=0;letcontainerY=0;letstartX=0;letstartY=0;functiondragPage(e){container.value.style.left=e.pageX-startX+containerX+"px";container.valu......
  • 用Vue3.0 写过组件吗?如果想实现一个 Modal你会怎么设计?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、组件设计组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式现在有一个场景,点击新增与编辑都弹框出来进行填写,功能上大同小异,可能只是标题内容或者是显示的主体内容稍微不同这时候......
  • 前端面试题集合
    小程序面试题小程序的双向绑定this.setData({})小程序的自适应rpx小程序在页面中怎么样传递数据(1).全局传递app.jsglobalData(2).跳转页面的传参wx.navigateTo 和 wx.redirectTo在跳转后的页面onload的option小程序的生命周期onLoad 页面加载时触发。一个页......
  • 前端技术面试题
      1.JS中的数据类型有哪些?_____________________________________________ 2.JS中强制类型转换为number类型的方法有哪些?_____________________________________________ 3.字符串转换成数组的方法是_________,数组转换成字符串的方法是________ 4.手写js‘数组去重......
  • 面试1
    1.为什么typeofnull ='object'是通过类型标记位,而null是一个固定的值。开头为000000:object001:integer010:double100:string110:boolean 2.+操作转化为数字传统数据类型toNumber(null)  0toNumber(undefined) NaNtoNumber(1)  1toNumber("123a......
  • vue常量定义以及使用
    在Vue项目中,您可以在JS文件中定义常量,然后通过 Vue.prototype 在 main.js 中定义这些常量为全局变量,以便在Vue组件中直接使用。以下是如何实现这一点的步骤:定义常量首先,创建一个JS文件来定义您的常量。例如,您可以创建一个名为 constants.js 的文件,并在其中定义......
  • Vue面试题
    1、active-class是哪个组件的属性?嵌套路由怎么定义?答:vue-router模块的router-link组件。 2、怎么定义vue-router的动态路由?怎么获取传过来的动态参数?答:在router目录下的index.js文件中,对path属性加上/:id。 使用router对象的params.id 3、vue-router有哪几种导航钩子? ......
  • 前端中级面试
     js原理题1.什么是闭包,举个例子说明一下?答:“闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。”举例:创建闭包最常......
  • html中使用vue和elementui
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"><!--importCSS--><linkrel="stylesheet"href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"></head><body><......
  • 软件测试经典面试题:如何测微信的朋友圈?
    这是一道非常经典的面试题,相信很多小伙伴在面试中都被面试官问到过这个问题,想要回答好这个面试题,我们首先要搞清楚面试官在考察候选者什么方向测试技能。其实不难猜出,面试官主要是想考察候选者测试用例设计能力。一般会从以下两个方面来考察候选者:1、测试用例设计的全面性2、测试......