公司面试题总结(八)

43.Vue 组件之间的通信方式都有哪些

⚫ 通过 props 传递:父组件传递数据给子组件

◼ 子组件设置 props 属性,定义接收父组件传递过来的参数
◼ 父组件在使用子组件标签中通过字面量来传递值

⚫ 通过$emit 触发自定义事件:子组件传递数据给父组件

◼ 子组件通过$emit 触发自定义事件,$emit 第二个参数为传递的数值
◼ 父组件绑定监听器获取到子组件传递过来的参数

⚫ 使用 ref:

◼ 父组件在使用子组件的时候设置 ref
◼ 父组件通过设置子组件 ref 来获取数据

⚫ EventBus:兄弟组件传值

◼ 创建一个中央事件总线 EventBus
◼ 兄弟组件通过$emit 触发自定义事件,$emit 第二个参数为传递的数值
◼ 另一个兄弟组件通过$on 监听自定义事件

⚫ $parent 或$root:通过共同祖辈$parent 或者$root 搭建通信桥连

◼ 兄弟组件 this.$parent.on('add',this.add)
◼ 另一个兄弟组件 this.$parent.emit('add')

⚫ attrs 与 listeners

⚫ Provide 与 Inject

⚫ Vuex

44.你了解 vue 的 diff 算法吗?说说看

⚫ diff 算法是一种通过同层的树节点进行比较的高效算法

⚫ 两个特点:

◼ 比较只会在同层级进行, 不会跨层级比较
◼ 在 diff 比较的过程中,循环从两边向中间比较

⚫ 在 vue 中,作用于虚拟 dom 渲染成真实 dom 的新旧 VNode 节点比较

⚫ 当数据发生改变时,订阅者 watcher 就会调用 patch 给真实的 DOM 打补丁

⚫ 通过 isSameVnode 进行判断,相同则调用 patchVnode 方法

⚫ patchVnode 做了以下操作:

◼ 找到对应的真实 dom,称为 el
◼ 如果都有文本节点且不相等,将 el 文本节点设置为 Vnode 的文本节点
◼ 如果 oldVnode 有子节点而 VNode 没有,则删除 el 子节点
◼ 如果 oldVnode 没有子节点而 VNode 有,则将 VNode 的子节点真实化后添加到 el
◼ 如果两者都有子节点,则执行 updateChildren 函数比较子节点

⚫ updateChildren 主要做了以下操作:

◼ 设置新旧 VNode 的头尾指针
◼ 新旧头尾指针进行比较, 循环向中间靠拢
◼ 根据情况调用 patchVnode 进行 patch 重复流程、调用 createElement 创建一个新 节点,从哈希表寻找 key 一致的 VNode 节点再分情况操作

45.为什么需要 Virtual Dom,和真实 DOM 的区别是什么?

⚫ DOM 很慢,其元素非常庞大,页面的性能问题,大部分都是由 DOM 操作引起的

⚫ 真实的 DOM 节点,哪怕一个最简单的 div 也包含着很多属性

⚫ 虚拟 DOM 优势是 diff 算法,减少 JavaScript 操作真实 DOM 的带来的性能消耗。

⚫ 虚拟 DOM 最大的优势在于抽象了原本的渲染过程,实现了跨平台的能力,而不仅仅

局限于浏览器的 DOM,可以是安卓和 IOS 的原生组件,可以是近期很火热的小程序,也可以是各种 GUI

46.Vue3.0 的设计目标是什么?相比较 Vue2 来说做了哪些性能优化?

⚫ 更小

◼ Vue3 移除一些不常用的 API
◼ tree-shaking,剔除无用模块,使打包的整体体积变小

⚫ 更快

◼ diff 算法优化
◼ 静态提升
◼ 事件监听缓存
◼ SSR 优化

⚫ 更友好

◼ vue3 兼顾 vue2 的 options API 同时还推出 composition API,增加了代码的逻辑组
织和代码复用能力
◼ vue3 是基于 typescipt 编写的,可以享受到自动的类型定义提示

⚫ 优化方案

◼ 源码

◆ 源码管理
⚫ 源码通过 monorepo 方式维护,根据功能将不同的模块拆分到 packages目录下面不同的子目录中
⚫ 一些 package(reactivity 响应式库)独立于 Vue 使用,用户只想使用 Vue3
的响应式能力,可以单独依赖这个响应式库而不用去依赖整个 Vue
◆ TypeScript
⚫ Vue3 基于 typeScript 编写,提供更好的类型检查,支持复杂的类型推导

◼ 性能

◆ 体积优化
◆ 编译优化
◆ 数据劫持优化
⚫ vue2 数据劫持通过 Object.defineProperty ,不检测对象属性添加和删除 ⚫ 尽管 Vue 提供了 set 和 delete 实例方法,但对于用户来说,增加负担
⚫ 面对嵌套层级比较深的情况下,就存在性能问题
⚫ vue3 通过 proxy 监听整个对象
⚫ Proxy 不能监听到内部深层次的对象变化,
⚫ 在 getter 去递归响应式,真正访问到的内部对象才会变成响应式

◼ 语法 API

◆ 优化逻辑组织
⚫ 相同功能代码编写在一块,不像 options API,各个功能的代码混成一块
◆ 优化逻辑复用
⚫ vue2:mixin 实现功能混合,多个 mixin 混合会命名冲突和数据来源不清晰
⚫ vue3:composition 将复用代码抽离出一个函数,使用的地方直接调用

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

Options API(选项 API):

⚫ 定义 data,methods,computed,watch共同处理页面逻辑
⚫ 组件状态写在 data 属性上,方法写在 methods 属性上...
⚫ 当组件变得复杂,导致对应属性的列表也会增长,这会导致组件难以阅读和理解

Composition API(组合 API):

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

区别:

⚫ 逻辑组织和逻辑复用: Composition 将相关代码组织在一起,逻辑更容易地复用和测试。
⚫ 更好的类型推导: Composition 利用 TypeScript 的类型系统,提供了更好的类型推导
⚫ 更直观的代码结构: Composition 使用函数组织逻辑,使代码结构更加直观和清晰。
⚫ Composition API 对 tree-shaking 友好,代码也更容易压缩
⚫ Composition API 中没有 this,减少了 this 指向不明的情况
⚫ 更好的响应式系统: Composition 使用 reactive、ref 创建响应式数据,使得逻辑与状态
之间的关联更加明确和可追踪。
如果是小型组件,可以继续使用 Options API,也是十分友好的

48.说一下 Vue 数据响应式的原理,Vue2 和 Vue3 的有什么区别?

⚫ 实现方式:

◼ Vue2:

◆ 使用 Object.defineProperty()方法来劫持对象的 getter 和 setter,以此来实现
数据的响应式。
◆ 对每个属性单独进行响应式转换 ◆ 不能监听数组的索引和长度属性的变化,无法监听新增或删除的属性。

◼ Vue3:

◆ 引入了 Proxy 对象,这是一种更全面的拦截器
◆ 直接代理整个对象,监听对象的所有属性变化,包括新增和删除属性,
◆ 同时也支持数组的变化。使用 Proxy 可以更高效地追踪变化,且代码更简洁。

⚫ 数组处理:

◼ Vue2:

◆ 通过重写数组的变异方法(如 push、shift 等)来实现数组的响应式,
◆ 但对于通过索引直接修改数组元素或修改数组长度的操作无法响应。

◼ Vue3:

◆ 利用 Proxy 和 Reflect,能够直接代理数组
◆ 可以捕获到所有形式的数组变更,包括直接修改数组元素和长度。

⚫ 新增特性和 API:

◼ Vue3 引入了新的 API,如 reactive 和 ref,使得对响应式对象和基本类型值的创建

更加直观和灵活。

◼ reactive 用于创建深层次响应式对象

◼ ref 主要用于包装基本类型值或对象,使其具有响应式特性。

⚫ 性能优化:

◼ Vue3 通过改进的依赖追踪系统(使用 track 和 trigger),提高了响应式的性能。

◼ 特别是在大型应用中,这些优化有助于减少不必要的更新,提升应用的整体性能。

⚫ 组件内部结构:

◼ Vue3 中引入了 Composition API,这是一种新的组织和复用代码的方式,鼓励使用

函数式编程风格,与原有的 Options API 并行存在,为开发者提供了更多灵活性。

49.Vue3 中的生命周期函数的变化以及含义

⚫ setup():

◼ beforeCreate 和 created 这两个生命周期钩子不再存在,被 setup()方法所取代。
◼ 状态的初始化、事件的绑定等,都会在 setup()方法中进行配置

⚫ 挂载阶段:

◼ beforeMount 和 mounted 保留,但使用 onBeforeMount 和 onMounted 定义逻辑。
◼ onBeforeMount 挂载之前调用,准备工作
◼ onMounted 挂载之后调用,挂载之后调用

⚫ 更新阶段:

◼ beforeUpdate 和 updated 依然存在,但推荐使用 onBeforeUpdate 和 onUpdated。
◼ onBeforeUpdate 进行一些状态的保存或准备工作
◼ onUpdated 更新之后调用,可以进行一些操作,比如获取更新后的 DOM 状态、执行一些更新后的逻辑等。
beforeDestroy 和 destroyed 被重命名为 beforeUnmount 和 unmounted,任何组件卸载前的
清理工作,如清除定时器或解绑全局事件

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

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

相关文章

使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(1)

创建一个Java程序,建立与本机mysql服务器上student数据库的连接,实现在tb_student学生表上插入一条学生信息:学号21540118,姓名王五,性别男,出生日期2003-12-10,所在学院5。 使用JDBC连接数据库后实现数据库插入操作代码如下: import java.sql.Connection; import ja…

web安全渗透测试十大常规项(一):web渗透测试之Fastjson反序列化

渗透测试之Java反序列化 1. Fastjson反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411.3.2.2 fastjson-1.2.42 版本绕过1.3.2.3 fastjson…

IO多线程

文章目录 C#中的IOC#中的多线程IO与多线程的关系注意事项示例代码注意事项和解释 在C#中,IO(输入/输出)和多线程是两个强大的功能,它们各自在处理文件、网络、数据库等IO操作时,以及提高程序并发性和响应能力方面发挥着…

C++调试技巧总结

1.调试准备 常用调试 Crash调试 调试信息: Windows系统:符号单独PDB文件/链接时生成,从外部的符号服务器下载。(微软) LInux: 调试符号与目标模块在一个文件内,编译时产生调试信息。模块发布时…

手机数据恢复篇:如何在OPPO中恢复永久删除的视频?

说到丢失重要的记忆,如何在OPPO设备中恢复永久删除的视频是一个经常困扰许多用户的话题。意外删除重要视频的情况并不少见,对许多人来说,意识到它们已经消失可能很困难。但是,在正确的指导、方法和工具的帮助下,可以找…

运行CDN

背景 CDN代码,调试运行 日常 git clone代码配置虚拟环境 puthon3.8,pip install r requirements.txt改项目数据集路径,在hico.py文件里面 # PATHS {# train: (root / images / train2015, root / annotations / trainval_hico.json),# val: …

性能优化:Java垃圾回收机制深度解析 - 让你的应用飞起来!

文章目录 一、什么是垃圾回收二、Java 内存区域划分三、垃圾回收算法1. 标记-清除(Mark-Sweep)算法2. 复制(Copying)算法3. 标记-整理(Mark-Compact)算法4. 分代收集(Generational Collecting&a…

C#面:C#如何在同一个类中实现多个具有相同方法名的接口?

在C#中,一个类可以实现多个具有相同方法名的接口。为了实现这种情况,你需要在类声明中使用逗号分隔的接口列表。然后,你需要在类中实现每个接口的方法。 下面是一个示例代码,演示了如何在同一个类中实现多个具有相同方法名的接口…

[XYCTF新生赛2024]-PWN:EZ2.0?(arm架构,arm架构下的系统调用)

查看保护 查看ida 完整exp: from pwn import*pprocess(./arm) premote(gz.imxbt.cn,20082) svc0x0001c58c mov_r2_r4_blx_r30x00043224 pop_r70x00027d78 pop_r40x000104e0 pop_r30x00010160 pop_r10x0005f824 pop_r00x0005f73c sh0x0008A090payloadba*0x44 payloa…

cesium使用cesium-navigation-es6插件创建指南针比例尺

cesium-navigation-es6 是一个为 Cesium.js 提供导航控件的库,它提供了一些常见的用户界面组件,用于在 Cesium 场景中实现用户导航和交互。下面将介绍如何在项目中使用 cesium-navigation-es6。 使用步骤 1. 安装 cesium-navigation-es6 首先&#xf…

R-CNN系列和YOLO系列的区别

R-CNN(Region-based Convolutional Neural Networks)和YOLO(You Only Look Once)都是流行的物体检测算法,它们在设计和实现上有一些显著的区别: 检测方式: R-CNN系列(包括Faster R-C…

【INTEL(ALTERA)】NIOS II调试器中的重新启动按钮不起作用

目录 说明 解决方法 说明 在 Nios II SBT 调试Eclipse时,如果单击 重新启动 图标, 执行被暂停, 以下错误消息: Dont know how to run. Try "help target." 解决方法 终止程序,再次下载,并启…

环回接口处理 IP 数据报的过程及 Loopback 接口的主要作用

环回接口处理 IP 数据报的过程 IPv4 中 传给环回地址(127.0.0.1)的任何数据均作为 IP 输入,直接送到环回接口(环回:IP 输入队列)。 传给广播地址或多播地址的数据报,会复制一份传给环回接口&…

监控与警报设计哲学

监控指标 监控系统的4个黄金指标分别是 延迟 处理请求所需要的时间。需要区分成功请求和失败请求的延迟,计算总体延迟时,如果将失败请求的延迟也计算在内,可能会产生误导性的结果。但是,“慢”错误要比“快”错误更糟&#xff01…

七人团购新风尚:数字化时代的购物革命

在数字化时代的浪潮中,购物方式正经历着前所未有的变革。其中,七人团购模式以其独特的互动性和价值共享理念,为消费者带来了全新的购物体验。下面,我们将深入探讨这一模式的运作机制,以及它如何为标价599元的热销商品创…

获取文件绝对路径的几种方法比较

获取文件绝对路径的几种方法比较 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨在Java中获取文件的绝对路径的几种方法及其比较。在软件开发中&…

WordPress Quiz Maker插件 SQL注入漏洞复现(CVE-2024-6028)

0x01 产品简介 WordPress Quiz Maker插件是一款功能强大的测验生成工具,旨在帮助用户轻松、快速地构建复杂的测验和考试。插件支持多种问题类型,包括单选框(MCQ)、复选框(MCQ)、下拉列表(MCQ)、文本、短文本、数字、日期等。还支持横幅(HTML)显示信息性消息、填空题…

ChatGPT-5:开创对话式AI的新纪元

随着科技的飞速发展,人工智能(AI)正在迅速改变我们的生活方式。作为AI技术的前沿代表之一,ChatGPT自其初次发布以来,就以其强大的语言理解和生成能力受到了广泛关注和应用。如今,OpenAI推出最新版本——Cha…

自养号测评助力:亚马逊、沃尔玛电商高效测评补单技巧,轻松实现销量与补单双赢

要在竞争激烈的市场中通过测评补单的方式提升产品权重和销售,构建一个稳定且高效的测评补单系统至关重要。通过精心培养一批高质量的买家账号,并深入了解真实买家的行为数据,结合对风控数据的精准把控,我们能够自主推动推广进程&a…

循环神经网络——RNN

循环神经网络 在之前NLP基础章节-语言模型中我们介绍了 n n n 元语法,其中单词 x t x_t xt​ 在时间步 t t t 的条件概率仅取决于前面 n n n 个单词,若是想要将之前单词的影响也加入那么模型参数数量会指数级增长。但是可能之前的单词存在重要的信息…