vue面试题汇总(一)

news/2024/4/25 8:04:21/文章来源:https://blog.csdn.net/qq_51983617/article/details/129155839

什么是MVVM

MVVM是Model-View-ViewModel的缩写,Model是数据模型,View是UI组件,ViewModel层把Model和View联系起来,数据会自动绑定到ViewModel层并且把数据渲染到页面,当页面更新时,ViewModel层也会更新相应的数据

vue指令的一些缩写

  1. vue的指令是指用v-开头的特殊属性,后面跟的值期望是js表达式,表达式变化时可以让页面响应式变化。同时可以把表达式的值和某个属性绑定起来,在后面加冒号
<a v-bind:href="url">链接</a>
//这里就是把变量url和a链接的href属性绑定起来了
  1. 缩写:
//完整写法
<a v-bind:href="url">链接</a>
//缩写
<a :href="url">链接</a>//完整写法
<button v-on:click="clickBtn">按钮</button>
//缩写
<button @click="clickBtn">按钮</button>

组件的生命周期

  1. beforeCreate。此时没有数据
  2. created。此时有数据但是没有真实dom
  3. beforeMount。这个阶段创建完虚拟dom了,在这个钩子包括前面两个钩子里面更新数据都不会触发beforeUpdate和updated钩子。
  4. mounted。此时将虚拟dom挂载到真实dom上,可以获取到真实dom和$ref
  5. beforeUpdate。这时会完成响应式数据的更新,但是还没有开始虚拟dom的渲染,在这个钩子更新数据不会导致循环更新。(所以此时数据是新的,视图是旧的)
  6. updated。这时已经完成了dom的更新,在这里更新数据会导致循环更新
  7. beforeDestory。组件实例还没有被销毁
  8. destoryed。组件和子组件实例都已经被销毁了

v-if和v-show的区别

  1. 控制手段不同:v-if将整个dom添加或删除,v-show只是为dom添加了显示隐藏属性
  2. 编译过程不同:v-if的切换会导致内部有子组件或事件监听的重建或者销毁,但是v-show只是简单的样式切换

响应式原理理解

  1. 指:数据更新驱动视图更新,视图变化数据随之响应
  2. vue2使用Object.defineProperty(),vue3用Proxy。都是在getter里面收集依赖,在setter里面根据依赖变化修改数据
  3. 为什么vue3要使用Proxy?因为Object.definePrototype()只能拦截到对象已经存在的属性,所以对新增属性无法添加getter和setter,用Proxy可以很好的解决新增属性的拦截

vue2响应式的原理

  • 总结

    在 data 初始化时,将其属性转换成 gettersetter,同时实例化一个 Dep。视图渲染时, getter 触发,Dep 会收集 Watcher;在 setter 触发时,Dep 会通知其收集的 Watcher 更新视图。Wathcer 在组件挂载时实例化,Watcher 与组件一一对应。

  • 详细过程

    1. 数据劫持。

      使用Object.defineProperty(),针对对象属性,就递归把属性拦截下来,添加监听。但是defineProperty方法不能监听到属性的新增和删除,所以针对数组的pop(),push()数据会没有反应,这个可以用vue原生api里面的vue.set,vue.delete方法添加监听,所以vue针对数组也做了拦截,过程为:把数据的隐式原型执行一个指向一个写好的对象,在这个对象里重写数组的相关方法,再把这个对象的隐式原型指向Array构造函数原型

    2. 模板解析

      通过使用compiler类,对app根组件开始遍历,创建空白文档片段,再依次遍历跟组件下的每一个节点,同时对节点类型进行判断,如果是表单元素,即使用了v-model,就监听表单的Input的事件,当绑定的值发生变化,就把新的值放到data对应的属性里面。如果判断当前节点是文本节点,就获取到文本节点使用到的data值,同时生成watcher实例,对用到的data收集依赖。当对节点处理完之后,把它添加到空白文档里面

    3. 生成依赖

      当生成一个watcher实例就是生成一个依赖,然后会获取data的值,放到对应的节点上,获取data某个值的时候就触发了data的getter,在getter里面就要收集依赖(dep)

    4. 收集依赖

      每个响应式数据都会有一个dep,负责两部分:收集页面使用到这个数据的节点;当数据值变得时候,要通知所有依赖更新页面。因为在获取文本节点的时候会调用data里面的值,所以会触发数据的getter,在getter里面给当前dep添加这个节点。在数据更新的时候调用setter,在setter里面通知dep里面的节点更新

参考文章:https://juejin.cn/post/7084200479005081608

vue3响应式原理

  1. 总结

    用Proxy搭配Reflect函数,对数据进行代理,设置getter和setter,通过用track收集依赖,当数据更新时,调用trigger使依赖更新
    参考文章:https://juejin.cn/post/7001999813344493581

$nextTick

  1. 理解为:在数据变化导致视图更新完成之后,可以调用这个函数获取最新的页面内容

  2. 为什么要有nextTick?

    dom的更新是一个很消耗性能的过程,如果出现了频繁的数据更新,每次更新都触发setter使视图更新会导致性能降低,所以利用了事件循环来收集起来需要更新的watcher,在浏览器进行下一次宏任务的时候一次性更新所有需要更新的视图

  3. 原理:

    使用了事件的循环(事件循环:这里指的过程是 1. 执行宏任务 2. 执行本次宏任务产生的微任务 3. render(页面渲染) 4. 宏任务),浏览器在每次进行宏任务之后会进行一次页面的渲染,所以vue针对这个空隙,整体完成视图的更新。所以可以收集需要更新的依赖,放到宏任务或者微任务里面异步执行,这里只考虑定时器和promise,因为定时器属于宏任务,如果在定时器里面更新视图,会在更新前进行一次没有意义的视图渲染,但是Promise属于微任务,在本次微任务执行期间进行视图更新效果比较好。

computed和watch的区别

计算属性依据组件数据返回新的值,当依赖数据发生变化时,计算属性也会响应式的变化。可以简化模板中复杂属性的逻辑,提高模板的可维护性。

侦听器侦听到数据的变化,在数据变化的同时执行副作用,所以可以用来进行异步处理。

computed的实现原理

  1. vue在遍历data完成数据劫持、收集依赖后,开始对computed进行遍历处理,每一个computed属性都会有一个对应的watcher,同时会有自己的setter和getter,当页面编译到计算属性时,会触发getter,在计算属性的getter里面又触发了所需要的属性的getter,就会把计算属性watcher添加到所需要的属性的dep里面。当所需属性更新的时候,就通过dep通知到计算属性更新。当修改了计算属性的值,触发setter,去更新所需属性的setter
  2. computed里面有两个重要参数:dirty和lazy,其中dirty用来标记依赖属性是否更新,当dirty为true时表示需要重新计算,false表示可以直接取值。lazy是计算属性的默认参数,表示惰性求值,在初始化computed的时候并不会求值

参考文章:https://juejin.cn/post/7125610199666130974

computed和methods的区别

computed有缓存机制,如果依赖属性没有变化就不用重新计算,但是methods里面的方法每次都会重新运行计算

组件里的data为什么是一个函数

  1. 理解1. 因为一个组件可以被多次实例化,用data函数返回的数据有独立的作用域,如果data是一个对象,就会导致同一个组件的多个实例之间引用同一个数据,产生数据污染
  2. 理解2. 组件初始化时,针对data会调用initData函数给每个数据添加setter和getter,如果data是一个对象,那么同一组件的多个实例的数据都会被同一个data拦截,当触发setter,会导致所有用到这个数据的组件都更新,会造成更新混乱

v-model的实现原理

v-model实际上是v-bind:value喝@input事件的语法糖,例子:

<input type="text" v-bin:value="inputValue" @input="inputValue = $event.target.value"/>

<input type="text" v-model="iputValue"/>

以上两种效果相同

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

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

相关文章

蓝牙运动耳机什么牌子的好、运动蓝牙耳机排行榜推荐

近些年&#xff0c;户外运动兴起&#xff0c;运动耳机迎来爆发增长&#xff0c;拒绝运动乏味&#xff0c;追求健康运动方式&#xff0c;已经成为当下年轻人的共同诉求。跑步骑行听音乐&#xff0c;已经是运动爱好者再熟悉不过的操作&#xff0c;很多人在运动中离不开音乐的节奏…

代码随想录算法训练营第七天 | 454.四数相加II 、 383. 赎金信、15. 三数之和、18. 四数之和 、总结

打卡第七天&#xff0c;还是哈希表。 今日任务 454.四数相加II383.赎金信15.三数之和18.四数之和总结 454.四数相加II 代码随想录 class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, ve…

【vue2每日小知识】实现directive自定义指令的封装与全局注册

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;将我们的自定义指令directive统一管理并批量注册 目录 一、directive自定义指令介绍 二…

DS期末复习卷(六)

一、选择题(30分) 1&#xff0e; 设一组权值集合W{2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6}&#xff0c;则由该权值集合构造的哈夫曼树中带权路径长度之和为&#xff08; D &#xff09;。 (A) 20 (B) 30 (C ) 40 (D) 45 W(23)*3(456)*245 2&#xff0e;执行一…

Python、Java、JavaScript、C、Go等编程语言如何实现“定时器”功能

这是CSDN平台2月推出的一个活动(活动链接为&#xff1a;CSDN 征文活动)&#xff0c;聊聊时间的话题&#xff0c;小编我也不知道有什么好聊的时间的话题&#xff0c;看了CSDN给出的部分话题上&#xff0c;有一个这样的话题&#xff0c;如何用各种编程语言实现“定时器”&#xf…

GUI可视化应用开发及Python实现

0 建议学时 4学时&#xff0c;在机房进行 1 开发环境安装及配置 1.1 编程环境 安装PyCharm-community-2019.3.3 安装PyQt5 pip install PyQt5-tools -i https://pypi.douban.com/simple pip3 install PyQt5designer -i https://pypi.douban.com/simple1.2 环境配置 选择“…

JVM13命令行

2. JVM 监控及诊断工具-命令行篇 2.1. 概述 简单命令行工具 在我们刚接触 java 学习的时候&#xff0c;大家肯定最先了解的两个命令就是 javac&#xff0c;java&#xff0c;那么除此之外&#xff0c;还有没有其他的命令可以供我们使用呢&#xff1f; 我们进入到安装 jdk 的…

【11】FreeRTOS的延时函数

目录1.延时函数-介绍2.相对延时函数-解析2.1函数prvAddCurrentTaskToDelayedList-解析2.3滴答定时器中断服务函数xPortSysTickHandler()-解析2.4函数taskSWITCH_DELAYED_LISTS() -解析3.延时函数-实验4.总结1.延时函数-介绍 函数描述vTaskDelay()相对延时xTaskDelayUntil()绝对…

CTFer成长之路之SSRF漏洞

SSRF漏洞CTF SSRF Training 题目描述: web容器中存在一个flag&#xff0c;mysql中存在一个管理员账号密码&#xff0c;其余容器中均没有特定flag mysql容器中内置 tcpdump vulnweb容器中内置一个 fpm.py 攻击脚本 docker-compose.yml version: "3" services:w…

Spring代理模式——静态代理和动态代理

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

笔记本电脑电池和充电器CE认证IEC62133测试

EC 符合性声明 - 您可以从品牌所有者或欧盟境内的商品官方进口商处获取此文件。证明您的商品经过检测符合下表所列标准的文件。您也可以从品牌所有者或欧盟境内的官方进口商处获取此文件。原品牌的笔记本电脑或手机&#xff08;如三星、苹果、戴尔、惠普等&#xff09;提供的原…

【验证码的识别】—— 点触式验证码的识别

一、前言 大家好&#xff0c;不知不觉的我来csdn已经又一周年了&#xff0c;在这一年里&#xff0c;我收获了很多东西&#xff0c;我是2022年2月22日入驻CSDN的&#xff0c;一开始只是为了方便浏览文章的&#xff0c;后来&#xff0c;我也有事没事发发文章&#xff0c;创作了1…

leetcode 1011. Capacity To Ship Packages Within D Days(D天内运送包裹的容量)

数组的每个元素代表每个货物的重量&#xff0c;注意这个货物是有先后顺序的&#xff0c;先来的要先运输&#xff0c;所以不能改变这些元素的顺序。 要days天内把这些货物全部运输出去&#xff0c;问所需船的最小载重量。 思路&#xff1a; 数组内数字顺序不能变&#xff0c;就…

Python 自动化测试必会技能板块—unittest框架

说到 Python 的单元测试框架&#xff0c;想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest。的确&#xff0c;作为 Python 的标准库&#xff0c;它很优秀&#xff0c;并被广泛应用于各个项目。但其实在 Python 众多项目中&#xff0c;主流的单元测试框架远不止这一个。…

【C ++】C++入门知识(二)

C入门&#xff08;二&#xff09; 作者&#xff1a;小卢 专栏&#xff1a;《C》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 1.引用 1.1.引用的概念及应用 引用&#xff08;&&#xff09; 引用不是新定义一个变量&#xff0…

C语言格式化输出总结:%d,%c,%s,%f, %lf,%m.nd,%m.nf,%m.ns 以及sprintf函数

凡事发生必将有益于我&#xff0c;高手&#xff0c;从来都不仅仅是具备某种思维的人&#xff0c;而是那些具备良好学习习惯的人&#xff0c;成为高手&#xff0c;无他&#xff0c;手熟尔&#xff01;加油在最近的学习之中&#xff0c;对于格式化输出这个知识点&#xff0c;这里…

Spring自动装配的底层逻辑

Spring是如何自动装配Bean的&#xff1f;看源码一些自己的理解&#xff0c;如有错漏&#xff0c;请指正 使用Spring之前我们要先去web.xml中设置一下Spring的配置文件&#xff0c;在Spring的配置文件中&#xff0c;是通过component-scan扫描器去扫描base-package底下所有的类装…

google hacker语句

哎&#xff0c;我就是沾边&#xff0c;就是不打实战(&#xffe3;o&#xffe3;) . z Z 文章目录前言一、什么是谷歌Docker&#xff1f;二、受欢迎的谷歌docker语句谷歌docker的例子日志文件易受攻击的 Web 服务器打开 FTP 服务器SSH私钥电子邮件列表实时摄像机MP3、电影和 PDF…

Rocky 9.1操作系统实现zabbix6.0的安装部署实战

文章目录前言一. 实验环境二. 安装zabbix过程2.1. 安装zabbix源2.2 安装zabbix相关的软件2.3 安装数据库并启动2.4 开始初始化数据库&#xff1a;2.5 创建数据库实例及对应的用户2.6 导入官网提供的数据2.7 配置zabbix 服务的配置文件2.8. 启动服务2.9 从网页进行安装2.10 登陆…

从0开始学python -37

Python3 错误和异常 作为 Python 初学者&#xff0c;在刚学习 Python 编程时&#xff0c;经常会看到一些报错信息&#xff0c;在前面我们没有提及&#xff0c;这章节我们会专门介绍。 Python 有两种错误很容易辨认&#xff1a;语法错误和异常。 Python assert&#xff08;断…