vue3面试题

news2025/1/21 6:02:43

文章目录

  • 一、vue3有了解过吗?能说说跟vue2的区别吗?
    • 1.vue3介绍
    • 2.vue3的新特性:
      • 2.1速度更快
      • 2.2体积更小
      • 2.3更易维护
      • 2.4更好的Typescript支持
      • 2.5编译器重写
      • 2.6更接近原生
      • 2.7更易使用
    • 3.vue3新增特性
      • framents
      • Teleport
      • createRenderer
      • composition Api
    • 4.非兼容变更
      • Global API
      • 模板指令
      • 组件
      • 渲染函数
      • 其他改变
      • 移除API
  • 二、vue3.0所采用的Composition Api与Vue2.x使用的Options Api有什么不同?
    • 1.Options Api
    • 2.Composition Api
    • 3.对比
      • 3.1逻辑组织
      • 3.2逻辑复用

一、vue3有了解过吗?能说说跟vue2的区别吗?

1.vue3介绍

关于vue3的重构背景,尤大是这样说的:
vue新版本的理念成型于2018年末,当时vue2的代码库已经两岁半了,比起通用软件的生命周期来这好像也没那麽久,但在这段时期,前端世界已经今昔非比了。
在我们更新(和重写)vue的主要版本时,主要考虑两点因素:首先是新的JavaScript语言特性在主流浏览器中的受支持水平,其次是当前代码库中随着时间推移而逐渐暴露出来的一些设计和架构问题。
简要:

  • 利用新的语言特性(es6)
  • 解决架构问题

2.vue3的新特性:

  • 速度更快
  • 体积减少
  • 更易维护
  • 更接近原生
  • 更易使用

2.1速度更快

vue3和vue2相比

  • 重写了虚拟Dom实现
  • 编译模板的优化
  • 更高效的组件初始化
  • undate性能提高1.3~2倍
  • SSR速度提高了2~3倍

2.2体积更小

通过webpacktree-shaking功能,可以将无用模板‘剪辑’,仅打包需要的。
tree-shaking两大好处:

  • 对开发人员,能够对vue实现更多其他的功能,而不必担忧整体体积过大。
  • 对使用者,打包出来的包体积变小了
    vue可以开发出更多其他的功能,而不必担忧vue打包出来的整体体积过多。

2.3更易维护

compositon Api

  • 可与现有的Options API 一起使用
  • 灵活的逻辑组合和复用
  • Vue3模块可以和其他框架搭配使用

2.4更好的Typescript支持

vue3是基于typescipt编写的,可以享受到自动的类型定义提示。

2.5编译器重写

2.6更接近原生

可以自定义渲染API

import { createRenderer } from '@vue/runtime-core'
const { render } = createRenderer({
  nodeOps,
  patchData
})

2.7更易使用

响应式API暴露出来

import { observable,effect } from 'vue'
const state = observable({
  count: 0
})
effect(() => {
  console.log(`count is: ${state.count}`)
}) // count is: 0
state.count++ // counte is: 1

轻松识别组件重新渲染原因

const Comp = {
  render(props) {
    return h('div',props.count)
  },
  renderTriggered(event) {
    debugger
  }
}

3.vue3新增特性

vue3中需要关注的一些新功能包括:

  • framents
  • Teleport
  • composition Api
  • createRenderer

framents

在vue3.x中,组件现在支持有多个根节点

<!-- Layout.vue -->
<template>
  <header>...</header>
  <main v-bind="$attrs">...</main>
  <footer>...</footer>
</template>  

Teleport

Teleport是一种能够将我们的模板移动到DOM中vue app之外的其他位置的技术。
在vue2中,像modals,toast等这样的元素,如果我们嵌套在vue的某个组件内部,那么处理嵌套组件的定位、z-index和样式就会变得很困难。
通过Teleport,我们可以在组件的逻辑位置写模板代码,然后再vue应用范围之外渲染它。

<button @click="showToast" class="btn">打开toast</button>
<!-- to 属性就是目标位置 -->
<teleport to="#teleport-target">
  <div v-if="visible" class="toast-wrap">
    <div class="toast-msg">Toast文案<div>
  </div>
</teleport>

createRenderer

通过createRenderer,我们能够搭建自定义渲染器,我们能够将vue的开发模型扩展到其他平台。
我们可以将其生成在canvas画布上:
在这里插入图片描述
关于createRenderer,我们了解下基本使用:

import { createRenderer } from '@vue/runtime-core'
const { render, createApp } = createRenderer({
  patchProp,
  insert,
  remove,
  createElement,
  // ...
})
export { render, createApp }
export * from '@vue/runtime-core'

composition Api

composition Api,也就是组合式api,通过这种形式,我们能够更加容易维护我们的代码,将相同功能的变量进行一个集中式的管理。
关于composition api的使用:
在这里插入图片描述

export default {
  setup() {
  const count = ref(0)
  const double = computed(() => count.value * 2)
  function increment() {
    count.value++
  }
  onMounted(() => console.log('component mounted!'))
  return {
    count,
    double,
    increment
  }
}

4.非兼容变更

Global API

  • 全局vue API已更改为使用应用程序实例
  • 全局和内部API已经被重构为可tree-shakable

模板指令

  • 组件上v-model用法已更改
  • <template v-for>和非v-for节点上key用法已更改
  • 在同一元素上使用的v-ifv-for优先级已更改
  • v-bind="object"现在排序敏感
  • v-for中的ref不再注册ref数组

组件

  • 只能使用普通函数创建功能组件
  • functional属性在单文件组件(SFC)
  • 异步组件现在需要defineAsyncComponent方法来创建

渲染函数

  • 渲染函数API改变
  • $scopedSlots property已删除,所有插槽都通过$slots作为函数暴露
  • 自定义指令API已更改为与组件生命周期一致
  • 一些转换class被重命名了:
    • v-enter -> v-enter-from
    • v-leave -> v-leave-from
  • 组件watch选项和实例方法$watch不再支持点分隔字符串路径,请改用计算函数作为参数
  • vue2.x中,应用根容器的outerHTML将替换为根组件模板(如果根组件没有模板/渲染选项,则最终编译为模板)。vue3.x现在使用应用程序容器的innerHTML

其他改变

  • destroyed生命周期选项被重命名为unmounted
  • beforeDeatroy生命周期选项被重命名为beforUnmount
  • prop default 工厂函数不再有权访问this是上下文
  • 自定义指令API已更改为与组件生命周期一致
  • data应始终声明为函数
  • 来自mixindata选项现在可简单的合并
  • attribute强制策略已被更改
  • 一些过渡class被重命名
  • 组建watch选项和实例方法 $watch不再支持以点分隔的字符串路径。请改用计算属性函数作为参数。
  • <template>没有特殊指令的标记(v-if/else-if/else、v-for或v-slot)现在被视为普通元素,并将生成原生的<template>元素,而不是渲染其内部内容。
  • 在vue2.x中,应用根容器的outerHTML将替换为根组件模板(如果根组件没有模板/渲染选项,则最终编译为模板)。vue3.x现在使用应用容器的innerHTML,这意味着容器本身不再被视为模板的一部分。

移除API

  • keyCode支持作为v-on的修饰符
  • $on$off$once实例方法
  • 过滤filter
  • 内联模板attribute
  • $destroy实例方法。用户不应再手动管理单个vue组件的生命周期。

二、vue3.0所采用的Composition Api与Vue2.x使用的Options Api有什么不同?

Composition API可以说是vue3的最大特点,通常使用vue2开发的项目,普遍会存在以下问题:

  • 代码的可读性随着组件变大而变差
  • 每一种代码复用的方式,都存在缺点
  • TypeScript支持有限

以上可以通过使用Composition API解决。

1.Options Api

Options API即大家常说的选项API,以vue为后缀的文件,通过自定义methods,computed,watch,data等属性和方法,共同处理页面逻辑。
在这里插入图片描述
可以看到在Options代码编写方式,如果是组件状态,则写在data属性上,如果是方法,则写在methods属性上。
用组件的选项(data、computed、methods、watch)组织逻辑在大多数情况下都有效。
当组件变得复杂,导致对应属性的列表也会增长,这可能会导致组件难以阅读和理解。

2.Composition Api

在vue3 Composition API中,组件根据逻辑功能来组织的,一个功能所定义的所有API会放在一起(更加的高内聚,低耦合),即使项目很大,功能很多,我们都能快速的定位到这个功能所用到的所有API。

3.对比

下面对Composition Api 和Options Api进行两大比较:

  • 逻辑组织
  • 逻辑复用

3.1逻辑组织

Options API

假设一个组件是一个大型组件,其内部有很多处理逻辑关注点,碎片化使得理解和维护复杂组件变得困难,选项的分离掩盖了潜在的问题逻辑,在处理单个逻辑关注点的时候,我们必须不断地跳转相关代码的选项块。

Compostion API
Compostion API解决以上问题,将某个逻辑关注点 相关的代码全部放在一个函数里,这样当需要修改一个功能的时候,就不再需要在文件里跳来跳去。
将处理count属性相关的代码放在同一个函数:

function useCount() {
  let count = ref(10)
  let double = computed(() => {
    return count.value * 2
  })
  const handleCount = () => {
    count.value = count.value * 2
  }
  console.log(count)
  return {
    count,
    double,
    handleCount,
  }
}

在组件上使用count:

export default defineComponent({
  setup() {
    const { count, double, handleCount } = useCount()
    return {
      count,
      double,
      handleCount
    }
  }
})

简单总结:可以直观感受到Composition API在逻辑组织方面的优势,以后修改一个属性功能的时候,只需要跳到控制该属性的方法中即可。

3.2逻辑复用

在vue2中,我们是勇敢mixin去复用相同的逻辑。

export const MoveMixin = {
  data() {
    return {
      x: 0,
      y: 0,
    }
  },
  methods: {
    handleKeyup(e) {
      console.log(e.code)
      // 上下左右 x y
      switch (e.code) {
        case "ArrowUp":
          this.y--
          break
        case "ArrowDown":
          this.y++
          break
        case "ArrowLeft":
          this.x--
          break
        case "ArrRight":
          this.x++
          break
      }
    },
  },
  mounted() {
    window.addEventListener("keyup",this.handleKeyup)
  },
  unmounted() {
    window.removeEventListener("keyup",this.handleKeyup)
  },
}

在组件中使用:

<template>
  <div>
    Mouse position: x {{ x }} / y {{ y }}
  </div>
</template>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM区域划分

概述 JVM在运行代码时&#xff0c;他使用多块内存空间&#xff0c;不同的内存空间用来放不同的数据&#xff0c;然后配合代码流程&#xff0c;让系统运行起来。 存放类加载信息 举个最简单的例子&#xff0c;比如现在知道了JVM会加载类到内存里来供后续运行&#xff0c;所以…

java后端web前端10套项目开发案例源码,毕设,期末作业

项目包括 基础的html,css,js,jquery期末作业项目,毕设 1.古风诗意主题的背单词项目 2.模仿考虫软件实现的考拉背单词网页 3.模仿不背单词软件实现的背单词项目 html,css,js,jquery,瀑布流&#xff0c;懒加载的前端毕设 仿京东网站实现的前端平台 java基础作业 1.纯后端学生管…

初识Nodejs -- nodejs简介

视频链接&#xff1a;黑马程序员Node.js全套入门教程 文章目录1. 初识Nodejs1.1 思考为什么JavaScript可以在浏览器中被执行为什么JavaScript可以操作DOM和BOM&#xff1f;浏览器中的JavaScript运行环境1.2 Nodejs简介1.2.1 Nodejs中的JavaScript运行环境1.2.2 Node.js可以做什…

元数据管理-解决方案调研三:元数据管理解决方案——开源解决方案

开源解决方案 3.1、Apache Atlas Atlas 是一组可扩展和可扩展的核心基础治理服务——使企业能够有效和高效地满足其在 Hadoop 中的合规性要求&#xff0c;并允许与整个企业数据生态系统集成。 Apache Atlas 为组织提供开放的元数据管理和治理功能&#xff0c;以构建其数据资产…

没有公网IP,怎么远程访问ERP/NAS?

当前&#xff0c;国内疫情形势不容乐观&#xff0c;企业的经营发展再一次面临巨大挑战。虽然“远程办公”早已不是新鲜词&#xff0c;但依然有大量企业没有做好随时切换到远程办公的准备。如遇疫情风险&#xff0c;企业运营很容易陷入瘫痪。 企业一般在内网部署服务器、视频监…

2分钟看懂OA与ERP

ERP (Enterprise Resource Planning)即企业资源计划&#xff0c;最早是一种供应链的管理思想。它汇合了商贸代理行业的各项特点&#xff0c;旨在协调企业各管理部门围绕市场导向&#xff0c;更加灵活或柔性地开展业务活动&#xff0c;实时地响应市场需求。 从功能来看&#xf…

AVL树左旋转算法思路与图解

AVL树左旋转算法思路与图解 对于数列{4, 3, 6, 5, 7, 8}, 当我们插入8的时候, rightHeight() - leftHeight() > 1成立(也就是当前AVL树中的根节点的BF(平衡因子)> 1了), 此时这个AVL树已经不再是平衡的了, 也就是已经不是一个AVL树了, 所以我们要经过处理之后让其重新平…

【C】输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数

C语言没有字符串形式&#xff0c;所以可以用 char[] 数组来代替&#xff0c;但需要指定分配空间&#xff0c;所以可以采用单字符读取的形式&#xff1a; #include<stdio.h> int main(){char ch;int space0,number0,character0,other0;chgetchar(); …

WSO2安装使用的全过程详解

WSO2安装使用的全过程详解1. Install1.1 Docker Install 1.2 Uninstall2. User Guide3. Big Data -- Postgres4. Awakening1. Install 1.1 Docker Install 显示镜像 docker images/docker image ls拉去镜像/版本 docker pull wso2/wso2am 1.2 Uninstall 查看正在运行的容器 d…

流体动力润滑(轴承油膜承载机理)

目录 1.流体动力润滑 2.流体动力润滑的应用&#xff1a;楔形效应承载机理 3.承载量的计算 4.轴承动压油膜 1.流体动力润滑 定义&#xff1a;两个相对运动物体的摩擦表面&#xff0c;用于借助相对速度而产生的黏性流体膜将两摩擦面完全隔离开&#xff0c;由流体膜产生的压力…

那些下载不了的视频,Python只用1行代码就能直接下载

前言 现在有很多网站都并不支持直接下载的&#xff0c;例如我们常去的B站里面的视频&#xff0c;在页面是没有下载按钮的&#xff0c;还有的视频需要我们下载客户端才能下载…虽然这并不能拦住多少人&#xff0c;有些聪明的小伙伴就会去下载一些第三方软件去下载&#xff0c;比…

apache-atlas-hbase-bridge-源码分析

元数据类型 Hbase元数据类型, 包括命令空间、表、列族、列 public enum HBaseDataTypes {// ClassesHBASE_NAMESPACE,HBASE_TABLE,HBASE_COLUMN_FAMILY,HBASE_COLUMN;public String getName() {return name().toLowerCase();} }Hbase元数据采集实现 1&#xff09;批量采集HBa…

MyBatis基于XML的使用——缓存

1、介绍 MyBatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地 配置和定制。 为了使它更加强大而且易于配置&#xff0c;我们对 MyBatis 3 中的缓存实现进行了许多改进。 默认情况下&#xff0c;只启用了本地的会话缓存&#xff0c;它仅仅对一个会话中的数…

【Java】异常处理

异常本质上是程序上的错误&#xff0c;包括程序逻辑错误和系统错误。比如使用空的引用、数组下标越界、内存溢出错误等. 错误在我们编写程序的过程中会经常发生&#xff0c;包括编译期间和运行期间的错误&#xff0c;在编译期间出现的错误有编译器帮助我们一起修正&#xff0c;…

使用java代码向mysql数据库插入100万条数据

使用java代码向mysql数据库插入100万条数据 使用springboot集成Mysql数据库&#xff0c;并使用java代码循环向msql数据库插入100万条数据&#xff0c;并测试插入时间 目录结构使用java代码向mysql数据库插入100万条数据一、使用工具二、项目结构图创建springboot项目启动类创建…

高并发-防止雪崩与穿透

一、DB查询前加锁 /** * 本地堆内缓存&#xff0c;优先级最高 */ ON_HEAP(1), /** * 本地堆外缓存&#xff0c;不影响GC&#xff0c;可以管理比堆内缓存更多的数据 * 数据get/set涉及序列化&#xff0c;性能次于本地堆内缓存 */ OFF_HE…

手撕红黑树

目录 一、概念 二、红黑树的插入操作 第一步: 按照二叉搜索树的规则插入新节点 第二步: 插入后检测性质是否造到破坏&#xff0c;若遭到破坏则进行调整 情况一: cur为红&#xff0c;parent为红&#xff0c;grandfather为黑&#xff0c;uncle存在且为红 情况二: cur为红&a…

JLink 添加新设备用于下载/调试固件

新驱动的安装目录结构如下&#xff1a; 可以看出新版本的 JLink 驱动中已经没有 Devices 目录和 JLinkDevices.xml 文件了&#xff0c;即旧的方法已经不能在新的驱动中使用了。 如果需要继续使用旧的方式添加新设备&#xff0c;则需要下载 JLink_V770d 之前的版本。 在新驱动…

若依框架解读(微服务版)—— 4.认证,登出(Gateway网关)

认证 我们可以查看token值 我们进入授权中心&#xff0c;这里其他的解析解析token的步骤与上一篇文章中的生成token是逆操作&#xff0c;也比较简单。我们进入ignoreWhite.getWhites()方法 此处的两个注解是获取nacos当中的白名单&#xff0c;我们打开nacos&#xff0c;进入网关…

Shell程序退出状态码的命令详解

在本篇文章当中主要给大家介绍了一些常见的程序退出的状态码&#xff01;并且给出一下例子帮助大家仔细理解&#xff0c;并且使用C语言和python语言实现获取子进程退出时候的退出状态码。 程序退出状态码 前言 在本篇文章当中主要给大家介绍一个shell的小知识——状态码。这是…