vue2 面试题带答案,万字总结

1. 什么是 vue

Vue 是一套用于构建用户界面的渐进式框架。Vue.js 的主要特点:渐进式框架、声明式渲染、组件化、响应式数据绑定等;

2、MVC 和 MVVM 区别
  • MVC 是模型(model)-视图(view)-控制器(controller),控制器负责视图和模型的交互。

  • MVVM,是模型(model)-视图(view)-viewModel,viewModel 双向绑定。

  • MVVM 与 MVC 区别:MVVM 实现了 View 和 Model 的同步。MVC 需要通过控制器中间控制。

3. Vue 的响应式原理?

Vue 的响应式系统利用了 Object.defineProperty() 方法来把对象的属性转成 getter 和 setter。通过这些 getter/setter,Vue 可以追踪数据的变化,并在数据变化时更新视图。

4. Vue 2 的生命周期
  • new Vue() 构造函数生成 vue 实例;
  • beforeCreate:事件和生命周期钩子初始化;
  • created:实例已经创建完成,data 初始化(props => methods =>data => computed => watch);数据请求在这里,速度快,loading 少。
  • beforeMount:编译模板到 render 函数,生成虚拟 dom;
  • mounted:渲染真实 DOM;
  • beforeUpdate:数据有更新,且新生成的虚拟 DOM 没有挂载(渲染)到页面上;
  • updated:虚拟 dom 以最小开支重新渲染 dom;
  • activated:对于<keep-alive>包裹的组件,当组件被激活时调用。
  • deactivated:对于<keep-alive>包裹的组件,当组件被停用时调用。
  • beforeDestroy:在 Vue 实例销毁之前调用。清除定时器、取消网络请求、移除事件监听器等,以确保在组件销毁时不会产生内存泄漏等问题。
  • destroyed:vue 实例中的数据不可用了。执行一些最终的清理工作,如释放内存、销毁第三方插件。
5. 父子组件生命周期执行顺序
  • 1、加载过程:父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted
  • 2、更新过程:父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated
  • 3、销毁过程:父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed
6. vue 组件传值
  • props 和 this.$emit(“”)

  • inheritAttrs,Son 页面 props 没有的数据会默认绑定到根元素上面

  • a t t r s , attrs, attrslisteners 将 parent 的属性和方法向下传递

  • provide/inject 祖先组件向其所有子孙后代注入一个依赖

  • EventBus 不支持响应式:this. E v e n t B u s . EventBus. EventBus.emit(a,…),this. E v e n t B u s . EventBus. EventBus.on(a,…)

  • this. p a r e n t 父组件 , t h i s . parent父组件,this. parent父组件,this.children 子组件

  • vm. r o o t : 组件树的根实例 , 如果没有父实例 , v m . root:组件树的根实例,如果没有父实例,vm. root:组件树的根实例,如果没有父实例,vm.root 指向自己.

  • vm.$refs

  • vuex

7、为什么组件的 data 必须是个函数?

如果是对象,多个组件共用了一份 data,一变都变;函数返回对象的独立的拷贝,数据独立;

8. 什么是 Vue 的单向数据流?

数据总是从父组件传到子组件,子组件不能修改父组件传过来的数据,有利于数据维护。

9. v-model 双向绑定原理
  • 当输入的值发生变化时,会触发 input 事件,修改当前 value 值,从而实现了从 view 到 model 的更新。
  • 反之,当 Vue 实例中的数据属性发生变化时,v-model 也会自动更新输入元素的值,实现了从 model 到 view 的更新。
10. 什么是计算属性(computed)和侦听属性(watch)?
  • 计算属性:基于已有的数据,按需计算一个新值,如果依赖的值没有变化,则不再重新计算。
  • 侦听属性:用于观察数据变动,可以在数据变化时执行异步或开销较大的操作。
11. Vue 2 中 computed 属性和 methods 方法有什么区别?
  • 计算属性:是基于其依赖进行缓存的,只有当依赖发生变化时才会重新计算。更适合展示用的数据转换。
  • 方法:每次调用都会执行函数内的代码,不会被缓存,每次调用都会重新执行。
12. key 的作用?

key 的设置有助于 diff 算法更高效地识别哪些元素发生了变化。如果每个元素都有唯一的 key,Vue 可以快速确定哪些元素需要移动、添加或删除,从而减少不必要的 DOM 操作。

13. Vue 的 v-if 和 v-show 有什么区别?
  • v-if:条件渲染,只有条件为真时,才会在 DOM 中创建或销毁元素。
  • v-show:不进行 DOM 的创建与销毁,而是通过 CSS 的 display 属性来控制元素的可见性,所有情况都会被渲染到 DOM 中。
14. Vue 的指令(Directive)是什么?有哪些常用的指令?
  • v-bind:动态绑定属性。
  • v-model:表单元素的双向数据绑定。
  • v-for:列表渲染。
  • v-ifv-elsev-show:条件渲染。
  • v-once:只渲染一次,数据变化也不在重新渲染
15. 修饰符

v-model 修饰符

  • .lazy 将文本框的数据绑定事件改为 change
  • .trim 去掉文本框内两边的空格
  • .number 限制文本框输入的字符为数字

事件修饰符

  • .stop 防止事件冒泡
  • .prevent 取消默认事件
  • .capture 捕获事件
  • .self 设置事件触发源是本身
  • .once 设置只能执行一次的事件
  • .passive 告诉浏览器你不想阻止事件的默认行为

键盘修饰符

  • .enter 回车键
  • .tab Tab 键
  • .delete
  • .esc
  • .space
  • .up 键盘上键
  • .down 键盘下键
  • .left 键盘左键
  • .right 键盘右键

鼠标修饰符

  • .left
  • .right
  • .middle

修饰键

  • .ctrl
  • .alt
  • .shift
  • .meta
16. 如何在 Vue 组件中使用插槽(slot)?
  • 默认插槽:直接在子组件模板中定义插槽,父组件可以在对应位置插入内容。
  • 具名插槽:通过 slot 属性定义具名插槽,父组件使用 v-slot 绑定具名插槽。
  • 作用域插槽:通过 slot-scope 属性访问子组件的数据,父组件可以基于子组件的数据动态生成内容。
17. 什么是动态组件?

动态组件就是在组件之间切换的时候,保持这些组件的状态,以避免反复重新渲染导致的性能问题。

<keep-alive>
  <component v-bind:is="currentTabComponent"></component>
</keep-alive>
  • include 和 exclude 属性, include 表示只有名称匹配的组件会被缓存,exclude 表示任何名称匹配的组件都不会被缓存 ,其中 exclude 的优先级比 include 高;
  • 两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数 activated,当组件被移除时,触发钩子函数 deactivated。
18. 什么是异步组件

只在需要的时候才加载一个模块。

  • 异步组件和 webpack 的 code-splitting 功能一起配合使用
  • 工厂函数中返回一个 Promise
  • 局部注册:返回 Promise 的函数
//异步组件和 webpack 的 code-splitting 功能一起配合使用
Vue.component('async-webpack-example', function (resolve) {
  // 这个特殊的 `require` 语法将会告诉 webpack
  require(['./my-async-component'], resolve)
})

//工厂函数中返回一个 Promise
Vue.component(
  'async-webpack-example',
  // 这个动态导入会返回一个 `Promise` 对象。
  () => import('./my-async-component')
)

//当使用局部注册的时候,你也可以直接提供一个返回 Promise 的函数:
 components: {
    'my-component': () => import('./my-async-component')
  }
19.组件循环引用问题
  • 递归组件:确保递归调用条件(例如使用 v-if)。
  • 组件之间的循环引用:1 共享的逻辑或数据提升到父组件,2 用动态导入(import())来延迟加载模块
20.Vue 如何检测数组变化

考虑性能原因数组没有用 defineProperty 对数组的每一项进行拦截,而是选择对 7 种数组(push,shift,pop,splice,unshift,sort,reverse)方法进行重写.数组的索引和长度不会监听。

21. 如何确保数组的修改是响应式的?
  • Vue.set 向响应式对象中添加一个 property
  • 替换整个数组
22. nextTick 你用过吗?

nextTick 是用于获取更新后的 DOM。

Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中。如果同一个 watcher 被多次触发,只会被推入到队列中一次。

23. Vue 事件绑定?

原生事件是通过 addEventListener 绑定的, Vue 组件使用$on ,如果要在 vue 组件上使用原生事件,需要加.native 修饰符。vue 的事件是基于发布订阅模式的,实例方法:

  • vm.$on( event, callback ):注册自定义事件。
  • vm.$emit( eventName, […args] ):执行事件
  • vm.$off( [event, callback] ):移除自定义事件监听器。
  • vm.$once( event, callback ):监听一个自定义事件,但是只触发一次。一旦触发之后,监听器就会被移除。

vue-router

vue-router 是 Vue.js 官方的路由管理器。通过不同的 URL 路径来加载不同的组件,实现页面的切换效果。

24.vue-router 路由模式有几种?
  • hash: 使用 url 的 # 值来作路由, hashchange 事件来监听 hash 值的变化
  • history : 依赖 HTML5 History API ,主要有 history.pushState()history.replaceState()方法,window.onpopstate = (event) => {}事件。
25.路由传参
  • url 传参: this.$route.query.id
  • post 传参: this.$route.params.id
26.说说 vue-router 完整的导航解析流程是什么?
  • 1.导航被触发;
  • 2.在失活的组件里调用 beforeRouteLeave 守卫;
  • 3.调用全局 beforeEach 守卫;
  • 4.在复用组件里调用 beforeRouteUpdate 守卫;
  • 5.调用路由配置里的 beforeEnter 守卫;
  • 6.解析异步路由组件;
  • 7.在被激活的组件里调用 beforeRouteEnter 守卫;
  • 8.调用全局 beforeResolve 守卫;
  • 9.导航被确认;
  • 10.调用全局的 afterEach 钩子;
  • 11.DOM 更新;
  • 12.用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。
27.vue-router 如何响应路由参数的变化?
  • 1、使用 watch 监听
  • 2、向 router-view 组件中添加 key <router-view :key="$route.fullPath"></router-view>
28.怎么实现动态加载路由?

vue-router 的 addRoutes 方法

29.怎么实现路由懒加载?

箭头函数的方法 component:()=>import('组件路径')

Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

30. vuex 执行流程
  • 组件触发 Actions。
  • Actions 执行异步操作后调用 Mutations 修改 State。
  • State 变化触发组件重新渲染。

vue2 性能优化

  • 使用异步组件,减少初始加载的体积
  • 使用路由懒加载,减少初始加载的体积
  • 尽量使用计算属性而不是常规方法
  • 正确使用 v-if 和 v-show
  • 使用 key 优化列表渲染
  • 声明式事件处理,减少不必要的渲染
  • 使用 v-once
  • 选择合适的生命周期钩子处理数据
  • 尽量减少 watch 使用,使用计算属性来替代
  • 使用 Object.freeze()冻结对象
  • 使用 keep-alive 缓存组件
  • 事件,定时器等闭包优化

点个关注:谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 9 无法启动急救方法

方法一&#xff1a;通过单用户安全模式启动 开机按上下方向键&#xff0c;选择需要启动的内核&#xff0c;按e键进入配置模式 修改配置 ro 改 rw 删除 rhgb quiet 末尾增加 init/bin/bash 按 Ctrlx 启动单用户模式 如果想重新启动&#xff0c;重启电脑 执行 exec /sbin/in…

数字后端零基础入门系列 | Innovus零基础LAB学习Day11(Function ECO流程)

###LAB 20 Engineering Change Orders (ECO) 这个章节的学习目标是学习数字IC后端实现innovus中的一种做function eco的flow。对于初学者&#xff0c;如果前面的lab还没掌握好的&#xff0c;可以直接跳过这节内容。有时间的同学&#xff0c;可以熟悉掌握下这个flow。 数字后端…

SAM-Med2D 训练完成后boxes_prompt没有生成mask的问题

之前对着这这篇文章去微调SAM_Med2D(windows环境),发现boxes_prompt空空如也。查找了好长时间问题SAM-Med2D 大模型学习笔记&#xff08;续&#xff09;&#xff1a;训练自己数据集_sam训练自己数据集-CSDN博客 今天在看label2image_test.json文件的时候发现了一些端倪: 官方…

java ssm 同仁堂药品管理系统 在线药品信息管理 医药管理源码jsp

一、项目简介 本项目是一套基于SSM的同仁堂药品管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…

如何解决VS Code的Live Share会话中Guest无法看到共享的文件夹?

在 VS Code 的 Live Share 会话中&#xff0c;如果 Guest 无法看到共享的文件夹&#xff0c;如图所示&#xff1a; 可能是因为权限设置、浏览器限制或 Live Share 的配置问题。以下是逐步排查和解决问题的方法&#xff1a; 1. 确保正确共享了文件夹 在主机&#xff08;Host&a…

.NET 9 运行时中的新增功能

本文介绍了适用于 .NET 9 的 .NET 运行时中的新功能和性能改进。 文章目录 一、支持修剪的功能开关的属性模型二、UnsafeAccessorAttribute 支持泛型参数三、垃圾回收四、控制流实施技术.NET 安装搜索行为性能改进循环优化感应变量加宽Arm64 上的索引后寻址强度降低循环计数器可…

深入解析TK技术下视频音频不同步的成因与解决方案

随着互联网和数字视频技术的飞速发展&#xff0c;音视频同步问题逐渐成为网络视频播放、直播、编辑等过程中不可忽视的技术难题。尤其是在采用TK&#xff08;Transmission Keying&#xff09;技术进行视频传输时&#xff0c;由于其特殊的时序同步要求&#xff0c;音视频不同步现…

MongoDB:数据迁移

业余人员学习 第一种:通过MongoDB命令 参考链接: MongoDB的备份(mongodump)与恢复(mongorestore)_MongoDB_脚本之家 MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧_8055096的技术博客_51CTO博客 1.1、首先进入操作命令行,都不需要进入MongoDB […

网络安全练习之 ctfshow_web

文章目录 VIP题目限免&#xff08;即&#xff1a;信息泄露题&#xff09;源码泄露前台JS绕过协议头信息泄露robots后台泄露phps源码泄露源码压缩包泄露版本控制泄露源码(git)版本控制泄露源码2(svn)vim临时文件泄露cookie泄露域名txt记录泄露敏感信息公布内部技术文档泄露编辑器…

【俄罗斯方块】

【俄罗斯方块】 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 首先把经典的俄罗斯方块简化一下&#xff1a;方块有顺序地从屏幕顶端掉下至底部&#xff0c;当碰到障碍物或底部时停下&#xff0c;同时变成…

优化装配,提升品质:虚拟装配在汽车制造中的关键作用

汽车是各种零部件的有机结合体&#xff0c;因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中&#xff0c;经常会发生零部件间干涉或装配顺序不合理等现象&#xff0c;且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来&#xf…

【算法】日期问题(C/C++)

目录 日期问题概述 一、闰年判断 问题描述&#xff1a; 解决方法&#xff1a; 代码实现&#xff1a; 二、回文日期 问题描述&#xff1a; 链接&#xff1a;2867. 回文日期 - AcWing题库 解决方法&#xff1a; 代码实现&#xff1a; 三、日期差值 问题描述&#xff1…

FIFO架构专题-异步FIFO及信号

概述 FIFO按时钟可分为&#xff1a;异步FIFO、同步FIFO。 定义 同步FIFO&#xff1a;读时钟和写时钟都相同的FIFO。同步FIFO内部没有异步处理&#xff0c;因此结构简单&#xff0c;资源占用较少。 异步FIFO&#xff1a;读时钟和写时钟可以不同的FIFO。异步FIFO内部有专门的异…

类和对象(上)--类、类的实例化(对象)、this指针

1.类 1.1定位&#xff1a; 和namespace一样&#xff0c;类也有类域。同样起到既保护又限制的功能。别人不能随意访问类里的东西&#xff0c;得通过特定的方式来访问&#xff08;访问方法和命名空间域一样&#xff0c;三种方法&#xff09;。 1.2作用 在C语言中&#xff0c;…

Leetcode 路径总和

使用递归算法 class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// 如果节点为空&#xff0c;返回falseif (root null) {return false;}// 如果是叶子节点&#xff0c;检查路径和是否等于目标值if (root.left null && root.right null) …

程序里sendStringParametersAsUnicode=true的配置导致sql server cpu使用率高问题处理

一 问题描述 近期生产环境几台sql server从库cpu使用率总是打满&#xff0c;发现抓的带变量值的慢sql&#xff0c;手动代入变量值执行并不慢&#xff0c;秒级返回&#xff0c;不知道问题出在哪里。 二 问题排查 用扩展事件或者sql profiler抓慢sql&#xff0c;抓到了变量值&…

传输层协议TCP

一.TCP协议格式 对于传输层协议我们之前是学过了UDP&#xff0c;对于传输层协议是存在了一定的了解的&#xff0c;所以现在我们再来看TCP协议格式&#xff1a; 我们之前学过UDP的报文格式&#xff0c;所以源端口和目的端口是不需要进行再次讲解的&#xff0c;对于32序号和确认序…

学习笔记024——Ubuntu 安装 Redis遇到相关问题

目录 1、更新APT存储库缓存&#xff1a; 2、apt安装Redis&#xff1a; 3、如何查看检查 Redis版本&#xff1a; 4、配置文件相关设置&#xff1a; 5、重启服务&#xff0c;配置生效&#xff1a; 6、查看服务状态&#xff1a; 1、更新APT存储库缓存&#xff1a; sudo apt…

C++为函数提供的型特性——缺省参数与函数重载

目录 一、缺省参数 二、函数重载 一、缺省参数 C为函数提供了一项新的特性——缺省参数。缺省参数指的是当前函数调用中省略了实参自动使用的一个值。这极大地提高了函数的灵活性 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值 。在调⽤该函数时&#xff0c;如果没有…