Vue原理面试题

15 篇文章 0 订阅
订阅专栏

一、大厂必考原理

1.组件化和MVVM

2.响应式原理

3.vdom和diff算法

4.模板编译

5.组件渲染过程

6.前端路由

1.组件化基础=>(MVVM模型)

 传统组件,知识静态渲染,更新依赖于操作DOM

Vue的核心理念是数据驱动的理念,所谓的数据驱动的理念:当数据发生变化的时候,用户界面也会发生相应的变化,开发者并不需要手动的去修改dom.

这样做给我们带来的好处就是,我们不需要在代码中去频繁的操作dom了,这样提高了开发的效率,同时也避免了在操作Dom的时候出现的错误。

Vue.js的数据驱动是通过MVVM这种框架来实现的,MVVM 框架主要包含三部分:Model,View,ViewMode

数据驱动视图 - Vue MVVM

MVVM是Model-View-ViewModel缩写,也就是把MVC中的Controller演变成ViewModel。Model代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会绑定到ViewModel层并自动将数据渲染到页面中,视图变化的时候通知viewModel层更新数据


2.Vue响应式原理的实现

组件data的数据一旦改变,立马触发视图的更新。

核心API -- Object.defineProperty

Object.defineProperty有缺点(Vue3启用Proxy)

Proxy的兼容性不太好,且无法使用polyfill

Object.defineProperty基本用法

 Object.defineProperty实现响应式

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

 Object.defineProperty的缺点

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

总结;

1.核心API -- Object.defineProperty

2.如何监听对象(深度监听),如何监听数组

3.缺点

// 触发更新视图
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(newValue)

                // 设置新值
                // 注意,value 一直在闭包中,此处设置完之后,再 get 时也是会获取最新的值
                value = newValue

                // 触发更新视图
                updateView()
            }
        }
    })
}

// 监听对象属性
function observer(target) {
    if (typeof target !== 'object' || target === null) {
        // 不是对象或数组
        return target
    }

    // 污染全局的 Array 原型
    // Array.prototype.push = function () {
    //     updateView()
    //     ...
    // }

    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.name = 'lisi'
// data.age = 21
// // console.log('age', data.age)
// data.x = '100' // 新增属性,监听不到 —— 所以有 Vue.set
// delete data.name // 删除属性,监听不到 —— 所有已 Vue.delete
// data.info.address = '上海' // 深度监听
data.nums.push(4) // 监听数组

3.虚拟DOM(vdom)和diff算法

  • DOM操作非常耗费性能
  • 以前用jQuery,可以自行控制DOM操作时机,手动调整
  • vue和react都是数据驱动试图,如何有效控制DOM操作?

解决方案——vdom

  • 有一定的复杂度,想减少计算次数比较难
  • 难不能把计算,更多的转移为JS计算?因为JS执行比较快
  • vdom——用JS模拟DOM结构,计算出最小的变更,操作DOM

面试题:用JS模拟DOM元素

包含三部分:标签tag,附着在标签上的属性、样式、事件props,子元素children

通过snabbdom 学习vdom

  • vue3重写了vdom的代码,优化了性能
  • 但vdom的理念不变,面试考点不变

h函数、vnode数据结构、patch函数

vdom总结

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

diff算法

两个数做diff,如这里的vdom diff

 vnode   ->patch ->new vnode

树diff的时间复杂度O(n^3)

  • 第一,遍历tree1;第二,遍历tree2
  • 第三,排序
  • 1000个节点,要计算1亿次,算法不可用

优化时间复杂度到O(n)

  • 只比较同一层级,不跨级比较
  • tag不相同,直接删掉重建,不再深度比较
  • tag和key,两者都相同,则认为是相同的节点,不再深度比较

diff算法总结

  • patchVnode
  • addVnodes removeVnodes
  • updateChildren(key的重要性)

vdom和diff总结

  • 细节不重要,updateChildren更新过程也不重要,不要深究
  • vnode核心概念很重要:h vnode patch diff key 等
  • vnode的存在价值更重要:数据驱动试图,控制DOM操作

4.模板编译

 

with语法 

 

模板编译

总结

vue中使用render代替template 

总结

 5.组件渲染更新过程

vue原理的三大知识点

组件渲染/更新过程 

初次渲染过程

第二步是因为,执行render函数会触发getter操作 

更新过程

触发setter,看是修改的data是否在getter中已经被监听,如果是,就执行render函数

patch的diff算法,会计算出最小差异,更新在DOM上 

完整流程图

模板编译完,生成render函数,执行render函数生成vnode (虚拟DOM的树)

执行render函数的时候会touch getter,即执行函数的时候回触发Data里的getter

触发的时候就会收集依赖,即在模板中出发了哪个变量的getter就会把哪个给观察起来(watcher)

在修改Data的时候,看这个Data是否是之前作为依赖被观察起来的

如果是,就重新出发re-render,重新渲染,重新生成vdom tree,重新touch

异步渲染

1.$nextTick:

vue是异步渲染,$nextTick会待Dom渲染完之后调用

页面渲染时会将data的修改做整合,多次data修改只会渲染一次

2.汇总data的修改,一次性更新试图

3.减少DOM操作次数,提高性能

6.前端路由原理

网页url组成部分

 hash的特点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>hash test</title>
</head>
<body>
    <p>hash test</p>
    <button id="btn1">修改 hash</button>

    <script>
        // hash 变化,包括:
        // a. JS 修改 url
        // b. 手动修改 url 的 hash
        // c. 浏览器前进、后退
        window.onhashchange = (event) => {
            console.log('old url', event.oldURL)
            console.log('new url', event.newURL)

            console.log('hash:', location.hash)
        }

        // 页面初次加载,获取 hash
        document.addEventListener('DOMContentLoaded', () => {
            console.log('hash:', location.hash)
        })

        // JS 修改 url
        document.getElementById('btn1').addEventListener('click', () => {
            location.href = '#/user'
        })
    </script>
</body>
</html>

H5 history

  • 用url规范的路由,但跳转时不刷新页面
  • history.pushState
  • window.onpopstate

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>history API test</title>
</head>
<body>
    <p>history API test</p>
    <button id="btn1">修改 url</button>

    <script>
        // 页面初次加载,获取 path
        document.addEventListener('DOMContentLoaded', () => {
            console.log('load', location.pathname)
        })

        // 打开一个新的路由
        // 【注意】用 pushState 方式,浏览器不会刷新页面
        document.getElementById('btn1').addEventListener('click', () => {
            const state = { name: 'page1' }
            console.log('切换路由到', 'page1')
            history.pushState(state, '', 'page1') // 重要!!
        })

        // 监听浏览器前进、后退
        window.onpopstate = (event) => { // 重要!!
            console.log('onpopstate', event.state, location.pathname)
        }

        // 需要 server 端配合,可参考
        // https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90
    </script>
</body>
</html>

 总结

 两者选择

to c的要是不需要管seo、搜索引擎也不需要用H5 history 简单一点就好

12道vue高频原理面试题,你能答出几道?
weixin_40664002的博客
01-13 1191
Vue 响应式原理 vue-reactive 核心实现类: Observer : 它的作用是给对象的属性添加 getter 和 setter,用于依赖收集和派发更新 Dep : 用于收集当前响应式对象的依赖关系,每个响应式对象包括子对象都拥有一个 Dep 实例(里面 subs 是 Watcher 实例数组),当数据有变更时,会通过 dep.notify()通知各个 watcher。 Watche...
面试官:vue的这些原理你了解吗?
专注于dreamweaver网页设计制作
08-09 282
努力!奋斗!爱折腾的程序员, 不会没关系, 最重要的是我们一起学习!在之前面试的时候我自己也经常会遇到一些vue原理的问题, 我也总结了下自己的经常的用到的,方便自己学习,今天也给大家分享出来, 欢迎大家一起学习交流, 有更好的方法欢迎评论区指出, 后序我也将持续整理总结~...
前端面试 VUE
最新发布
weixin_60404020的博客
08-28 547
可以。<input父组件将searchText变量传入custom-input 组件,使用的 prop 名为value;custom-input 组件向父组件传出名为input的事件,父组件将接收到的值赋值给searchText;<input})JavaScript中的对象是引用类型的数据,当多个实例引用同一个对象时,只要一个实例对这个对象进行操作,其他实例中的数据也会发生变化。而在Vue中,更多的是想要复用组件,那就需要每个组件都有自己的数据,这样组件之间才不会相互干扰。
vue面试题--vue原理
mingjie777的博客
05-08 960
Vue原理包括哪些? 1.组件化和MVVM 2.响应式原理 3.vdom 和 diff 算法 4.模板编译 5.组件渲染过程 6.前端路由 组件化基础 1.很久以前”的组件化 asp jsp php 已经有组件化 nodejs 中已有类似组件化 2.数据驱动视图-Vue MVVM mvvm M☞model V☞View VM☞ViewModel 3.数据驱动视图-React setStata Vue 响应原理 组件化data的数据一旦变化,立刻触发视图的更新 1.核心 API-Object,defineP
前端面试Vue 高频原理篇+详细解答,还有105道vue面试题集合
weixin_52546522的博客
05-30 5895
小编在群里看到一句话,说三件套加vue就可以找到实习,三件套估计说的是HTML+JavaScript+CSS,但还有这好事?这可不得赶紧把vue面试题安排上。实不实习不重要,主要是想学习哈哈哈哈(手动狗头)。 也有小伙伴私信小编有没有vue面试题,看来之前的前端面试套餐:Vue面试题总结+JavaScript前端经典面试题+100道 CSS 面试题满足不了大家呀,小编又整理了一套vue面试题集合,需要的小伙伴直接点击这里喔 面试题篇 1.老生常谈之, MPA/SPA 的理解,优缺点是什么? MPA 多页
Vue面试题原理探究
qq_27326125的博客
06-08 1388
总结Vue常见的面试题原理探究 目录 对MVVM原理的理解 响应式数据的原理 vue中是如何检测数组变化 为何vue采用异步渲染 nextTick实现原理 Vue中Computed的特点 1.对MVVM原理的理解 传统的MVC:指用户操作会请求服务端路由,路由会调用对应的控制器来处理,控制器会获取数据,将结果返回给前端,页面重新渲染。 MVVM:传统的前端会将数据手动渲染到页面上,MVVM模式不需要用户收到操作dom元素,将数据绑定到viewmodel层上,会自动将数据渲染到页面中,视图.
前端面试题,包含了基础的css和vue原理面试题,带答案
12-20
前端面试题,包含了基础的CSS和Vue原理面试题,带答案 1. CSS 盒模型 CSS 盒模型是 CSS 中的一个基本概念,它将一个 HTML 元素分割成四个 Box:Content Box、Padding Box、Border Box 和 Margin Box。其中,...
VUE前端面试题 附答案.pdf
12-14
本文档是关于VUE前端面试题的汇总,涵盖了VUE框架的基础知识点,包括VUE的基本原理、双向数据绑定的原理、MVVM、MVC、MVP架构设计模式等。 VUE的基本原理 VUE框架的基本原理是通过Object.defineProperty()将数据...
17.Vue3面试真题(6题).pdf
02-28
### Vue3面试真题知识点详解 #### 一、Composition API 的引入及意义 - **背景**:Vue3中推出的Composition API被广泛认为是Vue3最重要的特性之一。它旨在解决Vue2中存在的若干问题,特别是当项目逐渐庞大时,代码...
2023年Vue最新面试题,包含Vue常用API原理,高频Vue面试题
07-18
2023年Vue最新面试题,包含Vue常用API原理,高频Vue面试题
2023(完整版)vue面试题及答案(最新整理).pdf
06-28
以下是对Vue面试题中涉及的知识点的详细说明: 1. **Vue的基本原理**: - 当创建一个Vue实例时,Vue会遍历`data`对象中的所有属性,使用`Object.defineProperty`(在Vue 3中改为`proxy`)来拦截这些属性的读取和...
9个Vue高频原理面试题(2020新)
g1437353759的博客
09-29 1616
1、computed 的实现原理 computed 本质是一个惰性求值的观察者。 computed 内部实现了一个惰性的 watcher,也就是 computed watcher,computed watcher 不会立刻求值,同时持有一个 dep 实例。 其内部通过 this.dirty 属性标记计算属性是否需要重新求值。 当 computed 的依赖状态发生改变时,就会通知这个惰性的 watcher, computed watcher 通过 this.dep.subs.length 判断有没有订阅者,
Vue面试题合集(原理深入,持续更新)
m0_47743942的博客
06-03 2569
2023前端Vue最新面试试题集合,概念及深入原理,整理不断更新中...
Vue 基本原理面试题常见知识点
weixin_50049555的博客
12-06 241
Vue 响应式基本原理// 能答出来 Vue 的响应式监听是通过 Object.defineProperty 实现的,至少就能得一半的分 const data = {} let name = 'zhangsan' Object.defineProperty(data, 'name', { get: function () { console.log('get'); return name }, set: function (newVal) { console.log(.
VUE面试题
蒋宗正的博客
02-18 310
题目 比较一下vue和react vue组件之间的通信种类,通信实现方式 说说对vuex的理解 说说Vue的MVVM实现原理 答案 1比较一下vue和react 相同点: 都是组件化开发,都有虚拟dom 都支持props进行父子组件之间数据通信 都支持数据驱动视图,不直接操作dom 都支持服务器端渲染 不同点: 数据绑定:vue实现了数据的双向绑定,react数据流动是单向的 组件写法不一样,react推荐把html和css都写进javaScript中,vue推荐html,css和js分开 R
022.整理几个面试题——关于Vue原理(简)
一文不值的博客
07-05 139
关于原理 网上收集整理 01. MVVM框架是什么? 概念:MVVM框架,即Model-View-ViewModel Model 层: 即数据模型层,泛指后端进行的各种业务逻辑处理和数据操控 对于前端来说就是后端提供的 api 接口 View 层: 即视图层,也就是用户界面 前端主要由 HTML 和 CSS 来构建 ViewModel层: ViewModel 是由前端开发人员组织生成和维护的视图数据层 作用:主要用于实现双向数据绑定 当数据一旦改变,就会相应的刷新对应的视
面试题:你了解vue底层原理吗?
HoyinWong的博客
04-27 4445
使用原生js来实现vue(简化版) vue底层原理已经是近期前端面试中常被问到一个问题了。这里就简单的实现一下大概的原理(参考着学习视频写的),方便各位刚刚学习vue的小伙伴理解一下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <titl...
写文章

热门文章

  • vue3:vue-router路由的使用 34532
  • vue3:vue-router路由的使用,v-slot、动态添加、删除路由、路由导航守卫、登录守卫功能 14909
  • Vue原理面试题 7131
  • npm安装依赖报错:npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\misal\A 4192
  • Vue3过渡&动画:过渡动画transition,CSS动画animation,过渡的模式mode,appear初次渲染 4183

分类专栏

  • JS 10篇
  • vue3 项目总结 3篇
  • 小程序
  • 面试总结 15篇
  • 工作
  • css 1篇
  • c‘s‘s
  • web前端-项目总结 6篇
  • 插件 1篇
  • 知识总结 7篇
  • 程序猿学设计 1篇
  • vue 47篇

最新评论

  • vue面试题真题

    一只大黑洋: 18错了

  • ES6中class类、类的继承extends、多态、字面量的增强、解构、let/const、字符串模板、函数的默认参数、展开语法、数值、Symbol使用、Set、Map、es7-13总结

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。

  • JS对象创建-封装、原型、原型链、寄生组合式继承、对象的方法补充

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性。

  • JS手写代码:apply、call、bind,认识arguments,箭头函数中没有arguments,纯函数,slice纯函数,splice不是纯函数

    CSDN-Ada助手: 你阅读过某一个前端框架的源代码么?有没信心自己实现一个呢?

大家在看

  • Java | Leetcode Java题解之第482题秘钥格式化 137
  • Java | Leetcode Java题解之第485题最大连续1的个数
  • C语言 | Leetcode C语言题解之第486题预测赢家
  • C++ | Leetcode C++题解之第485题最大连续1的个数
  • C++ | Leetcode C++题解之第486题预测赢家

最新文章

  • 手写防抖节流、手写深拷贝、事件总线
  • select远程搜索,返回的option中没有前面选中的选项问题解决
  • js性能优化
2024年2篇
2023年4篇
2022年1篇
2021年58篇
2020年6篇
2019年6篇
2018年7篇
2017年9篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司商丘网站排名优化费用多少青岛正规网站优化价格泽轩网站优化阿拉善盟网站seo优化邢台网站优化营商幕墙维修网站优化的建议嘉兴快速网站优化深圳怎么把网站优化有用吗绵阳网站优化专业报价什么网站优化新乡网站关键字优化牟平区个性化网站优化公司商丘百度快照网站优化费用什么是网站优化关键词黑龙江网站优化公司辽宁网站优化企业吉林省灯饰企业商务网站优化浦东网站优化怎么样永济怎么优化网站孝感外包网站优化要多少钱舟山网站优化公司好不好网站优化链接排名清河优化型网站韶关网站竞价优化外包昆明专业网站优化代理乌兰察布网站优化公司怎样找优化不好的网站拉萨网站优化价钱江苏电商网站设计优化价格网站seo优化是什么意思香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化