前端框架面试

2023-09-04  本文已影响0人  扶光_
各环节面试考察

computed有缓存,data不变不会重新计算

watch如何深度监听

什么是深度监听呢?
如我们在选择省/市/县 等这些信息时,他们在data选项中是层层嵌套的一个关系,我们要监听到县就必须使用一个deep属性

data(){
      return {
          info:{
                  city:'上海';
                }
        }
  }
watch(){
    info:{
      handler(oldVal,val){
        console.log(oldVal,val);//引用类型拿不到,要加deep
    },
    deep:true;//深度监听
    }

}

watch监听引用类型要深度监听,否则监听不到oldVal

v-for和v-if不能一起使用

v-for中的key属性作用

为了更加高效的更新虚拟 DOM,在进行 diff 时, 判断新旧节点是否是相同节点,会通过标签名和 key 进行比较。相同节点会更新属性,和比较子节点,不同节点则直接删除替换, 使用 key 标识可以优化比较过程

组件间的通讯

props和$emit

props父传子数据
$emit子组件调用父组件事件

生命周期

创建是有外到内的,渲染是从外到内的

自定义v-model 双向数据绑定

自定义v-model

$nextTick

vue是异步渲染
data改变之后,dom不会立即渲染
$nextTick会在dom渲染之后触发,以获取最新的dom节点

可以理解为批处理更新,把所有的update操作放到任务队列中,等主线程中执行栈的所有同步任务执行完毕,系统就会读取任务队列。

this.$nextTick(()=>{
  const rr = this.$refs.ur;
})

异步组件

直接写组件名是同步加载
import()函数 按需加载,异步加载大组件


image.png

keep alive 用于tab页面切换

缓存组件,频繁切换不需要重复渲染,vue性能优化

如我们有三个页面,a b c,当我们点击b是切换b页面,点c切c.这时我们需要v-if来进行组件间的切换.
但这样来回切换是频繁的被渲染被摧毁的.所以利用缓存包裹起来性能更好

<button @click="changestate('A')">a页面按钮</button>
<button @click="changestate('B')">b页面按钮</button>
<button @click="changestate('C')">c页面按钮</button>
<keep-alive>
  <A v-if="state=='A' ">
  <A v-if="state=='B' ">
  <A v-if="state=='c' ">
</keep-alive>

data(){
  return{
    state:'A'
  }
  }
methods:{
    changestate(state){
      this.state = state
    }
  }

mixin

多个组件有相同逻辑的抽离出来

vuex

vue-router

hash模式:http://abc.com/#/user 警号后面是路由
h5 history模式:http://abc.com/user
后者需要server端支持

动态路由 :id

懒加载 :import引入

vue组件如何通讯

1 父子组件通讯 属性和触发事件
2 自定义事件方式(组件间没有关系)
3 vuex的通讯

mvvm模型 (mode view view-model)

之前组件只是静态渲染,更新需要操作dom,所以那时候的jquery很火,因为可以用很少的代码去操作dom,而现在数据驱动视图,只需要修改数据视图就改变了


mvvm

Vue响应式

组件data数据发生变化立刻触发视图的更新
原理:
核心apiObject.defineProperty vue3采用Proxy更新了vue2的局限性,如数组下标

Object.defineProperty

缺点:Object.defineProperty深度监听需递归到底,无法监听新增和删除属性(vue.set和vue.delete来实现)

虚拟dom和diff算法

用js模拟dom结构,计算最小的变更,操作dom
xml语言可以用json对象来表示,所以dom结构可以使用js来表示
v-node模拟dom


将新旧node进行对比,找出最小范围进行更新
对比的过程就是diff算法
所以diff算法优化时间复杂度,
如tag不相同,直接删掉重建,不再深度比较
如tag个key都相同,则认为是相同节点,不再深度比较
所以为什么for循环中为什么要加key属性
diff算法通过tag和key判断是否为相同节点,减少渲染次数,提升渲染性能

模板编译

with语法
模板到render函数,再到vnode,再到渲染和更新
vue组件可以使用render代替template

组件渲染、更新过程

响应式监听data属性 getter setter
模板编译到render函数再到vnode
vdom patch(ele,vnode)和patch(vnode,newvnode)

解析模板为render函数
触发响应式,监听data属性 getter setter
执行render函数,生成vnode,patch(ele,vnode)

<p>{{msg}}</p>
data(){
    return {
        msg:'张三'; //会触发get  执行render函数 模板用到了
        age:55;//不会触发
    }
  }

更新过程
修改data,触发setter
重新执行render函数,生成newVnode
patch(vnode,newVnode)

异步渲染nextTick

汇总data的修改,一次性更新视图
减少dom操作次数,提高性能

前端路由原理

为何组件data是一个函数

实际上.vue文件是一个class类,当我在每个地方使用这个组件的时候相当于对class进行实例化,实例化执行data那么会形成共享的,所以定义为一个函数

ajax应该放在哪个生命周期

mounted中,整个渲染完成
因为js是单线程的,ajax异步获取数据

何时使用beforeDestory

解除自定义事件
清除定时器解绑自定义dom事件,如window scroll等

vuex中action和mutation的区别

action中处理异步,mutation不可以
mutation做原子操作(每次只能操作一个)
auction可以整合多个mutation

上一篇下一篇

猜你喜欢

热点阅读