百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

「2022」打算跳槽涨薪,必问面试题及答案——VUE3 篇

ztj100 2024-12-31 15:58 24 浏览 0 评论

1、Vue3 出现解决了什么问题?它有哪些优势?

Vue2 代码模式下存在的几个问题:

  • 随着功能增加,复杂的组件代码越来越多,变得难以维护。主要原因是 vue2 通过选项式API组织的代码,一个逻辑功能可能有多处代码,不易别人上手。
  • 缺少一个比较干净的在多个组件之间可以提取和复用逻辑的机制。
  • 类型推断不友好。
  • 没有静态类型检查,只有代码运行之后才能发现错误等等。

Vue3 是在 Vue2 的基础上进行了一些优化,对 typeScript 有了更好的支持。Vue3 和 Vue2 是可以共存的,Vue3 能够向下兼容支持选项式 API ,同时又新增了一些特性,大大提升了性能。

Vue3 的优势:

  • 性能更好
  • 体积更小
  • 更好地 ts 支持
  • 更好的代码组织
  • 更好的逻辑抽离
  • 更多新的功能

2、Vue3 新特性有哪些?

vue3的新增特性有:

1、性能提升

  • 响应式性能提升,由原来的 Object.defineProperty 改为基于ES6的 Proxy ,使其速度更快,消除警告。
  • 重写了 Vdom ,突破了 Vdom 的性能瓶颈。
  • 进行模板编译优化。
  • 更加高效的组件初始化。

2、更好的支持 typeScript

有更好的类型推断,使得 Vue3 把 typeScript 支持得非常好。

3、新增Composition API

Composition API 是 vue3 新增的功能,比 mixin 更强大。它可以把各个功能模块独立开来,提高代码逻辑的可复用性,同时代码压缩性更强。

4、新增组件

  • Fragment 不再限制 template 只有一个根几点。
  • Teleport 传送门,允许我们将控制的内容传送到任意的 DOM 中。
  • Supense 等待异步组件时渲染一些额外的内容,让应用有更好的用户体验。

5、Tree-shaking:支持摇树优化

摇树优化后会将不需要的模块修剪掉,真正需要的模块打到包内。优化后的项目体积只有原来的一半,加载速度更快。

6、Custom Renderer API: 自定义渲染器

实现 DOM 的方式进行 WebGL 编程。

3、vue2 和 vue3 的响应式有什么区别?

vue2 的响应式原理:

  • 对象:是通过 Object.defineProperty 对 对象的已有属性值的读取和修改进行劫持。
Object.defineProperty( 'data', 'count', {
 get(){   },
 set(){    }
})

存在的问题:对象直接添加新属性或删除已有属性的时候,界面不会自动更新。

  • 数组:是通过重写数组更新数组一系列更新元素的方法,来实现元素修改的劫持。
// 伪代码
const originalProto = Array.prototype
const arrayProto = Object.create(originalProto)
['push','pop','shift','unshift','splice','reverse','sort'].forEach(key=>{
 arrayProto[key] = function(){
  originalProto[key].apply(this.arguments)
  notifyUpdate()
 }
})

存在问题:直接通过下标替换元素或更新length的时候,界面不会自动更新。

针对 vue2 对象和数组的某些更新,界面不能自动更新的问题,vue2 通过 $set 方法,实现视图的实时更新。

vue3的响应式原理:

vue3 响应式是使用 ES6 的 proxy 和 Reflect 相互配合实现数据响应式,解决了 vue2 中视图不能自动更新的问题。

proxy 是深度监听,所以可以监听对象和数组内的任意元素,从而可以实现视图实时更新。

4、vue3 组合式API生命周期钩子函数有变化吗?

setup 是围绕 beforeCreate 和 created 生命周期钩子运行的,所以不需要显示的定义它们。其他的钩子都可以编写到 setup 内。

值得注意的是组合式API中的钩子函数,通过在生命周期钩子前面加上 “on” 来访问组件的生命周期钩子,需要注册,并且只能在 setup 期间同步使用,因为它们依赖于内部的全局状态来定位当前组件实例。

import { onMounted } from "vue"
export default {
 setup() {
  // mounted
  onMounted(() => {
   console.log('Component is mounted!')
  })
 }
}

下图是选项式API 和 组合式API 生命周期钩子对比:

5、Composition API 与 Options API 有什么区别?

Options API 是啥?

vue2 中我们把一个 vue 文件中 data、methods、props、mounted、computed 等定义属性和方法,共同处理页面逻辑,这种方式叫做 Options API。

这种方式开发的复杂组件,同一个功能的往往需要在不同 vue 配置项中定义属性和方法,代码比较分散。如果功能比较复杂,维护代码的时候往往会很难分清每个方法对应的功能,增加了代码维护成本。所以 vue3 舍弃了 Options API ,换用 Composition API。

Composition API 是啥?

Composition API 是 vue3 新增的,所以 vue2 没有。在 Composition API 中,根据代码逻辑功能来组织的,一个功能所定义的所有 API 都会放到一起,这样即使功能复杂,代码量增大,都可以一下子定位到某个功能的所有代码,代码维护方便。它的最大特点就是:高内聚,低耦合。

vue3 仍然支持 options API,但我们更推荐使用 Composition API。优劣比较:

  • 更好的可编程性。
  • 更优的代码组织。
  • 更好的逻辑抽象能力。
  • 对 tree-shaking 友好,代码也更容易压缩。
  • 没有 this ,没烦恼。

6、watch 和 watchEffect 的区别?

watch 和 watchEffect 都是监听器,watchEffect 是一个副作用函数。它们之间的区别有:

  1. watch 需要传入监听的数据源,而 watchEffect 可以自动手机数据源作为依赖。
  2. watch 可以访问倒改变之前和之后的值,watchEffect 只能获取改变后的值。
  3. watch 运行的时候不会立即执行,值改变后才会执行,而 watchEffect 运行后可立即执行。这一点可以通过 watch 的配置项 immediate 改变。

7、vue2 如何升级到 vue3 ?

如果是把之前的 vue2 项目升级到 vue3 ,先卸载旧版本的 vue-cli,安装最新版本。安装完成之后,检查 vue 的版本。然后需要注意,把项目中 vue3 发生改变或被废弃的特性需要进行修改。如:

  • $children 被 vue3 移除,使用 $children 的需要替换为 $ref。
  • filters 被移除,更改为 computed 。
  • $destory 被移除,需要删除掉。
  • 插槽的新变化。
  • Vuex 使用发生改变。
  • vue-router 使用发生改变等等。

可以自行在官网查看升级指南。地址如图

8、v-if 和 v-for 的优先级哪个高?

在 vue2 中 v-for 的优先级更高,但是在 vue3 中优先级改变了。v-if 的优先级更高。

在 vue2 中 v-for 和 v-if 同时出现时,可放在一个标签内,如下写法:

<div v-for="item in ss" v-if="item.show" :key="item.id">
 {{ item.show }}
</div>
data(){
 return{
  ss:[
   { id: 1, show: true, name: '1' },
   { id: 2, show: false, name: '2' },
   { id: 3, show: true, name: '3' },
  ]
 }
}

在 vue3 中这样写会报错,就是因为 v-if 的优先级更高,所以 item.show 是未定义报错了。

9、script setup 是干啥的?

scrtpt setup 是 vue3 的语法糖,简化了组合式 API 的写法,并且运行性能更好。使用 script setup 语法糖的特点:

  • 属性和方法无需返回,可以直接使用。
  • 引入组件的时候,会自动注册,无需通过 components 手动注册。
  • 使用 defineProps 接收父组件传递的值。
  • useAttrs 获取属性,useSlots 获取插槽,defineEmits 获取自定义事件。
  • 默认不会对外暴露任何属性,如果有需要可使用 defineExpose 。

10、Vue3 性能提升主要体现在哪几方面?

1、响应式性能提升

2、编译优化

3、源码体积的优化

相关推荐

sharding-jdbc实现`分库分表`与`读写分离`

一、前言本文将基于以下环境整合...

三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...

MySQL8行级锁_mysql如何加行级锁

MySQL8行级锁版本:8.0.34基本概念...

mysql使用小技巧_mysql使用入门

1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...

MySQL/MariaDB中如何支持全部的Unicode?

永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...

聊聊 MySQL Server 可执行注释,你懂了吗?

前言MySQLServer当前支持如下3种注释风格:...

MySQL系列-源码编译安装(v5.7.34)

一、系统环境要求...

MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了

对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...

MySQL字符问题_mysql中字符串的位置

中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...

深圳尚学堂:mysql基本sql语句大全(三)

数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...

MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?

大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...

一文讲清怎么利用Python Django实现Excel数据表的导入导出功能

摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...

用DataX实现两个MySQL实例间的数据同步

DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...

MySQL数据库知识_mysql数据库基础知识

MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...

如何为MySQL中的JSON字段设置索引

背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...

取消回复欢迎 发表评论: