位置: IT常识 - 正文

web前端面试高频考点——Vue原理(理解MVVM模型、深度/监听data变化、监听数组变化、深入了解虚拟DOM)(web前端面试常见问题)

编辑:rootadmin
web前端面试高频考点——Vue原理(理解MVVM模型、深度/监听data变化、监听数组变化、深入了解虚拟DOM) 系列文章目录内容参考链接Vue基本使用Vue的基本使用(一文掌握Vue最基础的知识点)Vue通信和高级特性Vue组件间的通信及高级特性(多种组件间的通信、自定义v-model、nextTick、插槽)Vue高级特性Vue的高级特性(动态组件、异步加载、keep-alive、mixin、Vuex、Vue-Router)Vue原理1Vue原理(理解MVVM模型、深度/监听data变化、监听数组变化、深入了解虚拟DOM)Vue原理2Vue原理(diff算法、模板编译、组件渲染和更新、JS实现路由)Vue面试题web前端面试高频考点——Vue面试题文章目录系列文章目录一、Vue原理1、理解MVVM模型2、监听 data 变化的核心 API3、vue如何深度监听 data 变化4、vue如何监听数组变化5、虚拟 DOM(1)解决方案:VDOM(2)用 JS 模拟 DOM 结构(3)通过 snabbdom 学习 vdom(4)vdom 总结一、Vue原理1、理解MVVM模型

推荐整理分享web前端面试高频考点——Vue原理(理解MVVM模型、深度/监听data变化、监听数组变化、深入了解虚拟DOM)(web前端面试常见问题),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:web前端面试基础知识,web前端面试题目及答案汇总,web前端面试题2021及答案,web前端面试题目及答案汇总,web前端面试常问知识,web前端面试常问知识,web前端常见面试题,web前端常见面试题,内容如对您有帮助,希望把文章链接给更多的朋友!

组件化

组件化就是将一个页面拆分成一个个小的功能模块每个功能模块完全属于自己这部分独立的功能使得整个页面的管理和维护变得非常容易。asp jsp php 已经有组件化了nodejs 中也有类似的组件化

数据驱动视图

传统组件,只是静态渲染,更新还要依赖于操作 DOM数据驱动视图 - Vue MVVM数据驱动视图 - React setState

MVVM 模型

2、监听 data 变化的核心 API组件 data 的数据一旦变化,立刻触发视图的更新实现数据驱动视图的第一步核心 API - Object.defineProperty由于 Object.defineProperty 有一些缺点,Vue3.0 使用 Proxy但 Proxy 兼容性不好,且无法 polyfill

Object.defineProperty() 基本用法

示例:基本用法

const data = {}const name = 'zhangsan'Object.defineProperty(data, "name", { get: function () { console.log('get') }, set: function (newVal) { console.log('set') name = newVal }})console.log(data.name) // get zhangsandata.name = 'lisi' // set3、vue如何深度监听 data 变化

Object.defineProperty 缺点

深度监听,需要递归到底,一次性计算量大无法监听新增属性/删除属性(Vue.set、Vue.delete)

示例:视图更新三次,新增和删除属性监听不到

// 触发更新视图function updateView() { console.log('视图更新');}// 重新定义属性,监听起来function defineReactive(target, key, value) { // 深度监听 observer(value) // 核心 API Object.defineProperty(target, key, { get() { return value }, set(newValue) { if(newValue !== value) { // 深度监听 observer(value) // 设置新值 // 注意,value 一直在闭包中,此处设置完之后,再 get 时也是会获取最新的值 value = newValue // 触发更新视图 updateView() } } })}// 监听对象属性function observer(target) { if (typeof target !== 'object' || target === null) { // 不是对象或数组 return target } // 重新定义各个属性(for in 也可以遍历数组) for (let key in target) { defineReactive(target, key, target[key]) }}// 准备数据const data = { name: 'zhangsan', age: 20, info: { address: '北京' // 需要深度监听 }}// 监听数据observer(data)// 测试data.name = 'lisi'data.age = 21// console.log('age', data.age)data.x = '100' // 新增属性,监听不到 —— 所以有 Vue.setdelete data.name // 删除属性,监听不到 —— 所以有 Vue.deletedata.info.address = '上海' // 深度监听// data.nums.push(4) // 监听数组web前端面试高频考点——Vue原理(理解MVVM模型、深度/监听data变化、监听数组变化、深入了解虚拟DOM)(web前端面试常见问题)

4、vue如何监听数组变化

Object.defineProperty 缺点

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

示例:

// 触发更新视图function updateView() { console.log('视图更新');}// 重新定义数组原型const oldArrayProperty = Array.prototype// 创建新对象,原型指向 oldArrayProperty,再扩展新的方法不会影响原型const arrProto = Object.create(oldArrayProperty);['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => { arrProto[methodName] = function () { updateView() // 触发视图更新 oldArrayProperty[methodName].call(this, ...arguments) // 相当于 Array.prototype.push.call(this, ...arguments) }})// 重新定义属性,监听起来function defineReactive(target, key, value) { // 深度监听 observer(value) // 核心 API Object.defineProperty(target, key, { get() { return value }, set(newValue) { if(newValue !== value) { // 深度监听 observer(value) // 设置新值 // 注意,value 一直在闭包中,此处设置完之后,再 get 时也是会获取最新的值 value = newValue // 触发更新视图 updateView() } } })}// 监听对象属性function observer(target) { if (typeof target !== 'object' || target === null) { // 不是对象或数组 return target } // 如果是数组,就把 arrProto 赋值给数组的原型 if (Array.isArray(target)) { target.__proto__ = arrProto } // 重新定义各个属性(for in 也可以遍历数组) for (let key in target) { defineReactive(target, key, target[key]) }}// 准备数据const data = { name: 'zhangsan', age: 20, info: { address: '北京' // 需要深度监听 }, nums: [10, 20, 30]}// 监听数据observer(data)// 测试 - 监听数组data.nums.push(4) // 监听数组

5、虚拟 DOMvdom 是实现 vue 和 react 的重要基石diff 算法是 vdom 中最核心、最关键的部分DOM 操作非常耗费性能以前用 jQuery,可以自行控制 DOM 操作的时机,手动调整Vue 和 React 是数据驱动视图,使用 VDOM(1)解决方案:VDOM有了一定复杂度,想减少计算次数比较难能不能把计算,更多的转移为 JS 计算?因为 JS 执行速度很快vdom - 用 JS 模拟 DOM 结构,计算出最小的变更,操作 DOM(2)用 JS 模拟 DOM 结构

示例:JS 模拟 DOM 结构

HTML 代码

<div id="div1" class="container"> <p>vdom</p> <ul style="font-size: 20px"> <li>a</li> </ul></div>

JS 代码

{ tag: 'div', props: { className: 'container', id: 'div1' } children: [ { tag: 'p', children: 'vdom' }, { tag: 'ul', props: {style: 'font-size: 20px'} children: [ { tag: 'li', children: 'a' } ] } ]}(3)通过 snabbdom 学习 vdom简洁强大的 vdom 库,易学易用Vue参考它实现的 vdom 和 diffsnabbdom参考连接

示例:

<div id="container"></div><button id="btn-change">change</button><script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom.js"></script><script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-class.js"></script><script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-props.js"></script><script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-style.js"></script><script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-eventlisteners.js"></script>const snabbdom = window.snabbdom// 定义 patchconst patch = snabbdom.init([ snabbdom_class, snabbdom_props, snabbdom_style, snabbdom_eventlisteners])// 定义 hconst h = snabbdom.hconst container = document.getElementById('container')// 生成 vnodeconst vnode = h('ul#list', {}, [ h('li.item', {}, 'Item 1'), h('li.item', {}, 'Item 2')])patch(container, vnode)document.getElementById('btn-change').addEventListener('click', () => { // 生成 newVnode const newVnode = h('ul#list', {}, [ h('li.item', {}, 'Item 1'), h('li.item', {}, 'Item B'), h('li.item', {}, 'Item 3') ]) patch(vnode, newVnode) // vnode = newVnode // patch 之后,应该用新的覆盖现有的 vnode ,否则每次 change 都是新旧对比})

改变前:

改变后:

(4)vdom 总结用 JS 模拟 DOM 结构(vnode)新旧 vnode 对比,得出最小的更新范围,最后更新 DOM数据驱动视图的模式下,有效控制 DOM 操作

不积跬步无以至千里 不积小流无以成江海

点个关注不迷路,持续更新中…

本文链接地址:https://www.jiuchutong.com/zhishi/296035.html 转载请保留说明!

上一篇:模型调优:验证集的作用(就是为了调整超参数)(模型如何优化)

下一篇:webpack之常见性能优化(webpack常用属性)

  • 京东省省卡0.1元开通会自动续费吗(京东省省卡0.1元推荐吗)

    京东省省卡0.1元开通会自动续费吗(京东省省卡0.1元推荐吗)

  • iPad与苹果手机怎么共享无线局域网密码(ipad与苹果手机同步)

    iPad与苹果手机怎么共享无线局域网密码(ipad与苹果手机同步)

  • qq音乐一起听有历史记录吗(QQ音乐一起听有麦克风吗)

    qq音乐一起听有历史记录吗(QQ音乐一起听有麦克风吗)

  • 苹果xs多大屏幕尺寸(苹果xs多大屏幕照片)

    苹果xs多大屏幕尺寸(苹果xs多大屏幕照片)

  • 小米打印机能用其他相纸吗(小米打印机能用别的相片纸吗)

    小米打印机能用其他相纸吗(小米打印机能用别的相片纸吗)

  • 苹果11怎么设置身份证打电话(苹果11怎么设置双卡双待)

    苹果11怎么设置身份证打电话(苹果11怎么设置双卡双待)

  • 华为荣耀play4t pro返回键怎么设置(华为荣耀play4tpro手机参数)

    华为荣耀play4t pro返回键怎么设置(华为荣耀play4tpro手机参数)

  • 搜狗是搜狐旗下的产品吗(搜狗与搜狐)

    搜狗是搜狐旗下的产品吗(搜狗与搜狐)

  • preos模式是什么东西(prep模式)

    preos模式是什么东西(prep模式)

  • 手机可以剪辑视频吗(手机可以剪辑视频发抖音吗)

    手机可以剪辑视频吗(手机可以剪辑视频发抖音吗)

  • 超级nfc和全功能nfc区别(超级nfcsim)

    超级nfc和全功能nfc区别(超级nfcsim)

  • 如何清理电脑D磁盘(如何清理电脑d盘中没有用的东西)

    如何清理电脑D磁盘(如何清理电脑d盘中没有用的东西)

  • 多媒体是指(多媒体是指什么的载体)

    多媒体是指(多媒体是指什么的载体)

  • 小米9有实况拍照模式吗(小米9相机有没有实况)

    小米9有实况拍照模式吗(小米9相机有没有实况)

  • 微信未读消息小红点怎么去掉(微信未读消息小红点不见了)

    微信未读消息小红点怎么去掉(微信未读消息小红点不见了)

  • 华为watch gt2能打电话吗(华为watch gt 2e可以打电话吗)

    华为watch gt2能打电话吗(华为watch gt 2e可以打电话吗)

  • 苹果夜间模式怎么设置(苹果夜间模式怎么开启)

    苹果夜间模式怎么设置(苹果夜间模式怎么开启)

  • 苹果x屏幕多大(苹果14多大的屏幕尺寸)

    苹果x屏幕多大(苹果14多大的屏幕尺寸)

  • 苹果11暗黑模式怎么设置(苹果11暗黑模式有什么用)

    苹果11暗黑模式怎么设置(苹果11暗黑模式有什么用)

  • b站好友是互相关注吗(b站的朋友怎么相互称呼)

    b站好友是互相关注吗(b站的朋友怎么相互称呼)

  • 路由器300m够用吗(300m路由器落伍了吗)

    路由器300m够用吗(300m路由器落伍了吗)

  • Linux列举大于指定大小文件的所在目录的方法(linux中的大于号什么意思)

    Linux列举大于指定大小文件的所在目录的方法(linux中的大于号什么意思)

  • 绿萝怎么修剪,这样修剪绿萝叶子让其长得才能更旺盛(图文)(绿萝怎么修剪才能更旺盛)

    绿萝怎么修剪,这样修剪绿萝叶子让其长得才能更旺盛(图文)(绿萝怎么修剪才能更旺盛)

  • 什么是uniCloud(什么是Unicode)

    什么是uniCloud(什么是Unicode)

  • 小微企业企业所得税税率变化
  • 公司主营销售墓地合法吗
  • 收付实现制有应收应付吗
  • 离岸外包和国内外包区别
  • 现金余额本月金额和本年累计金额怎么填
  • 银行打出的明细清单怎么看不懂
  • 小规模房产税减免
  • 土地使用税退税账务处理
  • 支付个人无发票怎么入账
  • 增值税采用
  • 运输公司的固定资产怎么提折旧
  • 土地税退税做什么分录
  • 汇算清缴前发票未到
  • 记账时显示期初未建账
  • 福利费不交个人所得税会怎么样
  • 从关联企业获得非工资报酬怎么缴纳个税?
  • 税收奖励需要纳税吗
  • 工程预缴税款几个点
  • 金税盘开票怎么改成含税金额
  • 汉字防伪企业是哪家
  • 公司账户转入另一个公司的投资款怎么做账?
  • 电子发票没有发票号码是怎么回事
  • 工会筹备金如何补报
  • 前期认证相符且不符合
  • 合伙人退伙资产清算需要交税吗
  • 应收冲预收是什么意思
  • 投资回报期限
  • 技术开发免征增值税怎么开票
  • 企业收到科技创新发票
  • 小型微利企业所得税率
  • 图解在OS X中管理窗口大小的多种方法
  • .linux文件
  • neotrace.exe - neotrace是什么进程 有什么用
  • 工程施工与工程结算会计科目
  • 企业所得税优惠事项管理目录
  • 踩雷日记:Pytorch mmcv-full简易安装
  • javaweb学生信息管理系统idea
  • php防止sql注入的方法
  • 网上打印企业征信报告
  • js如何实现异步编程
  • vue中methods的作用
  • import vue from vue报错
  • 2022年windows11windows10最强VMware Workstation 16 Pro for Windows虚拟机软件最新授权版16.2.3-19376536版本
  • 小微企业会计制度是什么
  • 增值税发票已经认证了,但是税票原票没给,会有什么后果
  • 股东投资的钱要还给他吗
  • 收款收据可以盖业务章吗
  • 帝国cms模型
  • 收到汇算清缴的退税需要交税吗
  • sqlserver并发怎么处理
  • 产品的包装费属于什么科目?
  • 债务利息收入
  • 企业注销递延所得税资产怎么处理
  • 收到上年度企业所得税退税怎么做账
  • 原始凭证分类的依据有什么
  • 工程未完工开了发票怎么做账
  • 中小企业两账合一怎么办
  • 用Autoconf检测MySQL软件包的教程
  • cf分屏不全屏
  • linux那些事儿
  • centos6.8图形界面
  • ubuntu 命令大全
  • linux怎么删除文本文件
  • win10预览版好吗
  • linux怎么修改主配置文件
  • jquery元素隐藏和显示切换
  • js实现倒计时60s
  • jquery常用api
  • Python读取Excel文件需要什么
  • Node.js中的什么模块是用于处理文件和目录的
  • 处理判断字符串是否相等
  • Python中MySQLdb和torndb模块对MySQL的断连问题处理
  • angularjs教程
  • python怎么写爬虫
  • unity3d知乎
  • 电子税务局浏览器版本太低
  • 广东省电子税务局app下载手机版
  • 股权转让税收优惠个人所得税
  • 银行开业送什么花
  • 存在未申报记录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设