前端框架及项目面试 Vue原理

news/2024/7/24 13:16:51 标签: vue

1.Vue原理(大厂必考)

首先 原理 != 源码

1.1 组件化

数据驱动视图(MVVM,setState):传统组件,知识静态渲染,更新还要依赖于操作DOM
数据驱动视图-Vue MVVM 通过修改数据,驱动视图
在这里插入图片描述
数据驱动视图-React setState

1.2 响应式

  • 组件data的数据一旦变化,立刻触发视图的更新
  • 实现数据驱动视图的第一步
  • 考察Vue原理的第一题

监听data变化的核心API:Object.defineProperty

Object.defineProperty的一些缺点(Vue3.0启用Proxy)
1)Proxy有兼容性的问题。兼容性不好,且无法polyfill
2) Vue2.x还会存在一段时间
3)Vue3.0
Object.defineProperty 基本用法
在这里插入图片描述
Object.defineProperty 实现响应式

  • 监听对象,监听数组
  • 复杂对象,深度监听

Object.defineProperty 缺点

  • 深度监听,需要递归到底,一次性计算量大
  • 无法监听新增属性/删除属性(Vue.set Vue.delete)
  • 无法原生监听数组,需要特殊处理

1.3 vdom和diff

vueReact%0A_diffvdom%0A_vdom%0A_DOM%0A_jQueryDOM%0A_VueReact%0A_vdom%0A_vdom_jsDOMDOM%0A_httpsimgblogcsdnimgcn2020051321291880pngxossprocessimagewatermarktype_ZmFuZ3poZW5naGVpdGkshadow_10text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NTRE5fYmFyZQsize_16color_FFFFFFt_70%0A_snabbdom_vdom%0A_vdom%0A_Vuevdomdiff%0A_React_vdom_vue_32">vdom是实现vue和React的重要基石
diff算法是vdom中最核心、最关键的部分
vdom是一个热门话题,也是面试中的热门问题
DOM操作非常耗费性能
以前用jQuery,可以自行控制DOM操作的时机,手动调整
Vue和React是数据驱动视图
解决方案-vdom
vdom 用js模拟DOM结构,计算出最小的变更,操作DOM
在这里插入图片描述
通过snabbdom 学习vdom
简洁强大的vdom库,易学易用
Vue参考它实现的vdom和diff
React vdom 具体实现和vue也不同,但不妨碍同一学习

diff算法是vdom中最核心、最关键的部分
diff算法能在日常使用Vue React中体现出来(如key)
diff算法是前端热门话题,面试“宠儿”

diff算法概述
diff即对比,是一个广泛的概念,如linux diff 命令、Git diff 等
两个js 对象也可以做diff
两棵树做diff,如这里的vdom diff
在这里插入图片描述
树diff的时间复杂度0(n^3)
第一,遍历tree1,第二遍历tree2
第三,排序
1000个节点,要计算1亿次,算法不可用
优化时间复杂度到o(n)
只比较同一层级,不跨级比较
她给不相同,则直接删掉重建,不在深度的比较
tag和key,两者都相同,则认为是相同节点,不在深度比较
在这里插入图片描述
在这里插入图片描述
深入diff算法源码生成vnode

  • snabbdom
  • patch
  • patchVnode
  • addVnodes removeVodes
  • updateChildren(key的重要性)
    在这里插入图片描述
    在这里插入图片描述
    不使用key VS 使用key
    在这里插入图片描述
    vdom核心概念很重要:h、vnode、patch、diff、key
    vdom存在的价值更加重要:数据驱动视图,控制DOM操作

1.5 渲染过程

前置知识:js的with语法
vue template complier将模板编译为render函数
执行render函数生成vnode
with语法(非必须不建议用)
在这里插入图片描述
改变{}内自由变量的查找规则,当做obj属性来查找
如果找不到匹配的obj属性,就会报错
with要慎用,它打破了作用域规则,易读性变差
编译模板
模板不是html,有指令,插值,js表达式,能实现判断,循环
html是标签语言,只有js才能实现判断,循环
因此,模板一定是转换为某种js代码,即为编译模板
模板编译为render函数,执行render函数返回vnode
基于vnode再执行patch和diff
使用webpack vue-loader,会在开发环境下编译模板(重要)
vue组件中使用render代替template
在这里插入图片描述
在有些复杂的情况下不能用template,可以考虑用render

三大核心知识点:
响应式:监听data属性getter setter(包括数组)
模板编译:模板到render函数,再到vnode
vdom:patch(elem,vnode)和patch(vnode,newVnode)

组件渲染/更新的过程
初次渲染过程:
1)解析模板为render函数(或在开发环境已完成,vue-loader)
2)触发响应式,监听data属性getter setter
3)执行render函数,生成vnode,patch(elem,vnode)
更新过程:
1)修改data,触发setter(此前在getter中已被监听)
2)重新执行render函数,生成newVnode
3)patch(vnode,newVnode)
完成流程图
在这里插入图片描述
异步渲染:
回顾$nextTick
汇总data的修改,一次性更新视图
减少DOM操作次数,提高性能
总结1:
渲染和响应式的关系
渲染和模板编译的关系
渲染和vdom的关系
总结2:
初次渲染过程
更新过程
异步渲染

1.6前端路由

稍微复杂一点的SPA,都需要路由
vue-router也是vue全家桶的标配之一
属于“和日常使用相关联的原理”,面试常考
hash
hash变化会触发网页跳转,即浏览器的前进、后退
hash变化不会刷新页面,SPA必需的特点
hash永远不会提交到server端(前端自生自灭)
H5 history
用url规范的路由,但跳转时不刷新页面
history.pushState
window.onpopstate
正常页面浏览
在这里插入图片描述
改造成H5 history模式
在这里插入图片描述
总结
hash-window.onhashchange
H5 history-history.pushState和window.onpopstate
H5 history需要后端的支持

两者如何选择
to B的系统推荐用hash , 简单易用,对url规范不敏感
to C的系统,可以考虑选择H5 history , 但需要服务端支持
能选择简单的,就别用复杂的,要考虑成本和收益(工作很现实)

Vue原理总结

组件化 :
组件化的历史、数据驱动视图、MVVM
模板编译 :
◆with 语法
◆模板编译为render函数
◆执行render函数生成vnode
响应式 :
◆Object.defineProperty
◆监听对象(深度) , 监听数组
◆Object.defineProperty的缺点( Vue 3用Proxy, ,后面会讲)
渲染过程:
◆初次渲染过程
◆更新过程
◆异步渲染
vdom和diff :
应用背景、vnode结构、snabbdom使用: vnode h patch
前端路由:
◆hash
◆H5 history
◆两者对比


http://www.niftyadmin.cn/n/874783.html

相关文章

输出结果为16的python表达式_数据分析课程笔记 - 01 - Python基础知识(一)

image.png 大家好呀,由于 python 是非常重要的数据分析工具,因此这套课程也是从 python 的基础知识讲起的,后面还会学习一些文件操作、爬虫相关的东西。所以我们需要把 python 基础打扎实。接下来的一周左右时间都会是 Python 基础知识相关&a…

51单片机基本刷屏测试实验_基于单片机的简易计时器设计..doc

基于单片机的简易计时器设计.摘 要:单片机自70年代问世以来得到蓬勃发展,目前单片机功能正日渐完善:单片机集成越来越多资源,内部储存资源日益丰富,用户不需要扩充资源就可以完成项目开发,不仅是开发简单&a…

微信小程序云开发之初体验

首先安装开发者工具,在微信工具平台里找,稳定版下载微信开发者工具 1.创建项目 一开始是默认目录,在哪创建项目可以修稿项目名称和目录,填写自己的AppID 如果不填写可以使用测试号,测试号有一些功能无法使用 然后进入…

微信小程序云开发的基础之开通云开发

1.文件夹结构功能 .wxml:类HTML,页面结构 .wxss:CSS,页面样式 .js:js,页面逻辑 .json:小程序自己的配置 2.页面主体pages文件 在app.json里面pages里哪个页面代码在第一行哪个就在小程序启动的时候显示 调换位置的效果如下: pages里的about…

sqlplus中调用shell_shell调用sqlplus查询oracle(转)

[oraclehb shell_test]$ cat echo_time#!/bin/sh一.最简单的调用sqlplussqlplus -S "sys/unimas as sysdba" << !select to_char(sysdate,yyyy-mm-dd) today from dual;exit;![oraclehb shell_test]$ ./echo_timeTODAY----------2011-03-21-S 是silent mode&am…

python协程实现一万并发_python多进程+协程实现并发

小练习&#xff0c;假设一个队列中有100000个URL地址&#xff0c;每个请求需要1秒钟&#xff0c;尝试用4个进程&#xff0c;每个进程中开启1000个协程去请求&#xff01;统计运行时间 from gevent import monkey monkey.patch_all(threadFalse) import gevent import time from…

echarts 关于柱状图鼠标滑过背景时柱子消失问题

最近遇到一个很有头疼的问题&#xff0c;当我的鼠标触摸柱状图的时候他就消失问题。 改了关于 tooltip的属性&#xff0c;发现&#xff0c;只有悬浮的样式的改变&#xff0c;并没无法解决悬浮消失的问题&#xff0c;后来经过各种改动&#xff0c;测试&#xff0c;发现&#x…

python3.5安装scrapy_win7+Python3.5下scrapy的安装方法

如何在win7python3.5的环境下安装成功scrapy&#xff1f;通过pip3 install scrapy直接安装&#xff0c;一般会报错&#xff1a;error: unable to find vcvarsall.bat网上的解决办法有2种&#xff1a;通过wheel来安装lxml.whl、twisted.whl安装vs2015&#xff0c;并勾选各种支持…