前端vue相关常见面试题,包含MVVM、双向绑定原理、性能优化、vue2和vue3性能对比等
vue面试题
MVVM
-
概念
model view viewModel
本质上是mvc(程序分层开发思想)
将viewModel的状态和行为抽象化,viewmodel将视图ui和业务逻辑分开,去除model的数据,同时处理view中需要展示的内容和业务逻辑 -
view视图层
html和css构成
展示页面和承载数据 -
model数据模型
axios请求的部分、数据和业务逻辑的处理
后端进行数据操作和业务逻辑处理 -
viewModel视图模型
前端人员生成和维护 视图和数据层,承上启下
处理view上的事件和输入,转化为对model的操作;model层获取数据,在view层进行数据处理、重构、渲染 -
MVVM特点
-
低耦合,内容可以独立分成单独模块,model和view互不影响
-
可复用性较强
-
分层开发,提高开发效率
-
测试容易
-
增加了应用程序的复杂性,双向数据绑定可能造成额外的开销
单页面应用
-
概念
SPA,加载单个html页面,在用户与应用程序交互时,动态更新页面 -
工作原理
- 浏览器发送请求,服务器返回index.html
- index.html中的js脚本控制显示页面
- 通过路由,在页面显示不同的模板和数据,调用切换仅返回json数据
- 应用程序通过json动态更新页面,页面不会重新加载
- 优点
- 前后端分离,开发效率高
- 用户体验好,无需重新加载页面,同一套后端程序可以支持web、手机等
- 组件化,可复用性
- 减轻服务器压力
- 缺点
- 首页加载较慢
- 导航功能无法使用浏览器自带的页面前进、后退
- 不利于SEO(因为页面内容是异步请求显示的)
vue2和vue3的区别
双向绑定数据的原理不同
- vue2:通过Object.defineProperty实现
//数据更新,但是视图没更新
//添加下面的代码用来更新视图
this.$set(this.data, 'name', 'newName')
-
vue3:通过Proxy实现
-
defineProperty和Proxy的异同
- defineProperty改变对象的内部属性描述符
- proxy创建新代理对象,对原始对象的操作都重定向到这个代理对象上
- defineProperty只能修改对象本身,而proxy可以修改对象本身和原型链上的属性
生命周期不同
-
vue2:beforeCreate created beforeMount mounted beforeUpdate updated beforeDestory destroyed
-
vue3:setup onBeforeMount onMounted onBeforeUpdate onUpdated onBeforeUnmount onUnmounted
keep-alive中多两个钩子函数
onActivated
onDeactivated
父子传值不同
- vue2:props this.$emits
- vue3:props defineEmits
API选型不同
- vue2是选项式API,代码中分割不同属性 data methods computed …
- vue3是组合式API
vue3支持多根节点,vue2只支持单根节点
数据定义
vue2在data中定义,vue3使用ref或reactive
数据双向绑定原理
了解常用方法
- reduce
-
参数:(第一个值/上次计算的结果,当前项目,当前项目下标,调用的数组)
-
求和
const total=arr.reduce((a,b)=>a+b) -
链式获取对象属性
const a=arr.reduce((newObj,k)=>{//每次调用之后的newObj都是上一次返回的结果return newObj[k]
})
-
发布订阅模式
-
名词
setter属性 -> set方法 有参,无需return
getter属性 -> get方法 无参
用来访问和设置对象的属性 -
object.defineProperty
可以定义新属性或修改原有属性
参数:defineProperty(目标对象,属性名,特性)
Object.defineProperty(obj,'name',{//当前属性可以被循环遍历enumerable:true,//当前属性允许被设置configurable:true,//get方法get(){return 1},//setset(newVal){console.log('set',newVal)}
})
在设置或获取属性的时候,自动调用其中的get和set方法
33:54
插槽
-
概念:决定将所携带的内容插入到某个指定的位置,模板在父组件中定义,传递到子组件显示
-
默认插槽
-
具名插槽
-
作用域插槽
数据在子组件上,但是表现由父组件决定
<template #name=“{data}”>
混入mixin
-
概念:可复用的代码片段,包含函数/功能/辅助的业务逻辑,写在单独的文件中
-
使用
定义在src/mixins/minxin.js中,导出function
在组件中导入mixin,解构其中值,可以读取数据和调用函数
注意:混入中的数据不共享
-
优点:使用方便,减少重复代码,可以实现复杂的业务逻辑
-
缺点:组件之间不能共享数据;混入的变量和方法很难找到来源;多个mixin容易引起冲突
nextTick
-
概念:下次DOM更新循环结束之后,延迟回调函数执行
-
异步更新队列
vue观察到更新数据后,不是直接更新dom,而是开启队列,缓存数据并去重,避免不必要的计算和更新
keep-alive
-
缓存组件,避免重复渲染
-
优势:组件切换过程中将状态保存在内存中,防止重复渲染DOM,减少加载时间和性能消耗,提高用户体验
-
使用router-view
<!-- vue3写法 -->
<router-view v-slot="{Component}"><!-- 控制只缓存home --><keep-alive include="homt"><Component :is="Component" /></keep-alive>
</router-view>
-
控制缓存页面
include:只缓存xx
exclude:排除xx
max:最大缓存数 -
激活新钩子函数
- onActivated 激活组件时
- onDeactivated 停用组件时
vuex和pinia
vuex使用
- 基础
import { useStore } from 'vuex'
const store = useStore()
调用mutation 要用commit
调用action 要用dispatch
数据持久化使用vuex-persistedstate
- 常用方法
state:数据源
getters:返回被依赖的数据
mutations:同步更新数据源
actions:异步更新数据源
module:对多模块进行管理
pinia使用
- 基础使用
import {defineStore} from 'pinia'export default defineStore('name',()=>{const name="jack"return {name}
},{//持久化persist:true
})
vuex和pinia的区别
-
方法区别
vuex:state getters mutations actions module
pinia:state getters actions -
pinia调用更方便,可以直接对数据进行读写,不需要commit和dispatch
-
vuex中缺少模块属性支持,pinia中支持
-
pinia有更好的ts支持
vue源码
目录分析
- src/compiler 模板解析和编译相关的文件
- src/core 核心文件,包括vue架构、内置组件、全局API封装等
- src/platforms 平台相关文件
- src/server 服务端渲染相关文件
- src/sfc .vue的解析文件
- src/shared 公共工具
过程
-
npm run server之后,创建一个new Vue实例 --> 最核心是用到了instance/index
-
function vue 为什么不是class,因为有mixins或其他的公共方法,都在vue.prototype上,而new Vue实例,就相当于一个对象,所以用function
-
三种渲染方式:render template el,最终都得到render函数
render函数通过watcher绑定,数据发生变化时,执行update方法,调用vm._render(),产生虚拟DOM,patch对比新旧vnode,diff算法增删改真正的DOM元素 -
instance/init做了什么
- 为当前vue实例(vm)添加唯一uid
- vm._isVue设置为true(监听对象变化时过滤vm)
- 初始化组件
- 初始化各种内容,包括生命周期,事件,虚拟DOM等
- 如果有el属性,就调用vm.$mount挂载vue实例
vue渲染小结
- new vue执行初始化
- 挂载$mount,通过render函数生成渲染树
- watcher监听数据变化
- 数据变化时,render函数生成vnode
- 通过patch对新旧node进行比较,通过diff算法,增删改dom
为什么vue3性能比vue2好
- vue3向下兼容vue2,官方测试:vue3打包速度比vue2快41%,初次渲染提升50%,内存使用减少50%;一些基础API和方法进行了优化
- vue3在setup中的函数和变量优化了程序副作用
- vue2劫持数据使用defineProperty+发布订阅模式实现,数组和新增属性需要额外开销;vue3使用proxy进行数据代理,实现整个对象进行响应式观测,数据变化不需要额外开销
- vue3在依赖手机、程序运行做了性能优化,还增加了异步渲染和懒加载的特性
代理和环境变量
-
代理:接口数据请求中,由于违反同源策略,导致cors跨域问题,需要配置代理,在vue.config.js中,添加devserver配置项及参数
-
环境变量:开发中使用开发环境,打包上线后使用生产环境
process.env.环境变量名称
computed和watch
- computed计算属性
必须有返回值,不支持异步,返回值会缓存,初始化会执行
const nums=computed(()=>{return num.value*2
})
- watch
被监听的数据变化时,watch执行,初始化不会执行
watch(num,(newValue,oldValue)=>{console.log(oldValue,newValue)
})
- 区别
- computed必须有return,watch无需
- computed不支持异步,watch支持
- computed初始化执行,watch不执行
- computed会缓存数据,watch不会
vue2和vue3响应式的区别
- vue2:defineProperty+发布订阅模式实现
在对象上定义新属性或修改现有对象的属性
三个参数:target,key,descriptor
Object.defineProperty(定义属性的对象,属性名称,属性描述)
缺点:递归遍历对象属性,消耗大;新增或删除属性不能立即响应,需要通过额外的方法(比如this.$set);数组修改也需要额外方法
- vue3:proxy实现
拦截对象中任何属性变化,可以随时监听
需要两个参数 proxy(代理的目标对象,对象的handler处理函数)
实现了深层检测
formily自定义组件,子组件通知父组件更改数据
- 使用formily的field.set方法直接设置当前表单域的值,并通知父组件更新
- 使用vue的v-model绑定子组件,子组件通过props的modelValue和emit方法通知父组件更新
- 使用attrs的listeners,通知父组件更新
listeners存储所有未被声明为prop的事件监听器
底层是基于js的事件机制和proxy实现,vue在编译阶段收集事件监听器,运行时通过attrs.listeners触发
diff算法
-
应用场景:虚拟dom渲染为真实dom的新旧VNode节点比较
-
比较方式:深度优先、同层比较
-
原理:数据发生变化时,set调用Dep.notify通知订阅者,订阅者调用patch给真实的DOM打补丁
- 如果isSameVnode相同,调用patchVnode
vue性能优化
- 选用正确的架构,避免部署纯客户端的SPA(存在首屏加载缓慢的问题),可以通过SSR或SSG缓解
- 压缩js打包文件体积,许多vue的API是可以被tree-shake的;按需引入依赖项
- 代码分割:构建工具将js包拆分为多个小的,可以按需加载或并行加载的文件,vite默认支持
- props稳定性:vue组件中,一个子组件只会在至少一个props改变时才更新
比如一个list列表,其中很多listitem组件,根据active-id判断当前组件是否是选中的激活组件,如果active-id改变,每个组件都会重新更新!可以改为 :active=“item.id === activeId” - v-once 只渲染一次,不响应数据变化,v-memo跳过大型子树或v-for列表更新
- 列表虚拟化,比如vue-virtual-scroll
- 减少大型不可变数据的响应性开销,可以通过shallowRef 和 shallowReactive 来绕开深度响应
- 避免不必要的组件抽象,组件实例比普通DOM节点昂贵的多
相关文章:
前端vue相关常见面试题,包含MVVM、双向绑定原理、性能优化、vue2和vue3性能对比等
vue面试题 MVVM 概念 model view viewModel 本质上是mvc(程序分层开发思想) 将viewModel的状态和行为抽象化,viewmodel将视图ui和业务逻辑分开,去除model的数据,同时处理view中需要展示的内容和业务逻辑 view视图层 …...
生信初学者教程(十二):数据汇总
文章目录 介绍加载R包导入数据汇总表格输出结果总结介绍 在本教程中,汇总了三个肝细胞癌(HCC)的转录组数据集,分别是LIRI-JP,LIHC-US/TCGA-LIHC和GSE14520,以及一个HCC的单细胞数据集GSE149614的临床表型信息。这些数据集为科研人员提供了丰富的基因表达数据和相关的临床…...
常用大语言模型简单介绍
LLaMA(Large Language Model Meta AI)和 Qwen是两个不同的大语言模型,它们在开发背景、设计目标和使用场景等方面有所不同。 1. LLaMA: 开发背景: LLaMA 是由Facebook开发的大语言模型,主要针对学术研究和开源领域。它的设计初衷…...
云计算Openstack
OpenStack是一个开源的云计算管理平台项目,由美国国家航空航天局(NASA)和Rackspace公司合作研发并发起,以Apache许可证授权。该项目旨在为公共及私有云的建设与管理提供软件支持,通过一系列相互协作的组件实现云计算服…...
ClickHouse复杂查询单表亿级数据案例(可导出Excel)
通过本篇博客,读者可以了解到如何在 ClickHouse 中高效地创建和管理大规模销售数据。随机数据生成和复杂查询的示例展示了 ClickHouse 的强大性能和灵活性。掌握这些技能后,用户能够更好地进行数据分析和决策支持,提升业务洞察能力。 表结构…...
ST-GCN模型实现花样滑冰动作分类
加入深度实战社区:www.zzgcz.com,免费学习所有深度学习实战项目。 1. 项目简介 本项目实现了A042-ST-GCN模型,用于对花样滑冰动作进行分类。花样滑冰作为一项融合了舞蹈与竞技的运动,其复杂的动作结构和多变的运动轨迹使得动作识别成为一个具…...
计算机网络基础--认识协议
目录 前言 一、IP地址与端口 二、网络协议 1.网络体系结构框架 2.网络字节序 前言 提示:这里可以添加本文要记录的大概内容: 计算机网络涉及非常广泛,这篇文章主要对计算机网络有个认识 提示:以下是本篇文章正文内容&#x…...
基本控制结构2
顺序结构 程序按照语句的书写次序顺序执行。 选择结构 判断选择结构又称条件分支结构,是一种基本的程序结构类型。 在程序设计中,当需要进行选择、判断和处理的时候,就要用到条件分支结构。 条件分支结构的语句一般包括if语句、if–else…...
php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号
有时候我们使用nginx 大家都知道平滑重启命令: /web/nginx/sbin/nginx -s reload 但大家对php-fpm 重启 可能就是简单暴力的kill 直接搞起了 下面介绍一个sh 文件名保存为start_php.sh 来对php-fpm 进行平滑重启 #!/bin/bash# 检查 PHP-FPM 是否运行 if ! pgrep php-…...
实时美颜功能技术揭秘:视频美颜SDK与API的技术剖析
当下,用户希望在视频直播中呈现出最佳状态,这推动了视频美颜SDK和API的迅速发展。本文将深入剖析这项技术的核心原理、应用场景以及未来趋势。 一、实时美颜技术的基本原理 在实现这些效果的过程中,视频美颜SDK通常会使用以下几种技术&…...
word2vector训练代码详解
目录 1.代码实现 2.知识点 1.代码实现 #导包 import math import torch from torch import nn import dltools #加载PTB数据集 ,需要把PTB数据集的文件夹放在代码上一级目录的data文件中,不用解压 #批次大小、窗口大小、噪声词大小 batch_size, ma…...
Python的风格应该是怎样的?除语法外,有哪些规范?
写代码不那么pythonic风格的,多多少少都会让人有点难受。 什么是pythonic呢?简而言之,这是一种写代码时遵守的规范,主打简洁、清晰、可读性高,符合PEP 8(Python代码样式指南)约定的模式。 Pyth…...
net core mvc 数据绑定 《1》
其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】, 但是从可读…...
python为姓名注音实战案例
有如下数据,需要对名字注音。 数据样例:👇 一、实现过程 前提条件:由于会用到pypinyin库,所以一定得提前安装。 pip install pypinyin1、详细代码: from pypinyin import pinyin, Style# 输入数据 names…...
MATLAB中的艺术:用爱心形状控制坐标轴
在MATLAB中,坐标轴控制是绘图和数据可视化中的一个重要方面。通过精细地管理坐标轴,我们不仅可以改善图形的视觉效果,还可以赋予图形更深的情感寓意。本文将介绍如何在MATLAB中使用坐标轴控制来绘制一个爱心形状,并探讨其背后的技…...
基于mybatis-plus创建springboot,添加增删改查功能,使用postman来测试接口出现的常见错误
1 当你在使用postman检测 添加和更新功能时,报了一个500错误 查看idea发现是: Data truncation: Out of range value for column id at row 1 通过翻译:数据截断:表单第1行的“id”列出现范围外值。一般情况下,出现这个…...
Java:Object操作
目录 1、Object转List对象2、Object转实体对象 1、Object转List对象 List<User> userList MtUtils.ObjectToList(objData, User.class);/*** Object对象转 List集合** param object Object对象* param clazz 需要转换的集合* param <T> 泛型类* return*/ public s…...
Java-并发基础
启动线程的方式 只有: 1、X extends Thread;,然后X.start 2、X implements Runnable;然后交给Thread运行 有争议可以可以查看 Thread源码的注释: There are two ways to create a new thread of execution.Callable的方式需要…...
速盾:网页游戏部署高防服务器有什么优势?
在当前互联网发展的背景下,网页游戏的市场需求不断增长,相应地带来了对高防服务器的需求。高防服务器可以为网页游戏部署提供许多优势,下面就详细介绍一下。 第一,高防服务器具有强大的抗DDoS攻击能力。DDoS攻击是目前互联网上最…...
【从0开始自动驾驶】ros2编写自定义消息 msg文件和msg文件嵌套
【从0开始自动驾驶】ros2编写自定义消息 msg文件和msg文件嵌套 详细解答和讨论请私信在工作空间内新建一个功能包在msg内创建对应的msg文件创建名为TestMsg.msg的文件创建名为TestSubMsg.msg的文件(在前一个msg文件中引用)修改CmakeList.txt修改package.…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
