当前位置: 首页 > news >正文

【前端面试题】Vu3常见的面试题

1.Vue3与 Vue2的核心区别有哪些?

  1. 响应式系统 ‌:

    • ‌ Vue2:通过Object.defineProperty 实现响应式。这种方式在处理对象属性的添加和删除时存在局限性,且无法直接监控数组的变化 ‌;
    • ‌Vue3:采用Proxy 实现响应式,可以直接监控数组的变化,且性能更高。Proxy 提供了更多的功能,如拦截、应用、拥有密钥等,这些在 Object.defineProperty 中无法实现 ‌;
  2. 性能优化 ‌:

    • ‌Vue3在性能上有显著提升,包括打包大小减少41%,初次渲染速度提升55%,更新渲染速度提升133%,内存占用减少54%‌;
    • ‌ 虚拟DOM优化 ‌:Vue3重构了虚拟DOM的实现,优化了模板编译时间,提取和重用了内联事件,减少了不必要的重绘和重新计算 ‌;
  3. 组合式 API‌

    • ‌Vue2采用选项式 API(Options API),逻辑分散在 data、props、computed、watch 等选项中,导致代码可读性差 ‌;
    • ‌Vue3引入了组合式 API(Composition API),将相关逻辑放在一个函数中,增强了代码的可读性和内聚性。通过 setup 函数、ref、reactive、watch 等函数组织代码,提高了逻辑复用性和代码维护性 ‌;
  4. 生命周期钩子 ‌:

    • ‌Vue2有 10 个生命周期钩子,如 beforeCreate、created、beforeMount、mounted 等 ‌;
    • ‌Vue3简化了生命周期钩子,只有 7 个,主要包括 setup、onBeforeMount、onMounted、onBeforeUpdate、onUpdated、onBeforeUnmount、onUnmounted 等 ‌;
  5. 对 TypeScript 的支持 ‌:

    • ‌Vue3原生支持TypeScript,提供了更好的类型推断和类型安全,减少了手动类型注释的需求,提升了代码质量和开发效率 ‌;

2.Vue3.0所采用的Composition Api 与Vue2.x使用的Options Api有什么不同?

Options API:逻辑分散在 data/methods/computed 等选项中,复用需 Mixin;
Composition API:通过 setup 函数组合逻辑,复用通过自定义 Hook,代码更清晰;

区别

  1. 代码组织方式

    • Options API:按功能模块拆分代码(data、methods、computed等选项),逻辑分散在不同选项中;
    • Composition API:通过setup函数以函数式风格组织代码,逻辑按功能抽取为独立函数(如useCounter);
  2. 逻辑复用机制

    • Options API: 通过mixins复用逻辑,但存在命名冲突、变量来源不清晰等问题;
    • Composition API:通过自定义组合函数(如useFetch)实现逻辑复用,变量作用域明确,避免命名污染;
  3. 类型支持

    • Options API:需通过@types/vue声明类型,类型推导较弱,复杂场景易出错;
    • Composition API:原生支持TypeScript,函数参数和返回值可明确标注类型,类型推导更精准;
  4. 响应式系统的使用

    • Options API:通过this访问响应式数据,依赖Object.defineProperty实现;
    • Composition API:通过ref、reactive等函数显式创建响应式变量,直接操作值(如count.value++)。更细粒度的依赖追踪(基于Proxy),支持动态新增/删除属性;
  5. 生命周期钩子

    • Options API:直接使用created、mounted等生命周期选项;
    • Composition API:在setup中通过onMounted、onUpdated等函数注册生命周期钩子,逻辑更集中;
  6. 适用场景

    • Options API:简单组件或对TypeScript需求不高的项目;
    • Composition API:复杂组件、大型项目或需要逻辑高度复用的场景;

3.Vue2 和 Vue3 双向绑定的原理和区别?

Vue2的双向绑定原理:Vue 2 的双向绑定是基于 Object.defineProperty 和发布-订阅模式实现的。以下是其实现的关键步骤:

  1. 数据劫持

    • Vue2 使用Object.defineProperty对数据对象的每个属性进行劫持,通过定义getter和setter 方法来拦截数据的读取和修改操作;
    • 当数据被访问时,触发getter,进行依赖收集;当数据被修改时,触发setter,通知视图更新;
  2. 依赖收集

    • 在组件初始化时,Vue会解析模板中的指令(如 v-model),并为每个依赖于响应式数据的地方创建一个Watcher 实例;
    • Watcher 会将自身添加到对应数据属性的Dep中,Dep用于管理所有依赖该属性的Watcher;
  3. 视图更新

    • 当数据通过setter被修改时,Dep会通知所有相关的 Watcher,Watcher则会调用更新函数来重新渲染视图;

Vue3的双向绑定原理

  1. 数据劫持

    • Vue3使用Proxy来拦截对象的操作,包括属性的访问、修改、删除等;
    • Proxy提供了更全面的拦截能力,能够直接处理对象的动态属性添加和删除;
  2. 依赖收集与更新

    • 在初始化时,Vue3通过Proxy的getter拦截器进行依赖收集,将Watcher添加到对应的依赖管理器中;
    • 当数据通过setter被修改时,Proxy会通知所有相关的Watcher,触发视图更新;

区别

  1. 底层实现

    • Vue 2:基于Object.defineProperty,只能劫持对象的现有属性,无法自动检测新属性的添加或删除;
    • Vue 3:基于Proxy,能够拦截对象的所有操作,包括动态属性的添加和删除;
  2. 性能优化

    • Vue 2:由于使用发布-订阅模式,当数据变化时,所有订阅者都需要被通知,可能导致性能问题;
    • Vue 3:通过Proxy,能够更精确地检测数据变化,减少不必要的更新,提高性能;
  3. 灵活性

    • Vue 2:在处理复杂数据结构时,如动态添加属性或修改数组长度,需要使用Vue.set 或其他方法;
    • Vue 3:直接支持动态属性和数组操作,无需额外方法;
  4. 对 TypeScript 的支持

    • Vue 2:类型系统相对较弱;
    • Vue 3:提供了更丰富的类型定义和更好的集成,更适合TypeScript开发;

4.Vue3的emits选项定义组件事件与Vue2的emit事件处理有何不同?

  1. 声明方式:强制显式 vs 隐式触发

    • Vue3:必须通过emits选项声明事件(选项式 API)或 defineEmits(组合式 API),否则触发未声明事件时会抛出警告;
    • Vue2:无需声明,直接通过this.$emit触发事件,未监听的事件会静默忽略;
  2. 类型安全:原生支持 vs 依赖第三方

    • Vue3:支持TypeScript类型标注,精确约束事件参数类型;
    • Vue2:无原生类型支持,需依赖vue-class-component等库实现类型约束;
  3. 错误处理:警告提示 vs 静默失败

    • Vue3:触发未声明的事件时,若父组件未监听,则抛出警告(可通过 inheritAttrs: false禁用);
    • Vue2:触发未声明事件时,不会报错,直接忽略;
  4. 继承行为:事件与属性分离

    • Vue3:事件不会被继承到子组件的根元素,避免与HTML原生事件冲突;
    • Vue2:事件会被自动继承到子组件根元素,需通过inheritAttrs: false 关闭;
  5. 参数验证:内置支持 vs 手动实现

    • Vue3 :emits选项可直接校验参数;
    • Vue2:需在事件触发时手动添加参数校验逻辑;

5.简述Vue 3的插槽和Vue 2有何不同 ?

  1. 指令统一化

    • Vue 2:使用 slot 属性定义具名插槽,slot-scope 接收作用域数据;
    • Vue 3:统一使用 v-slot 指令,语法更简洁;
  2. 作用域插槽简化

    • Vue 3:作用域数据直接通过 v-slot 的参数接收,支持解构;
    • Vue 2:需通过 slot-scope 显式声明,且作用域链较长时易混淆;
  3. 模板限制

    • Vue 3:v-slot 必须写在 <template> 标签上(除默认插槽的独占缩写);
    • Vue 2:slotslot-scope 可用于任意 HTML 标签;
  4. 动态插槽名

    • Vue3:支持动态指定插槽名;
    • Vue2:需通过条件渲染间接实现;
  5. 默认插槽缩写

    • Vue3:默认插槽可省略 :default
    • Vue2:需显式声明 slot="default"
  6. 组合式API集成

    • Vue3:结合 <script setup>,插槽使用更简洁,类型推导更友好;
  7. Fragments支持

    • Vue3:子组件可返回多个根节点(<>...</>),插槽内容可分布在多个节点中;
    • Vue2:子组件必须有单个根节点,限制了插槽布局灵活性;

6.Vue3的优势?

  1. 性能优化‌
    • 编译时间减少:Vue3的模板编译器进行了优化,编译速度比Vue2快了30%;
    • 运行时性能提升:重写的虚拟DOM和响应性系统使得运行时性能更高效,减少了内存占用和CPU使用率;
    • 减少包体积:通过Tree-shaking优化,Vue3的包体积比Vue2小了50%;
  2. 组合式API‌
    • 模块化代码:通过组合式API,可以将逻辑提取到单独的函数中,从而实现更好的代码复用;
    • 更好的类型推断:组合式API对TypeScript的支持更友好,能提供更好的类型推断和代码提示;
    • 清晰的逻辑分离:相比于Vue2的Options API,组合式API使得不同功能块之间的逻辑更加清晰和分离;
  3. 树形摇树优化
    • 更小的打包体积:通过Tree-shaking,最终打包体积更小,加载速度更快;
    • 高效的代码分割:支持按需加载,减少初始加载时间,提高应用的性能;
    • 优化的模块引入:Vue3的模块化设计使得Tree-shaking更加高效,进一步减少了不必要的代码;
  4. TypeScript支持‌
    • 内置支持:Vue3核心完全用TypeScript重写,内置支持TypeScript;
    • 类型推断:组合式API和Vue3的模块化设计使得类型推断更加准确;
    • 开发体验:对TypeScript的友好支持提升了开发体验,减少了代码错误,提高了代码质量;
  5. 改进的响应性系统‌
    • Proxy机制:使用Proxy替代Vue2中的Object.defineProperty,提升了性能和灵活性;
    • 更细粒度的反应:响应性系统的改进使得组件更新更高效,减少了不必要的重新渲染;
    • 更好的调试工具:改进的响应性系统提供了更强大的调试工具,帮助开发者更容易定位和解决问题;
  6. 增强的可维护性‌
    • 模块化设计:Vue3的核心库和生态系统模块化设计,使得升级和维护更加简单;
    • 更清晰的代码结构:组合式API和单文件组件(SFC)使得代码结构更加清晰,便于维护;
    • 改进的开发工具:Vue3的开发者工具提供了更强大的功能,帮助开发者更好地管理和维护项目;

7.Vue3 的打包体积为什么更小?

  1. Tree-shaking优化‌:Tree-shaking是一种通过静态分析模块依赖关系,去除未使用的代码的技术。Vue3通过模块化设计,允许构建工具如Webpack和Rollup更好地进行Tree-shaking,从而减少打包后的代码体积‌;
  2. Composition API‌:Vue3引入了Composition API,这种新的组件定义方式允许开发者以更灵活和简洁的方式组织代码。通过按需加载模块和复用代码片段,减少了不必要的代码加载,进一步优化了代码结构‌;
  3. 现代构建工具的使用‌:Vu 3充分利用了现代构建工具和技术,如Webpack、Rollup和Vite。这些工具支持高级优化技术,如代码拆分、压缩和混淆,自动压缩和混淆代码,减少文件大小‌;
  4. 更小的核心库‌:Vue3的核心库进行了精简和优化,移除了一些不常用的功能,并将其作为独立的插件提供。这种设计使得Vue3的核心库在功能强大的同时也保持了较小的体积‌;
  5. 改进的响应式系统‌:Vue3采用了基于Proxy的响应式系统,相比Vue2的defineProperties,Proxy仅对所使用的属性进行监听,减少了无谓的开销,提高了打包效率‌;
  6. 优化的组件渲染‌:Vue3在渲染过程中进行了大量优化,包括对模板中的静态节点进行编译优化、diff算法的优化等,进一步减少了最终打包的大小‌;
  7. 代码压缩和混淆‌:打包工具会对代码进行压缩和混淆处理,删除空白字符、注释和缩短变量名,同时通过混淆代码使代码难以阅读,但不影响功能,从而减少文件大小‌;

8.Vue3的设计目标是什么?

  1. 更小、更轻量:Vue3通过移除一些不常用的API和引入tree-shaking 技术,实现了更小的打包体积。这意味着开发者可以只包含应用中实际使用的代码,从而减少了不必要的代码加载,提高了应用的加载速度和性能;
  2. 更快、更高效:Vue3在性能上进行了多项优化。例如,优化了diff算法,使其在处理虚拟DOM更新时更加高效;引入了静态提升技术,将静态节点在编译时提升到更高的作用域,减少了运行时的计算;同时,事件监听也进行了缓存优化,减少了不必要的监听器注册和注销。此外,Vue3还对服务器端渲染(SSR)进行了改进,提升了渲染速度和整体性能;
  3. 更友好、更易用:Vue3引入了 Composition API,这一新特性提供了更灵活的逻辑复用和组织方式。开发者可以更加自由地组合和重用代码逻辑,而不再受限于传统的选项式 API。此外,Vue3提供了对TypeScript 的原生支持,使得类型检查和代码补全等开发体验得到了显著提升;
  4. 增强可维护性:Vue3通过重构和采用现代 JavaScript 特性(如 Proxy 和 Reflect),提高了框架内部的可维护性和可扩展性。这使得Vue框架本身更加健壮、易于理解和维护;
  5. 促进生态系统的成长:Vue3设计了新的 API 和工具,使得库和工具的作者更容易为 Vue3提供或更新他们的产品。这有助于构建一个更加繁荣、活跃的 Vue 生态系统,为开发者提供更多选择和更好的支持;

9.Vue3的项目结构有哪些调整?

  1. Composition API:Vue3引入了Composition API,这是对Vue2的Options API的一个补充和改进。Composition API允许开发者以更灵活的方式组织和复用代码,特别是在处理大型组件时;
  2. 单文件组件(SFC)的改进:Vue3对单文件组件(SFC)提供了更好的支持,特别是通过<script setup>标签,它提供了一种编写单文件组件的新方式;
  3. 项目目录结构的优化:Vue3项目通常建议在项目目录结构上进行一些优化,比如将组件、页面、服务等逻辑分离到不同的文件夹中;
  4. 全局状态管理工具:Vue3通常与状态管理库(如Vuex)结合使用,但Vue3本身也提供了全局状态管理的内置支持(如Provide/Inject);

10.Vue3 模板语法有哪些改进?

  1. 指令优先级调整
    • 在Vue2中,v-for指令的优先级高于v-if指令。但在Vue3中,这一优先级得到了调整,v-if指令的优先级现在高于v-for指令。这一改变有助于开发者更好地控制渲染逻辑,避免不必要的性能开销;
  2. 组合式API(Composition API)的引入
    • Vue3引入了Composition API,这是一种基于函数的API风格,允许开发者以更灵活的方式组织和复用代码。与Vue2中的Options API相比,Composition API提供了更好的逻辑分离和复用性,特别是在处理复杂应用时,能够显著提升代码的可维护性;
  3. 静态节点优化
    • 在Vue3中,编译器会对静态节点进行标记,在更新时可以直接跳过这些静态节点。这一优化减少了DOM操作,进一步提高了渲染性能;
  4. 异步删除操作优化
    • 对于动态删除操作,Vue3采用了异步队列的方式进行,能够将多个删除操作合并为一个,从而减少DOM操作,提升性能;
  5. Fragments优化
    • 在Vue2中,Fragments(片段)会引入额外的虚拟DOM层级,导致Diff算法需要进行更多的比较操作。而在Vue3中,对Fragments进行了优化,可以直接将其内部的内容合并到父级中,减少了虚拟DOM层级,提高了Diff算法的效率;
  6. 性能提升的其他方面
    • Vue3还对底层的响应式系统进行了重写,使用了Proxy代理对象而非Vue2中的Object.defineProperty,这带来了更好的性能和更低的内存消耗;
    • Vue3引入了Patch flag的概念,用于标记组件在更新过程中的一些特殊情况,如组件的props发生变化或只需要强制更新等。这有助于在Diff算法中更快速地定位需要更新的组件,减少了比较的工作量;
  7. 模板语法的其他改进
    • Vue3保留了Vue2中广泛使用的模板语法,如v-text、{{ }}插值表达式、v-html等,并进行了进一步的优化和完善;
    • Vue3还支持v-model指令的双向数据绑定,以及事件绑定指令和列表渲染指令等,为开发者提供了丰富的模板语法选择;

11.Vue3中的组件生命周期钩子有哪些变化?

  1. 移除的钩子
    • beforeDestroy 和 destroyed 被替换为 beforeUnmount 和 unmounted;
    • activated 和 deactivated(用于 )现在分别更名为 onActivate 和 onDeactivate;
  2. 新增的钩子
    • onBeforeMount:在组件的挂载开始之前调用;
    • onMounted:在组件的挂载完成后调用;
    • onBeforeUpdate:在组件的更新之前调用;
    • onUpdated:在组件的更新完成后调用;
    • onBeforeUnmount:在组件卸载之前调用;
    • onUnmounted:在组件卸载完成后调用;
    • onErrorCaptured:当捕获一个来自子孙组件的错误时调用;
    • onRenderTracked 和 onRenderTriggered:这两个钩子用于调试,它们可以帮助你跟踪组件渲染过程中依赖项的变化;
  3. 使用方法的变化
    • 在 Vue3 中,生命周期钩子不再是通过字符串形式在选项中定义的,而是作为 Composition API 的一部分使用;
  4. Composition API 的集成
    • Vue3 的 Composition API 允许你将组件的逻辑代码更加模块化和可重用,通过使用这些生命周期钩子,你可以更容易地组织和维护复杂的组件逻辑;

12.请解释Vue3中的响应式系统的工作原理?

Vue3 中的响应式系统通过 ES6 的 Proxy 对象和 Reactive API 实现高效的数据观察和更新机制;
工作原理

  1. Proxy 对象:Vue3 使用 Proxy 对象拦截对数据对象的操作,包括属性读取、赋值和删除。当一个组件被创建时,Vue 为其 data 对象创建一个响应式代理对象。这个代理对象可以监听到数据的变化,并在数据变化时更新视图;
  2. Reactive API:通过调用 reactive 函数,可以将普通的 JavaScript 对象转换为响应式对象。当对象发生变化时,Vue 能够检测到并更新相应的视图。此外,Vue3 还提供了 readonly 和 ref 函数来创建只读和包装过的响应式对象;
  3. 依赖收集与追踪:当某个响应式属性被访问时,Vue 会记录哪个组件或函数依赖了该属性。当属性值变化时,所有依赖该属性的函数会被通知重新执行。依赖收集通过 Effect 函数实现;
  4. track 和 trigger:在 get 拦截器中调用 track 记录依赖,在 set 拦截器中调用 trigger 通知依赖更新;

13.Vue3中的虚拟DOM优化了哪些方面?

  1. 静态提升
    • 原理:Vue3 编译器会分析模板,识别出静态节点,也就是那些内容不会随数据变化而改变的节点。编译器会将这些静态节点提升到渲染函数外部,在首次渲染时创建它们,之后的渲染过程中直接复用这些节点,而不是每次都重新创建;
    • 效果:这样做大大减少了不必要的节点创建操作,降低了内存占用和 CPU 计算量,尤其在大型项目或者包含大量静态内容的页面中,性能提升效果显著;
  2. 补丁标志
    • 原理:为每个虚拟DOM 节点添加特定的补丁标志,这些标志用于标记节点的哪些部分是动态的。在进行 Diff 算法比较新旧虚拟DOM时,Vue3 可以根据这些标志,只对有动态变化的部分进行详细比较,而忽略静态部分;
    • 效果:极大地减少了Diff 过程中的计算量,提高了比较的速度,从而加快了虚拟DOM的更新效率;
  3. 静态属性缓存
    • 原理:对于静态属性,Vue3会将其缓存起来。在后续的渲染过程中,不会重新计算和比较这些静态属性,避免了重复工作;
    • 效果:减少了额外的性能开销,让渲染过程更加高效;
  4. 基于 Proxy 的响应式系统优化
    • 原理:Vue3使用Proxy对象来实现响应式系统,相较于Vue2 中的 Object.defineProperty(),Proxy可以劫持整个对象的属性访问和修改操作,能够更精准地感知数据的变化;
    • 效果:当数据发生变化时,虚拟DOM可以更高效地接收到通知并进行更新,避免了Vue2中一些不必要的渲染,提高了整体性能;
  5. 片段支持
    • 原理:在 Vue3 中,组件可以返回多个根节点,形成片段。而在 Vue2中,组件必须有一个单一的根节点,这有时会导致需要添加额外的包装元素;
    • 效果:减少了不必要的包装元素,使虚拟DOM结构更加简洁,降低了虚拟DOM的复杂度,同时也让模板代码更加符合语义化,提升了开发的灵活性和代码的可读性;

14.简述Composition API如何实现代码逻辑的复用(hook) ?

  1. 定义hook
    • 创建一个JavaScript文件或直接在组件文件中定义一个以“use”为前缀命名的函数(例如useForm、useFetchData等);
    • 在hook函数内部,使用Vue的响应式API(如ref、reactive、computed等)来定义和管理状态;
    • 封装业务逻辑,如数据获取、表单处理、事件监听等,并返回需要暴露给组件的状态和方法;
  2. 调用hook
    • 在组件的setup函数中,调用之前定义的hook函数;
    • 将hook返回的状态和方法解构并赋值给组件的局部变量,以便在模板中使用;
  3. 复用逻辑
    • 在不同的组件中,通过调用相同的hook函数来复用封装好的逻辑;
    • 这使得多个组件可以共享相同的业务逻辑,而无需重复编写代码;

15.简述setup()函数在Vue3中起什么作用 ?

  1. 定义响应式状态:在 setup() 函数中,可以使用 Vue 提供的响应式 API(如 ref 和 reactive)来定义响应式状态。ref 用于创建单个值的响应式引用,reactive 用于创建对象的响应式引用;
  2. 使用计算属性:可以在 setup() 函数中定义计算属性,使用 computed 函数来实现;
  3. 声明方法:可以在 setup() 函数中定义方法,作为普通的 JavaScript 函数来声明,并在返回对象中公开这些方法;
  4. 使用生命周期钩子:在 setup() 函数中,可以使用 Vue 提供的生命周期钩子函数来处理组件生命周期事件;
  5. 使用依赖注入和提供:在 setup() 函数中,可以使用 provide 和 inject API 来实现依赖注入;
  6. 组合逻辑:通过 setup() 函数,可以将逻辑组织成可复用的函数,这些函数可以在多个组件中共享;

16.简述setup 方法和 setup 语法糖的区别 ?

  1. 语法结构层面

    • setup方法:它是Vue3组合式 API 标准的书写方式。在组件对象中要显式定义setup函数,函数接收props和context作为参数,并且要手动返回一个对象,对象里包含需要在模板中使用的数据和方法;
    • setup语法糖:是 Vue3.2引入的语法糖。使用 <script setup> 标签包裹代码,无需显式定义setup函数,在这个标签内定义的变量和函数可以直接在模板中使用,无需手动返回;
  2. API 使用方面

    • setup方法:使用 ref、reactive、defineProps 等API时,必须手动从vue中导入;
    • setup语法糖:部分常用的API会自动注入,无需手动导入,像 ref、computed 等。不过,如果要使用一些高级API或者自定义的组合式函数,还是需要手动导入;
  3. 类型支持角度

    • setup方法:在结合TypeScript使用时,需要额外做一些配置来实现类型检查和推导。例如,使用defineProps定义props时,要明确指定类型;
    • setup语法糖:对TypeScript有更好的原生支持,类型推导更加自然和简洁。在定义props 和emits时,可以直接使用类型注解;
  4. 适用场景差异

    • setup方法:适用于处理复杂的组件逻辑,当需要对组件的初始化过程进行细粒度控制,或者要和Vue2 的选项式API混合开发时,使用setup方法比较合适;
    • setup语法糖:适合大多数日常开发场景,尤其是简单组件的开发。它能减少样板代码,提高开发效率,让开发者更专注于业务逻辑;

17.如何理解reactive、ref 、toRef 和 toRefs?

reactive

  • 定义:reactive是Vue3中用于创建响应式对象或数组的方法;
  • 作用:通过reactive创建的响应式对象或数组,其内部的所有属性都会成为响应式的。当这些属性发生变化时,依赖于它们的组件或计算属性会自动更新;
  • 使用场景:reactive更适合用于复杂的数据结构,如包含多个属性的对象或数组;

ref

  • 定义:ref是Vue3中用于创建响应式引用的方法;
  • 作用:ref可以将一个普通的值(如字符串、数字、布尔值、对象、数组等)变成响应式的。当这个值发生变化时,依赖于它的组件或计算属性会自动更新;
  • 使用场景:ref更适合用于基本数据类型和需要单独响应的复杂数据类型(如对象或数组);

toRef

  • 定义:toRef是Vue3中的一个工具函数,用于将响应式对象的一个属性转换为一个独立的ref对象;
  • 作用:toRef可以保持原始属性与转换后的ref对象之间的响应式连接。修改ref对象的值会更新原始属性,反之亦然;
  • 使用场景:当需要将响应式对象的某个属性单独提取出来,同时保持其响应性时,可以使用toRef;

toRefs

  • 定义:toRefs是Vue3中的另一个工具函数,用于将一个响应式对象转换为一个普通对象,其中每个属性都是一个ref对象;
  • 作用:toRefs可以保持解构后的响应式对象的属性仍然具有响应性;
  • 使用场景:当需要解构响应式对象,并且希望解构后的属性仍然是响应式的时,可以使用toRefs;

18.Vue3 中 computed 属性的缓存机制是如何实现的?

在Vue3中,computed属性的缓存机制是通过依赖追踪、脏值标志以及重新计算来实现的。当定义一个computed属性时,Vue会追踪其依赖的响应式数据。如果依赖的数据没有发生变化,再次访问computed属性时会直接返回缓存的值,避免不必要的计算。当依赖的数据发生变化时,会触发computed属性的重新计算,并更新缓存。这种机制通过依赖追踪和脏值管理,有效地提高了应用的性能;

19.简述Vue 3中的watch和watchEffect有何不同?

区别

  1. 触发时机不同
    • watch:是惰性执行的。也就是说,它不会在组件创建时立即执行回调函数,只有当所监听的数据源发生变化时,才会触发回调;
    • watchEffect:会立即执行一次回调函数,并且在回调函数执行过程中自动追踪所依赖的响应式数据。之后,只要这些依赖数据发生变化,就会再次执行回调函数;
  2. 依赖指定方式不同
    • watch:需要明确指定要监听的数据源。可以是单个响应式数据(如 ref 或 reactive 对象)、多个响应式数据,也可以是一个 getter 函数;
    • watchEffect:不需要手动指定依赖,它会自动追踪回调函数中使用的所有响应式数据;
  3. 回调参数不同
    • watch:回调函数可以接收新值和旧值作为参数,方便开发者对比数据的变化情况;
    • watchEffect:回调函数没有提供新值和旧值的参数,它更侧重于执行副作用操作,比如更新DOM、发送网络请求等;

使用场景

  • watch:适用于需要根据特定数据变化执行操作的场景。由于它可以访问新旧值,因此适合进行更复杂的操作,如深度监听、监听多个数据源等;
  • watchEffect:适用于简单的、与UI强相关的场景,或者不需要访问之前数据的场景。它更加简洁高效,因为自动收集依赖并立即执行,无需手动指定监听的数据;

20.Vue3 中如何使用 provide 和 inject 实现依赖注入?它们的作用是什么?

使用方法

  1. provide的使用
    • provide函数用于在父组件或祖先组件中提供数据或方法;
    • 它通常在父组件的setup函数中使用,接受两个参数:key和value;
      • key:注入名,可以是一个字符串或是一个Symbol,用于后代组件查找期望注入的值;
      • value:提供的值,可以是任意类型,包括响应式的状态;
  2. inject的使用
    • inject函数用于在后代组件中注入由父组件或祖先组件提供的数据或方法;
    • 它也接受两个参数:key和defaultValue(可选);
      • key:父组件提供值的key,必须与provide时使用的key相匹配;
      • defaultValue:当没有提供该依赖时使用的默认值,可以是具体的值,也可以是函数;

作用

  1. 跨层级传递数据:provide和inject允许我们在组件树中跨层级地传递数据,而无需通过props逐层传递。这使得在深层嵌套的组件中访问顶层组件的数据变得更加简单和高效;
  2. 实现组件间的解耦:通过依赖注入,我们可以实现组件间的解耦。提供数据的组件和使用数据的组件之间不需要直接引用对方,从而降低了组件之间的耦合度,提高了代码的可维护性和复用性;
  3. 响应式数据传递:provide和inject传递的数据可以是响应式的。当提供的数据发生变化时,所有依赖该数据的组件都会自动更新。这使得在多个组件之间共享响应式数据变得更加容易和高效;

21.Vue3中的Fragment是什么?它的用途是什么?

定义
Fragment 是Vue3引入的虚拟节点,用于包裹多个子元素但不会渲染为真实DOM。它允许模板中存在多个根节点,解决了Vue2 必须有一个根元素的限制;

用途

  1. 简化页面结构:使用Fragment,开发者可以在不添加额外元素的情况下,将多个组件或元素包裹在一个逻辑容器中。这减少了不必要的DOM元素嵌套和深度,使得页面结构更加简洁;
  2. 提高语义化:Fragment允许组件直接返回多个所需元素,而无需额外的包裹元素,这避免了在某些情况下因包裹元素而破坏HTML结构的语义化,从而使页面结构更加符合语义化标准;
  3. 优化性能:通过减少DOM层级,Fragment特性有助于提升页面的渲染性能。避免不必要的DOM元素嵌套可以减少渲染和计算的工作量,从而提高页面的响应速度;

22.什么是Tree-shaking?它在Vue 3中如何工作?

定义
‌Tree-shaking‌是一种通过静态代码分析去除未使用代码的技术,旨在减小项目体积,提高应用性能。在‌Vue3‌中,Tree-shaking通过其模块化架构和ES模块(ESM)的支持,实现了更高效的代码优化;

基本原理
Tree-shaking依赖于ES6模块的静态结构特性。ES6模块使用静态导入和导出语法,这使得编译器可以在编译阶段确定模块之间的依赖关系以及输入和输出的变量。通过静态分析构建依赖图,然后移除未使用的代码,从而达到减小打包体积的目的‌;

工作步骤
‌1. 模块分析‌:在编译阶段,Vue3会分析代码中引入的模块,确定哪些模块被实际使用,哪些模块未被使用。这是通过静态分析代码中的导入语句(import)来实现的;
2‌. 依赖关系构建‌:根据模块之间的引用关系,构建一个模块依赖图。这个依赖图描述了模块之间的依赖关系,以及哪些模块是被其他模块所依赖的;
3‌. 未使用模块标记‌:通过遍历模块依赖图,Vue3可以标记出哪些模块未被使用。这些未使用的模块将被视为可以被摇掉的“死代码”;
‌4. 代码优化和删除‌:在打包过程中,未使用的模块代码将被优化和删除,从而减小最终打包生成的文件体积。这可以通过删除未使用的模块代码、函数或变量来实现;
‌5. 副作用处理‌:在摇树过程中,需要处理一些可能产生副作用的代码。例如,某些模块可能在导入时执行一些初始化操作或注册全局变量。Vue3会通过一些机制来识别和处理这些副作用,以确保摇树过程的正确性;

23.Vue3中的Teleport是什么?它的用途是什么?

定义
Teleport是Vue3引入的一个新特性,它允许我们将组件模板中的一部分内容渲染到DOM树中的其他位置,而不改变组件的逻辑结构;

工作原理
Teleport组件通过其to属性指定目标容器,该属性接受一个选择器字符串或DOM元素作为值。当Teleport组件被渲染时,其内容会被“传送”到指定的目标容器中,而逻辑结构和事件处理仍然保留在原始组件中。这意味着,尽管DOM位置发生了变化,但组件的状态、方法和其他逻辑仍然属于父组件管理;

用途

  1. 减少 DOM 层级干扰‌ :将如模态框、全局通知等需‌脱离父组件层级‌的内容渲染到顶层容器(如 body),避免父组件样式(如 overflow: hidden)导致显示异常‌;‌
  2. 逻辑与样式解耦‌ :组件代码仍保留在原位置维护逻辑(如数据、交互),仅渲染结果被传送到目标位置,提升代码可维护性‌;
  3. 支持动态渲染位置‌ :通过动态绑定to属性,可灵活切换渲染目标,适应不同场景需求(如多主题布局切换);
  4. 解决 z-index 冲突‌ :将悬浮组件(如 Tooltip、Dropdown)传送到独立层级,避免因父组件z-index限制导致覆盖问题‌;

24.Vue3中的Suspense是什么?如何使用它来处理异步组件?

定义
Suspense是Vue3提供的一个内置组件,用于处理异步依赖的加载状态。它可以在异步组件加载过程中显示一个过渡内容,加载完成后显示实际组件;

处理步骤

  1. 定义异步组件‌ :使用defineAsyncComponent函数来定义一个异步组件。这个函数接受一个返回Promise的加载函数,Promise 解析后会返回一个组件定义;

  2. 使用 Suspense 包裹异步组件‌
    在模板中,使用 组件来包裹异步组件,并指定加载中和加载失败时的回退内容;

25.Vue3 中 defineAsyncComponent 函数的参数和使用场景是什么?

defineAsyncComponent是Vue3中用于定义异步组件的一个函数。它允许开发者按需加载组件,即在组件实际被使用时才进行加载,这有助于减少应用的初始加载时间,提升用户体验;
核心使用场景‌:

  1. 首屏性能优化‌: 拆分非关键组件代码(如弹窗、复杂表单),减少首屏加载体积‌;
  2. 动态按需加载‌:按需加载用户触发的功能模块(如弹窗、子页面)‌;
  3. 第三方库懒加载‌:减少初始加载时间,仅在使用时加载重量级库(如富文本编辑器)‌;
  4. 代码分割:结合构建工具生成独立代码块,优化缓存利用率‌;

参数形式

  1. 工厂函数‌:直接传入动态import()实现懒加载‌;
  2. 配置对象‌:扩展加载状态、错误处理、超时等逻辑‌;

26.为什么Vue3选择Proxy替代Object.defineProperty?

  1. 支持数组的直接监控
    • Object.defineProperty:无法直接监听数组的变化(如 push、pop 等方法),需要通过包裹数组方法来间接实现;
    • Proxy:可以直接拦截对数组的操作,包括增删元素等操作,无需额外处理;
  2. 动态属性的支持
    • Object.defineProperty:只能在对象创建时定义响应式属性,后续添加或删除属性不会自动变为响应式;
    • Proxy:可以拦截对象属性的添加和删除操作,使新添加的属性自动成为响应式的,而不需要手动处理;
  3. 性能优化
    • Object.defineProperty:每次访问或修改属性时都会触发getter和setter,这在处理大型对象时会导致性能问题;
    • Proxy:通过拦截器机制,只有在实际发生属性访问或修改时才会触发相应的逻辑,减少了不必要的开销;
  4. 更丰富的拦截操作
    • Object.defineProperty:仅限于属性的读取和设置操作。
    • Proxy:提供了更多的拦截操作,如get、set、apply、construct等,能够更细粒度地控制对象的行为;
  5. 更好的兼容性和扩展性
    • Object.defineProperty:存在浏览器兼容性问题,并且某些情况下无法覆盖所有场景(如不可枚举属性);
    • Proxy:是ES6标准的一部分,具有更好的跨浏览器兼容性,并且可以通过自定义拦截器实现更多功能;
  6. 简化框架内部实现
    • Object.defineProperty:由于其局限性,框架内部需要额外的逻辑来处理各种特殊情况;
    • Proxy:简化了框架内部的实现,使得代码更加简洁和易于维护;

27.简述Vue3如何处理组件的异步加载 ?

  1. 使用 defineAsyncComponent:defineAsyncComponent是Vue3专门用于定义异步组件的函数。它接收一个返回Promise的加载函数,该Promise会在组件加载完成后resolve。当组件需要被渲染时,Vue会调用这个加载函数来加载组件;
  2. 使用Suspense 组件:Suspense是Vue3新增的一个组件,它可以和异步组件配合使用,用于管理异步组件的加载状态。Suspense组件有两个插槽:#default 用于放置异步组件,#fallback 用于放置在异步组件加载过程中显示的过渡内容;
  3. 路由懒加载:在Vue Router中,我们可以通过动态import来实现路由组件的异步加载。这种方式可以将不同路由的组件分割成不同的代码块,只有在用户访问相应路由时才会加载对应的组件代码,从而减少初始加载的代码量;

28.请描述一下Vue3中的虚拟DOM(Virtual DOM)和Diff算法的工作原理?

虚拟DOM

  • 定义
    虚拟DOM是一种用JavaScript对象来表示真实DOM结构的技术。它并不是真实的DOM,而是一个轻量级的、对真实DOM的抽 象表示;
  • 工作原理
    • 当Vue组件的状态发生变化时,Vue会重新渲染组件,生成新的虚拟DOM树;
    • Vue会比较新旧两个虚拟DOM树的差异,这个过程称为“diff”;
    • 根据diff的结果,Vue会计算出需要更新的真实DOM部分,并仅对这些部分进行更新,而不是重新渲染整个页面;
  • 优势
    • 虚拟DOM将UI的状态与DOM的操作解耦,避免了频繁的真实DOM操作,从而提升了性能;
    • 它允许开发者以声明式的方式编写代码,提高了代码的可读性和可维护性;

Diff算法

  • 定义
    • Diff算法是一种用于比较两个树形结构并找出它们之间差异的算法。在Vue3中,它用于比较新旧两个虚拟DOM树;
  • 工作原理
    • Diff算法的核心逻辑位于Vue的patch函数中。该函数会递归地比较新旧节点的类型、属性和子节点;
    • 如果节点类型相同,则进一步比较属性和子节点;如果类型不同,则直接替换节点;
    • 对于子节点的比较,Vue3采用了双端比较策略,即同时从新旧子节点的两端开始比较,以快速跳过相同部分;
    • 如果子节点中有key属性,Vue会使用哈希表来加速查找和匹配过程;
  • 优化策略
    • Vue3在编译阶段会标记静态节点,这些节点在渲染过程中不会被重新创建或比较,从而提高了性能;
    • Vue3还引入了批量更新策略,将多次状态变更合并为一次DOM操作,减少了不必要的重排和重绘;
  • 优势
    • Diff算法通过高效地比较新旧虚拟DOM树并仅更新变化的部分,减少了不必要的DOM操作,提升了性能;
    • 它使得Vue能够快速地响应状态变化并更新UI,提高了用户体验;

29.请解释一下Vue3中的全局API和实例API的区别?

全局API

  • 定义‌:全局API是定义在Vue构造函数或全局对象上的方法,它们可以在不依赖于Vue实例的情况下直接使用;
  • 作用‌:全局API主要用于配置Vue应用的全局行为,如创建Vue应用实例、注册全局组件、全局指令、全局过滤器以及设置全局配置选项等。这些API在整个Vue应用中都是可用的,并且影响所有的Vue实例;

实例API

  • 定义‌:实例API是挂载在Vue实例上的方法或属性,它们只能在Vue实例的上下文中访问和使用;
  • 作用‌:实例API主要用于管理和操作Vue实例的状态、属性、方法以及生命周期钩子等。这些API是Vue实例的核心部分,它们允许开发者在Vue实例的生命周期内进行各种操作,如数据绑定、事件处理、条件渲染等;

区别‌

  • 作用域不同‌:全局API的作用域是整个Vue应用,而实例API的作用域是单个Vue实例。这意味着全局API可以在任何地方调用,而实例API只能在特定的Vue实例中调用;
  • 功能不同‌:全局API主要负责Vue应用的全局配置和实例创建,而实例API则负责Vue实例的状态管理和行为控制。全局API提供了对Vue应用的全局设置和配置,而实例API则提供了对Vue实例的详细控制和操作;
  • 使用时机不同‌:全局API通常在应用初始化阶段使用,用于配置全局行为和创建Vue应用实例。而实例API则在Vue实例创建后使用,用于管理和操作Vue实例的状态和行为;

30.请解释一下Vue3中的静态提升(Static Tree Hoisting)和Patch Flag的优化策略?

静态提升

  • 定义:静态提升是Vue3编译器的一项重要优化策略。它的核心思想是将模板中不变的部分(静态节点)提升到渲染函数的外部,使它们只创建一次,避免每次重新渲染时都重复创建静态内容;
  • 工作原理
    • 在编译过程中,Vue3会分析模板中的静态内容,并将其提升为一个单独的静态节点;
    • 这些静态节点在渲染函数外部被创建,并在每次渲染时复用,避免了重复创建和销毁静态内容所带来的开销;
  • 优势
    • 静态提升可以显著提升渲染性能,特别是对于包含大量静态内容的页面;
    • 它减少了运行时动态开销,使得Vue3在处理大型或复杂的应用时更加高效;

Patch Flag优化策略

  • 定义:Patch Flag是Vue3为了优化虚拟DOM diff的一种机制。通过对每个动态节点进行标记,Vue可以精准地知道哪些节点是需要进行更新的,从而避免不必要的DOM操作;
  • 工作原理
    • 在编译阶段,Vue3会为动态节点打上Patch Flag,这些标记指示了节点的属性和状态变化;
    • 在渲染过程中,Vue会根据这些标记来快速判断哪些节点需要更新,哪些节点可以跳过;
    • 通过精准更新,Vue3减少了无用的虚拟DOM对比,提升了整体性能;
  • 优化细节
    • Vue3的Patch Flag系统支持多种标记类型,如静态节点、动态节点、有状态组件等,这些标记类型对应不同的处理逻辑;
    • Vue3还引入了Block Tree等优化技术,进一步减少了不必要的更新范围,提高了渲染效率;
  • 优势
    • Patch Flag优化策略使得Vue3能够更高效地处理视图更新,特别是在处理频繁状态变化的应用时;
    • 它减少了不必要的DOM操作,降低diff算法的复杂度,从而提升了性能;

31.简述Vue3跨域配置devServer参数的方法是什么 ?

  1. 在 vue.config.js 中配置 devServer.proxy,定义代理路径(如 /api)和目标服务器地址;
  2. 启用 changeOrigin 修改请求头,确保跨域请求被后端接受;
  3. 使用 pathRewrite 按需重写请求路径(如删除代理前缀)‌;

32.Vue3 为什么不需要时间分片?

  1. 虚拟DOM的高效优化‌
    ‌ - 智能差异算法‌:Vue3的虚拟DOM采用更高效的Diff算法,仅对比并更新实际变化的节点,减少不必要的计算‌;
    ‌ - 批量更新机制‌:通过异步队列合并多次数据变更,统一触发渲染,降低DOM操作频率‌;
    ‌ - ‌性能瓶颈场景少‌:对于常规应用场景(非连续超100ms的CPU密集型计算),Vue3的虚拟DOM足以保证流畅性‌;
  2. 响应式系统的升级‌
    ‌ - ‌Proxy 替代 defineProperty‌:Vue3的响应式系统基于 Proxy,支持深层嵌套对象和数组的自动监听,减少手动优化需求‌;
    ‌ - ‌精准依赖追踪‌:仅更新依赖变化的组件,而非全量渲染,降低渲染压力‌;
  3. 复杂度与收益的权衡‌
    ‌ - ‌实现成本高‌:时间分片需要复杂的调度逻辑,与Vue3简洁的设计理念冲突‌;
    ‌‌ - 边际收益低‌:Vue3的默认性能已足够应对大部分场景,引入时间分片提升有限‌;
  4. 异步渲染与浏览器协作‌
    ‌‌ - 利用事件循环空闲时间‌:Vue3的异步渲染策略将更新任务拆解到浏览器空闲时段,避免主线程阻塞‌;

33如何解决 Vue3 中响应式丢失的问题?

  1. 解构赋值导致响应式丢失‌
    • 原因‌:直接解构 reactive对象或ref的 .value会提取原始值,脱离代理链‌;
    • 解决‌:
      • 使用toRefs或toRef包裹解构属性,维持响应式引用‌;
      • 优先通过原对象访问属性(如 state.a),避免解构‌;
  2. 对象整体替换破坏响应式‌
    • 原因‌:直接替换reactive或ref的引用,导致代理失效‌;
    • 解决‌:
      • 修改对象属性而非整体替换;
      • 使用 ref 包裹对象,通过 .value 更新;
  3. 异步更新未正确使用响应式 API‌
    • 原因‌:异步操作中直接赋值新数据,未通过代理触发更新‌;
    • 解决‌:
      • 使用ref或合并属性更新;
  4. Props 解构或修改导致响应式断裂‌
    • 原因‌:解构props或直接修改非引用类型属性,脱离父级响应式链‌;
    • 解决‌:
      • 使用 toRefs(props) 或 toRef(props, ‘key’) 保持响应性‌;
      • 通过emit通知父组件修改数据,避免直接操作props‌;

34.Vue3中的工程化工具Vite是什么?它有什么优势?

定义‌:Vite是一个由尤雨溪开发的面向现代前端开发的构建工具,专门为 Vue3项目设计,但也能很好地支持其他框架,如 React、Svelte等。它旨在提供更快的开发体验,让开发者能够更高效地进行项目开发;
原理
Vite基于原生ES模块(ES Modules)实现,在开发环境下无需打包,直接利用浏览器的原生模块加载功能,按需加载各个模块。在生产环境中,Vite则使用Rollup进行打包,将代码进行优化和压缩;
核心优势‌

  1. 极速冷启动‌:跳过传统打包工具的预编译阶段,直接启动开发服务器,启动时间几乎与项目规模无关‌;
  2. 高效热更新:仅编译修改的模块,浏览器直接加载更新后的代码,响应速度达到毫秒级‌;
  3. 按需编译‌:基于浏览器原生ESM,动态加载所需模块,减少不必要的资源加载‌;
  4. 轻量插件系统‌:集成Rollup插件生态,同时提供专属插件API,扩展性强‌;
  5. 生产优化‌:默认支持代码分割、Tree-Shaking等优化策略,输出高效生产代码‌;
  6. 兼容现代浏览器‌:默认支持现代浏览器特性(如 ES6+),减少兼容性代码冗余‌;

与传统打包工具对比

  • Webpack:Webpack是一个功能强大的打包工具,它可以处理各种复杂的项目需求,但配置相对复杂,启动和热更新速度较慢。而Vite配置简单,启动和热更新速度快,更适合快速开发和小型项目;
  • Rollup:Rollup是一个专注于JavaScript模块打包的工具,它的打包性能较好,但在开发环境下的体验不如Vite。Vite在开发环境下无需打包,提供了更流畅的开发体验;

适用场景‌

  • 快速原型开发:由于Vite的快速启动和热更新特性,非常适合快速搭建项目原型,让开发者可以快速验证想法;
  • 小型项目:对于小型项目,Vite的简单配置和高效性能可以帮助开发者更轻松地完成项目开发;
  • 现代前端框架项目:Vite对Vue3、React 等现代前端框架有很好的支持,能够充分发挥这些框架的优势;

35.谈谈Pinia?

定义
Pinia是Vue.js官方推荐的状态管理库,专为Vue3设计,同时也兼容Vue2。它旨在提供一种更简洁、灵活且可扩展的方式来管理应用程序的状态;
核心优势

  1. 轻量级:Pinia的设计非常轻量,减少了不必要的复杂性,易于上手和使用;
  2. 类型支持:Pinia提供了良好的TypeScript支持,能够更好地与TypeScript项目集成,提升开发体验;
  3. 模块化:Pinia支持模块化的状态管理,可以将状态分割成多个store,便于管理和维护;
  4. 响应式:Pinia使用Vue3的响应式系统,确保状态变化能够自动更新到视图中;
  5. 简洁的 API:Pinia的API设计简洁明了,易于理解和使用,减少了学习成本;
  6. 插件支持:Pinia支持插件,可以扩展其功能,满足特定需求;
  7. 开发者工具:Pinia提供了与Vue Devtools的集成,方便开发者调试和查看状态变化;
  8. 支持 SSR:Pinia可以与服务器端渲染(SSR)一起使用,适合构建现代化的应用;

Pinia 与 Vuex 核心对比‌

  1. API 设计‌
    • Vuex‌:强制分离mutations(同步)与 actions(异步),需通过commit提交变更‌;
    • Pinia‌:合并mutations至actions,允许直接修改state,简化流程(如 this.count++)‌;
  2. 模块化方式‌
    • ‌Vuex‌:需嵌套modules,易导致代码臃肿‌;
    • ‌Pinia‌:独立Store定义,天然扁平化,支持组合式逻辑复用‌;
  3. TS 支持‌
    • ‌Vuex‌:需额外配置类型声明,支持较弱‌;
    • ‌Pinia‌:原生类型推导,defineStore自动生成类型‌;
  4. 响应式系统‌
    • Vuex‌:基于Vue2 的 Object.defineProperty‌;
    • ‌Pinia‌:基于Vue3的 Proxy,支持深层嵌套对象监听‌;
  5. 体积与性能‌
    • Vuex‌:约10KB,适合中大型项目‌;
    • ‌Pinia‌:仅1KB,轻量高效‌;
  6. 适用场景‌
    • ‌Vuex‌:适合需要严格数据流管控的遗留项目‌;
    • ‌Pinia‌:推荐用于Vue3新项目,灵活性高、开发效率快‌;

相关文章:

【前端面试题】Vu3常见的面试题

1.Vue3与 Vue2的核心区别有哪些&#xff1f; ‌ 响应式系统 ‌&#xff1a; ‌ Vue2&#xff1a;通过Object.defineProperty 实现响应式。这种方式在处理对象属性的添加和删除时存在局限性&#xff0c;且无法直接监控数组的变化 ‌;‌Vue3&#xff1a;采用Proxy 实现响应式&…...

论文阅读分享——UMDF(AAAI-24)

概述 题目&#xff1a;A Unified Self-Distillation Framework for Multimodal Sentiment Analysis with Uncertain Missing Modalities 发表&#xff1a;The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24) 年份&#xff1a;2024 Github&#xff1a;暂…...

JavaWeb——Mybatis、JDBC、数据库连接池、lombok

一、Mybatis 目录 一、Mybatis 二、JDBC 三、数据库连接池 1.概述 2.优势 3.标准接口 4.常见产品 四、lombok 1.概述 2.导入依赖 3.注解 创建步骤: 1.准备工作&#xff08;创建springboot工程、数据库表user、实体类User&#xff09; 2.引入Mybatis的相关依赖&am…...

【网络安全工程】任务12:网络安全设备

目录 一、防火墙​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 二、入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 三、防病毒网关​ ​1、作用​ 2、配置方式​ 3、存在的漏洞​ …...

【学习笔记】《逆向工程核心原理》02.小段标记法、IA-32寄存器、栈、abex‘crackme、栈帧

文章目录 1. 字节序1.1. 大端序与小端序1.2. 在OllyDbg中查看小端序 2.IA-32寄存器2.1. 什么是CPU寄存器2.2. IA-32寄存器2.2.1. 通用寄存器2.2.2. 段寄存器2.2.3. 程序状态与控制寄存器2.2.4. 指令指针寄存器 3. 栈1.1. 栈的特征3.1.2. 栈操作实例 4. abexcrackme4.1. 开始调试…...

固定表头、首列 —— uniapp、vue 项目

项目实地&#xff1a;也可以在 【微信小程序】搜索体验&#xff1a;xny.handbook 另一个体验项目&#xff1a;官网 一、效果展示 二、代码展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…...

用友U9二次开发-问题记录

学习资料&#xff1a;链接: https://pan.baidu.com/s/13JbKSSRkSn2V6-dYX5zKFQ 提取码: p9at 页面 &__dmtrue 客开插件 &Admintrue 开发者使用查看代码 插件 UI插件配置项 1.关闭热插拔 2.在configuration节点下加配置&#xff0c;多个在Web…...

python---pickle库

pickle库 pickle 是 Python 标准库中的一个模块&#xff0c;它可以将 Python 对象&#xff08;如列表、字典、类实例等&#xff09;转换为字节流&#xff0c;这个过程称为“序列化”&#xff1b;反之&#xff0c;也可以将字节流转换回 Python 对象&#xff0c;这个过程称为“反…...

如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统

我在业余时间开发了一款自己的独立产品&#xff1a;升讯威在线客服与营销系统。陆陆续续开发了几年&#xff0c;从一开始的偶有用户尝试&#xff0c;到如今线上环境和私有化部署均有了越来越多的稳定用户。 随时近来 AI 大模型的火热&#xff0c;越来越多的客户&#xff0c;问…...

论文阅读 GMM-JCSFE Model(EEG Microstate)

Motor Imagery Recognition Based on GMM-JCSFE Model 1.问题与困境 1.1 微状态 将连续的EEG信号分解为一系列短暂的、稳定的“微状态”&#xff0c;每个微状态代表了大脑在特定时间窗口内的特定功能。微状态模型的核心思想是&#xff0c;大脑的活动可以看作是由一系列离散的…...

[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传

文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点&#xff1a; 面向连接&#xff0c;可靠性高&#xff0c;全双工&#xff0c;面向字节流udp特点&#xff1a;无连接&#xff0c;不…...

Etcd的安装与使用

1.Etcd介绍 Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统&#xff0c;用于配置共享和服 务发现等。它使用 Raft 一致性算法来保持集群数据的一致性&#xff0c;且客户端通过长连接 watch 功能&#xff0c;能够及时收到数据变化通知。 以下 是关于 …...

ROS实践(四)机器人建图及导航

一、概念 机器人导航是指机器人在环境中自主地从一个地点移动到另一个地点的过程。这个过程涉及到多个关键技术&#xff0c;包括定位、路径规划、避障等。机器人导航通常包括以下几个重要部分。 1. 定位 定位是机器人确定自己在环境中的位置的过程。常用的定位方法包括&#xf…...

Excel 中如何实现数据透视表?

Excel 中如何实现数据透视表&#xff1f; 数据透视表&#xff08;PivotTable&#xff09;是 Excel 中强大的数据分析工具&#xff0c;能够快速汇总、分析和展示大量数据。本文将详细介绍如何在 Excel 中创建和使用数据透视表。 1. 数据透视表的基本概念 数据透视表是一种交互…...

SQLiteStudio:一款免费开源跨平台的SQLite管理工具

目录 1.简介 2.下载与安装 3.实现分析 4.总结 1.简介 SQLiteStudio 是一款专门用于管理 SQLite 数据库的图形化工具&#xff0c;由波兰开发者开发并维护。由于 SQLite 以其轻量级、零配置、嵌入式等特性被广泛应用于各种小型项目、移动应用和桌面应用中&#xff0c;而 SQLi…...

实现Django和Transformers 构建智能客服大模型(模拟订单系统)

一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…...

【沐渥科技】氮气柜日常如何维护?

氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南&#xff1a; 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部&#xff0c;避免灰尘堆积。避免使用腐蚀性清洁剂&#xff0c;防止损伤密封条或传感器。…...

数据安全之策:备份文件的重要性与自动化实践

在信息化高速发展的今天&#xff0c;数据已成为企业运营和个人生活中不可或缺的重要资源。无论是企业的财务报表、客户资料&#xff0c;还是个人的家庭照片、学习笔记&#xff0c;数据的丢失或损坏都可能带来无法挽回的损失。因此&#xff0c;备份文件的重要性日益凸显&#xf…...

windows下玩转vllm:vllm简介;Windows下不能直接装vllm;会报错ModuleNotFoundError: No module named ‘vllm._C‘

文章目录 -1. Windows下不能直接装vllm前言ollama vs vllmOllamavLLMvllm简介核心特点PagedAttention内存优化高效推理应用场景安装与使用-1. Windows下不能直接装vllm 我其实很久之前就意识到这个事儿,后来太久没搞就又忘了。 昨天忙活了半宿,得来的确实一个无法解决的报错…...

目录《Vue 3 + TypeScript + DeepSeek 全栈开发实战》

在快速迭代的软件开发世界里&#xff0c;技术的融合与创新始终是推动行业前行的不竭动力。今天&#xff0c;我们站在了前端技术与大数据搜索技术交汇的十字路口&#xff0c;手中的工具不再仅仅是编码的利器&#xff0c;更是解锁未来应用无限可能的钥匙。正是基于这样的时代背景…...

for...of的用法与介绍

一、定义 for...of 是 ES6&#xff08;ECMAScript 2015&#xff09;引入的一种用于 遍历可迭代对象&#xff08;Iterable&#xff09;的循环语句 二、语法 for (const item of iterable) {// 代码块 }参数&#xff1a; iterable&#xff1a;一个可迭代对象&#xff08;如数组…...

快速使用PPASR V3版不能语音识别框架

前言 本文章主要介绍如何快速使用PPASR语音识别框架训练和推理&#xff0c;本文将致力于最简单的方式去介绍使用&#xff0c;如果使用更进阶功能&#xff0c;还需要从源码去看文档。仅需三行代码即可实现训练和推理。 源码地址&#xff1a;https://github.com/yeyupiaoling/P…...

Aliyun CTF 2025 web ezoj

文章目录 ezoj ezoj 进来一看是算法题&#xff0c;先做了试试看,gpt写了一个高效代码通过了 通过后没看见啥&#xff0c;根据页面底部提示去/source看到源代码&#xff0c;没啥思路&#xff0c;直接看wp吧&#xff0c;跟算法题没啥关系,关键是去看源码 def audit_checker(even…...

推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet

引言 随着大型语言模型&#xff08;LLMs&#xff09;在技术领域的应用日益广泛&#xff0c;评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力&#xff0c;…...

【H2O2 | 软件开发】事件循环机制

目录 前言 开篇语 准备工作 正文 概念 流程 事件队列类型 示例 结束语 前言 开篇语 本系列为短篇&#xff0c;每次讲述少量知识点&#xff0c;无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的&#xff0c;希望对诸位有所帮…...

LVTTL(Low Voltage Transistor-Transistor Logic)电平详解

一、LVTTL电平的定义与核心特性 LVTTL&#xff08;低压晶体管-晶体管逻辑&#xff09;是传统TTL&#xff08;5V&#xff09;的低电压版本&#xff0c;工作电压通常为3.3V&#xff0c;旨在降低功耗并适配现代低电压集成电路&#xff0c;同时保持与TTL的逻辑兼容性。其核心特点如…...

Manus:成为AI Agent领域的标杆

一、引言 官网&#xff1a;Manus 随着人工智能技术的飞速发展&#xff0c;AI Agent&#xff08;智能体&#xff09;作为人工智能领域的重要分支&#xff0c;正逐渐从概念走向现实&#xff0c;并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中&#xff0c;Manus以其独…...

批量测试IP和域名联通性

最近需要测试IP和域名的联通性&#xff0c;因数量很多&#xff0c;单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境&#xff0c;Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...

网络安全之tcpdump工具

引言 wireshark是一款非常不错的抓包软件&#xff0c;在图形化界面占绝对统治地位&#xff1b;尽管其在字符界面下有些许选项可供使用&#xff0c;但终究不太方便&#xff0c;下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说&#xff0c;当开…...

TMS320F28P550SJ9学习笔记8:I2C通信的结构体寄存器配置的了解

继续学习IIC通信的寄存器配置方式&#xff1a;尝试使用寄存器方式配置了解I2C a 没条件完整测试IIC功能&#xff0c;具体的修改与测试留在下文&#xff0c;这里只贴出全部代码&#xff0c;就不提供工程了 文章提供测试代码讲解、完整工程下载、测试效果图 目录 IIC通信引脚&a…...

TypeScript类:面向对象编程的基石

一、从现实世界到代码世界 想象你要建造一栋房子&#xff0c;首先需要一张设计蓝图——它定义了房屋的结构&#xff08;几个房间&#xff09;、功能&#xff08;卧室/厨房&#xff09;和特性&#xff08;材料/颜色&#xff09;。在TypeScript中&#xff0c;class就是这个设计蓝…...

C语言学习笔记-进阶(10)自定义类型:结构体

1. 结构体类型的声明 前面我们在学习操作符的时候&#xff0c;已经学习了结构体的知识&#xff0c;这里稍微复习一下。 1.1 结构体回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构体的声明 struct tag {member-…...

Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

upload-labs-master通关攻略(9~12)

Pass-9 建立1.php <?php phpinfo();?> 上传时抓包 修改代码 在1.php后面加点号空格点号 放行后得到 Pass-10 将1.php放入 上传时抓包 修改代码 将1.php改为1.pphphp 上传后得到 Pass-11 将1.php改为1.png 上传时抓包 修改代码 ../upload/2.php%00 放行后得到 Pass…...

python语言总结(持续更新)

本文主要是总结各函数&#xff0c;简单的函数不会给予示例&#xff0c;如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示&#xff0c;用以提示用户)输入函数 注释 # 单行注释符&…...

UI自动化测试 —— web端元素获取元素等待实践!

前言 Web UI自动化测试是一种软件测试方法&#xff0c;通过模拟用户行为&#xff0c;自动执行Web界面的各种操作&#xff0c;并验证操作结果是否符合预期&#xff0c;从而提高测试效率和准确性。 目的&#xff1a; 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…...

【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>

std::unique_ptr 的 Rust 绑定称为 UniquePtr。有关 Rust API 的文档&#xff0c;请参见链接。 限制&#xff1a; 目前仅支持 std::unique_ptr<T, std::default_delete>。未来可能会支持自定义删除器。 UniquePtr 不支持 T 为不透明的 Rust 类型。对于在语言边界传递不…...

【网络协议安全】任务10:三层交换机配置

CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI&#xff08;开放系统互连&#xff09;模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能&#xff0c;还能实现路由功能&#xff0c;提供更为灵活的网…...

C语言每日一练——day_4

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第四天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…...

文件系统调用(上) ─── linux第17课

目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器&#xff0c;你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关&#xff0c; write read close lseek ,类比C文件相关接…...

在 Spring Boot 中实现基于 TraceId 的日志链路追踪

1 前言 1.1 什么是 TraceId? TraceId 是一个唯一的标识符,用于跟踪分布式系统中的请求。每个请求从客户端发起到服务端处理,再到可能的多个微服务调用,都会携带这个 TraceId,以便在整个请求链路中进行追踪和调试。 1.2 日志链路追踪的意义 日志链路追踪可以帮助开发者…...

STM32 HAL库 CAN过滤器配置

之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法&#xff0c;当时由于并没有使用过滤器的现实需求&#xff0c;所以就也没仔细研究。现在工作中确实需要用到过滤器了&#xff0c;有些项目中控制器和发动机E…...

C++ 控制结构与函数全面解析

引言 在 C 编程中&#xff0c;控制结构和函数是构建程序逻辑的关键要素。控制结构能够决定程序的执行流程&#xff0c;而函数则可以将代码模块化&#xff0c;提高代码的复用性和可维护性。本文将深入介绍 C 中的控制结构和函数的相关知识。 一、控制结构 1. if - else 语句 …...

基于django+pytorch(Faster R-CNN)的钢材缺陷识别系统

一、训练数据来源以及数据标注 数据来源于阿里云天池实验室公开数据集中的铝型材缺陷检测数据集APDDD 数据标注通过labelme进行标注&#xff0c;图片所有标注以转化为矩形标注&#xff0c;存放成json格式。 二、模型训练方式及结果 缺陷识别模型基于Faster R-CNN ResNet5…...

C++多态

多态 多态分为:静态多态(函数重载,运算符重载)和动态多态(派生类、虚函数) 二者区别:静态多态是在地址编译时绑定,而动态多态是在地址运行时绑定 动态多态的特点: 1.有继承关系 2.子类重写父类虚函数(就是跟父类行为函数名称一样&#xff0c;但是是作为子类的行为) 动态多态的…...

【一句话经验】ubuntu vi/vim 模式自动设置为paste

从centos过来&#xff0c;发现ubutun有些地方不习惯&#xff0c;尤其是vi的粘贴&#xff0c;默认自动进去了代码模式&#xff0c;导致每次粘贴必须得set paste&#xff0c;否则会出现问题。 解决办法非常简单&#xff0c;按照下面命令执行即可&#xff1a; cd ~ echo "…...

MongoDB 触发器实现教程

在传统的关系型数据库&#xff08;如 MySQL&#xff09;中&#xff0c;触发器是一种强大的工具&#xff0c;它可以在特定的数据库操作&#xff08;如插入、更新或删除&#xff09;发生时自动执行一段代码。然而&#xff0c;MongoDB 并没有原生内置的触发器概念。不过&#xff0…...

ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件

NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…...

《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)问题 C: 【递归入门】组合+判断素数

题目描述 已知 n 个整数b1,b2,…,bn 以及一个整数 k&#xff08;k&#xff1c;n&#xff09;。 从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。 例如当 n4&#xff0c;k&#xff1d;3&#xff0c;4 个整数分别为 3&#xff0c;7&#xff0c;12&#xf…...

重生之我在学Vue--第8天 Vue 3 UI 框架(Element Plus)

重生之我在学Vue–第8天 Vue 3 UI 框架&#xff08;Element Plus&#xff09; 文章目录 重生之我在学Vue--第8天 Vue 3 UI 框架&#xff08;Element Plus&#xff09;前言一、Element Plus 基础&#xff1a;从安装到组件革命1.1 安装与两种引入模式全量引入&#xff08;适合快速…...