前端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.…...
docker 部署 Seatunnel 和 Seatunnel Web
docker 部署 Seatunnel 和 Seatunnel Web 说明: 部署方式前置条件,已经在宿主机上运行成功运行文件采用挂载宿主机目录的方式部署SeaTunnel Engine 采用的是混合模式集群 编写Dockerfile并打包镜像 Seatunnel FROM openjdk:8 WORKDIR /opt/seatunne…...
【易上手快捷开发新框架技术】nicegui标签组件lable用法庖丁解牛深度解读和示例源代码IDE运行和调试通过截图为证
传奇开心果微博文系列 序言一、标签组件lable最基本用法示例1.在网页上显示出 Hello World 的标签示例2. 使用 style 参数改变标签样式示例 二、标签组件lable更多用法示例1. 添加按钮动态修改标签文字2. 点击按钮动态改变标签内容、颜色、大小和粗细示例代码3. 添加开关组件动…...
从HarmonyOS Next导出手机照片
1)打开DevEco Studio开发工具 2)插入USB数据线,连接手机 3)在DevEco Studio开发工具,通过View -> Tool Windows -> Device File Browser打开管理工具 4)选择storage -> cloud -> 100->fi…...
[Docker学习笔记]Docker的原理Docker常见命令
文章目录 什么是DockerDocker的优势Docker的原理Docker 的安装Docker 的 namespaces Docker的常见命令docker version:查看版本信息docker info 查看docker详细信息我们关注的信息 docker search:镜像搜索docker pull:镜像拉取到本地docker push:推送本地镜像到镜像仓库docker …...
【ESP 保姆级教程】小课设篇 —— 案例:20240507_esp01s+UNO的智能浇水系统
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2024-09-30 ❤️❤️ 本篇更新记录 2023-09-30 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...
如何设置MySQL分布式架构主键ID,为什么不能使用自增ID或者UUID做主键?
MySQL分布式架构主键ID的设置方法 雪花算法(Snowflake) 原理:雪花算法是一种生成分布式唯一ID的算法。它由64位二进制数组成,结构如下:1位符号位(固定为0) 41位时间戳(表示从一个固…...
服务器虚拟化详解
服务器虚拟化详解 服务器虚拟化是一种将物理服务器资源转化为虚拟服务器资源的技术,它允许在一台物理服务器上运行多个虚拟服务器,每个虚拟服务器都拥有独立的操作系统、应用程序和资源配置。这种技术极大地提高了服务器的利用率、灵活性和可扩展性&…...
医疗陪诊APP开发实战:从互联网医院系统源码开始
本文将从互联网医院系统源码出发,深入探讨医疗陪诊APP的开发实战。 一、从互联网医院系统源码入手 开发医疗陪诊APP的基础在于互联网医院系统的源码。互联网医院系统通常包括以下几个模块: 1.用户管理:用户注册、登录、信息管理等功能。 …...
jenkins 构建报错ERROR: Error fetching remote repo ‘origin‘
问题描述 修改项目的仓库地址后,使用jenkins构建报错 Running as SYSTEM Building in workspace /var/jenkins_home/workspace/【测试】客户端/client-fonchain-main The recommended git tool is: NONE using credential 680a5841-cfa5-4d8a-bb38-977f796c26dd&g…...
初识C#(三)- 数组
我有17栋楼,在不同地域,都是不同价格租出去给不同的人~ 文章目录 前言一、数组1.1 我有17栋楼 - 数组的声明1.2 包租公&包租婆 - 数组赋值1.3 每个月都要交租的苦逼租客 - 数组的使用 二、字符串2.1 字符串的使用方法 总结 前言 本篇笔记重点描述C#…...
怎样做平台网站/seo长沙
环境描述:已经存在一个MySQL的实例,端口号为3306,配置文件/etc/my.cnf,数据目录/data/mysql,现在需要重新添加一个端口号为3307端口的MySql的实例。1、关闭原有的默认端口3306的mysql[rootwww.cndba.cn /]# service mysql stop2、拷贝或创建数…...
做网站的企业排名/最近一周的重大新闻
在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from people group by peopleId having c…...
网上学设计哪个网站好/网页开发工具
点击上方蓝字关注我们在射频 /微波/毫米波测试中,除了同轴和波导互连器件之外,还有其他两种与DUT交互的主要器件。它们包括连接到元件引线或微带焊盘的表面探针,以及设计用于测试的天线。测试探针和天线所适用的测试类型差异巨大,…...
发布网站建设需求的经验/色盲测试图第六版及答案大全
离我上次写的随笔到现在一年了, 日子真的好快. 又一年了. 一看内我收获了什么呢? 好像没有...... 有的只是现在以一年来到底做了什么的遗憾...... 转载于:https://www.cnblogs.com/Jeffrey/archive/2007/05/12/744125.html...
郑州网站制作开发/数据营销
在前面的文章中,我们介绍的都是基于比较的排序。 对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的)。 本文将继续介绍以线性时间运行的排序算法࿰…...
柳市做网站的公司/谷歌浏览器下载安装
Introduction 引言 The JDK is a development environment for building applications and components using the Java programming language. JDK 是使用 Java 编程语言构建应用程序和组件的开发环境。 The JDK includes tools useful for developing, testing, and monitor…...