前端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.…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
