Vue面试题

118 阅读4分钟

1.组件之间的通信

详情

2.v-if和v-for

vue2中v-for优先级高,vue3中v-if优先级高

不建议这两个一起使用,因为v-if是修改dom元素,导致性能变低,vue3中直接报错,当我们遍历数据的时候,建议先对数据进行处理,比如用computed处理数据,再用v-for渲染

3.生命周期

常用生命周期钩子函数

1.beforeCreate:组件实例初始化的时候调用

2.Created:组件实例初始化之后调用

3.beforeMount:组件被挂载前

4.Mounted:组件被挂载之后

5.beforeupdate:数据被修改之前

6.updated:数据被修改之后

7.beforeUnmount:组件被卸载前

8.Unmounted:组件被卸载之后

生命周期实践

beforeCreate:通常用于插件开发中执行一些初始化任务

created:组件初始化完毕,可以访问各种数据,获取接口数据

mounted:dom已创建,可用获取访问数据和dom元素,访问子组件等

beforeUpdate:此时view层还未更新,可以获取更新前的各种状态

updated:完成view层的更新,所有状态都是最新的

beforeunmounted:实例被销毁前,可用于一些定时器或订阅的取消

unmountde:销毁一个实例,可以清理与其他实例的连接,解绑他的全部指令和事件监听器

lifecycle.16e4c08e.png

4.双向绑定

v-model是一种语法糖,是input和value组合,绑定一个响应式数据到视图,视图中数据变化也会改变该值

<template>
  <div>
    <input type="text" @input="ValueChange">
    <h2>{{ value }}</h2>
  </div>
</template>
<script>
import { ref } from 'vue';

export default {
  setup() {
    const value = ref('')
    const ValueChange = (e) =>{
        console.log(e.data);
        value.value+=e.data
    }
    return {
        value,
        ValueChange
    }
  }
}
</script>
<style lang="less" scoped></style>

5.nextTick

等待下一次 DOM 更新刷新的工具方法。

<template>
 <div>
     <h2>{{ num }}</h2>
     <button @click="change(1)">+1</button>
     <button @click="change(0)">-1</button>
 </div>
</template>
<script>
import { ref,nextTick } from 'vue';

export default {
setup() {
 const num =ref(0)
 const change =async (isadd) =>{
     if(isadd){
         num.value++
     }else {
         num.value--
     }
     // await nextTick()
     console.log(document.querySelector('h2').innerHTML);
 }
   return {
     num,
     change
   }
},
}
</script>

当没有nextTick时,获取dom元素中的数据会慢一拍,而当有nextTick时就不会

image.png

6.如何缓存和更新组件

<KeepAlive> 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。

image.png

如图所示,有两个组件通过按钮进行切换,当在第一个组件中点击加号的时候,数据会变,如果此时切换组件,在切换回来,那么原来的数据就会变成初始值,因为没有加keep-alive,从而导致没有缓存,如果加了keep-alive,那么当切换组件的时候数据就不会初始化,而是保存是上次的数据

//父组件
<template>
  <div>
    <template v-for="(item, index) in component">
      <button @click="change(index)">{{ item }}</button>
    </template>

    <KeepAlive>
      <component :is="current" />
    </KeepAlive>
  </div>
</template>
<script>
import { ref } from 'vue'
import Count1 from './page/Count1.vue'
import Count2 from './page/Count2.vue'
export default {
  components: {
    Count1,
    Count2
  },
  setup() {
    const component = ['Count1', 'Count2']
    const current = ref(component[0])
    const change = (index) => {
      console.log(index)
      current.value = component[index]
    }
    return {
      current,
      change,
      component,
      Count1,
      Count2
    }
  }
}
</script>

//count组件
<template>
  <div>
    <h2>Count1</h2>
    <h2>{{ num }}</h2>

    <button @click="change(true)">+1</button>
    <button @click="change(false)">-1</button>
  </div>
</template>
<script>
import { ref } from 'vue'
export default {
  setup() {
    const num = ref(0)
    const change = (isadd) => {
      if (isadd) {
        num.value++
      } else {
        num.value--
      }
    }
    return {
      num,
      change
    }
  }
}
</script>

7.vue优化

1.路由懒加载

2.keep-alive

3.使用一些指令(v-show,v-oncee,v-memo)

4.v-for和v-if不一起使用(vue3直接报错)

5.长列表性能优化,只渲染一部分可视区域的数据

6.在befoeunmounted中销毁一些事件(比如settimeout)

7.图片懒加载

8.组件按需引入(element-ui)

8. $route和$router的区别

$route是“路由信息对象”,包括pathparamshashqueryfullPathmatchedname等路由信息参数。

$router是“路由实例”对象包括了路由的跳转方法,钩子函数等

9.diff算法

1.vue2 diff算法

双端diff算法:新旧虚拟dom分别有两个指针,头指针和尾指针,分别对比这四个指针指向的dom,如果相同则移动或者指针直接向后移动,直到四个节点都不相同,则进行虚拟节点的创建。

图例:

image.png 初始化新旧虚拟dom和指针,并且进行新旧节点的头指针比较,发现是相同的,此时新旧头指针移动

image.png 此时在比较新旧头指针指针,发现不同,此时比较新旧尾指针,也不同,在比较旧头指针和新尾指针,发现相同,此时移动相同的节点,并且指针也移动

image.png 此时在同理比较新旧头结点,如果相同则指针移动,不同在比较其他指针指向的节点。如果四个节点都不相同,那么此时就需要进行创建新节点。

最后刚好比较完成,新旧节点刚好比较完成是很难得,所以大概率会有剩余的节点,那么就需要对剩余的元素进行操作。

  • 旧节点数组遍历结束、新节点数组仍有剩余,则遍历新节点数组剩余数据,分别创建节点并插入到旧末尾索引对应节点之前
  • 新节点数组遍历结束、旧节点数组仍有剩余,则遍历旧节点数组剩余数据,分别从节点数组和 dom 树中移除

2.vue3 diff算法

最长递增子序列

10.vue2和vue3的区别

1.双向数据绑定改变,vue2用的是Object.definepropert(),而vue3用的是proxy,vue2用的方式监听不了对象的属性增加和删除,而proxy可以很好的解决这个问题。

2.Api不同,vue2是选项式api,vue3支持composition api

3.生命周期发生了变化,在vue2中是beforeDestroy和destroyed,而在vue3中是beforeUnmount和nmounted,在vue3中没有Created和beforeCreate生命周期

参考:juejin.cn/post/721113…