赞
踩
Vue 是一个渐进式
的JavaScript 框架,用于构建用户页面.它被广泛用于构建单页面应用程序(SPA)Vue 的优点如下:
易于学习
:Vue 的文档清晰且易于理解,对于初学者而言很容易上手。响应式数据绑定
:Vue 支持响应式数据绑定,这意味着当数据发生变化时,视图将自动更新。组件化开发
:Vue 采用组件化开发方式,这使得开发人员可以构建可重用的组件,从而提高代码的可维护性和可扩展性。可扩展性
:Vue 具有很强的可扩展性,它提供了许多可用的插件和组件来帮助开发人员实现特定的功能。 社区支持:Vue 有一个活跃的社区和许多可用的资源,这使得开发人员可以轻松地找到帮助和解决方案。Vue 的缺点:
性能问题
:与 Angular等框架相比,Vue 的性能可能稍逊一筹。尽管 Vue 在大多数情况下表现良好,但在处理大量数据或复杂的渲染路径时,可能会导致性能下降。路由管理
:虽然 Vue Router对于大多数应用程序来说已经足够好了,但在处理大型应用程序时,可能会需要更强大的路由管理解决方案。移动端支持
:尽管 Vue 对移动端支持良好,但与其他专门针对移动设备设计的框架(如 ReactNative或Ionic)相比,Vue 在移动端性能可能略有不足。大规模应用下的性能优化:Vue在大规模、复杂的应用下可能需要进行更多的优化和定制,这可能需要额外的学习和工作。总的来说,Vue 是一种功能强大、易于学习和使用的JavaScript 框架,适用于各种大小和类型的项目。它的优点使其成为许多开发人员的首选工具而其缺点则可以通过一些策略和优化来避免或减轻。
模板渲染方式不同
:Vue 和React 使用不同的模板语法.Vue使用的是基于模板的语法,可以直观的看到模板中的 JSX 代码而 React 则是将模板中的语法封装在函数中,通过调用函数来渲染组件.数据流
:Vue 是响应式的数据双向绑定系统,支持组件间的数据双向流动.而 React 则采用单向数据流,即从父组件到子组件的数据传递,不支持子组件修改父组件的 数据.(两种组件间父子通信问题)框架本质
:Vue 是一个 MVVM框架,它的核心是一个响应式的数据模型,通过数据绑定和组件之间的通信实现视图和模型的分离.而 React 是一个前端组件化框架,他将 U 组件视为独立的模块并使用 props 和 state 来管理 (MVVM和react 中的 props 和state 问题)渲染过程
:Vue 在渲染过程中会跟踪每一个组件的依赖关系不需要重新渲染整个组件树.而React 在应用的状态被改变时,全部子组件都会重新渲染.监听数据变化卖现原理
:Vue 通过 getter 和 setter 以及一些函数的劫持能精确的知道数据变化.而 React 则是通过 diff 算法,将新的数据和老的数据作对比,然后重新渲染.(getter和 setter l以及 diff 问题)综合来看,Vue 更注重视图和数据的双向绑定以及组件之间的数据流管理,而 React 更注重组件化和状态管理
虚拟 DOM (Virtual DOM,简称 VDOM) 是一种编程概念,意为将目标所需的 UI 通过数据结构“虚拟”地表示出来,保存在内存中,然后将真实的DOM
与之保持同步。具体来说,虚拟 DOM
是由一系列的 JavaScript 对象组成的树状结构,每个对象代表着一个DOM
元素,包括元素的标签名、属性、子节点等信息。虚拟 DOM
中的每个节点都是一个 JavaScript 对象,它们可以轻松地被创建、更新和销毁,而不涉及到实际的DOM
操作。
主要作用
虚拟 DOM
的主要作用是在数据发生变化时,通过与上一次渲染的虚拟 DOM
进行对比,找出发生变化的部分,并最小化地更新实际 DOM
。这种方式可以减少实际 DOM
操作的次数,从而提高页面渲染的性能和效率。
总的来说,虚拟 DOM
是一种用 JavaScript 对象模拟真实 DOM
结构和状态的技术,它通过在内存中操作虚拟 DOM 树
来减少实际 DOM
操作,从而提高页面的性能和用户体验。
在 Vue 3 中,diff(差异比较)是指在进行虚拟 DOM 更新时,对比新旧虚拟 DOM 树的差异,然后只对实际发生变化的部分进行更新,以尽可能地减少对真实 DOM 的操作,提高页面的性能和效率。diff
整体策略为:深度优先,同层比较。也就是说,比较只会在同层级进行, 不会跨层级比较;比较的过程中,循环从两边向中间收拢。
流程解析
Diff 算法的实现流程可以概括为以下几个步骤:
比较根节点: 首先,对比新旧虚拟 DOM 树的根节点,判断它们是否相同。
逐层对比子节点: 如果根节点相同,则逐层对比子节点。
比较子节点类型:
对比子节点列表:
处理新增、删除和移动的节点:
更新节点属性和事件:
递归对比子节点:
总的来说,Diff 算法的核心思想是Diff就是将新老虚拟DOM的不同点找到并生成一个补丁,并根据这个补丁生成更新操作,以最小化对实际 DOM 的操作,提高页面渲染的性能和效率。通过深度优先、同层比较的策略,Diff 算法能够高效地处理虚拟 DOM 树的更新,使得页面在数据变化时能够快速响应并更新对应的视图。
作用:在特定的时间点,执行某些特定的操作。
Vue生命周期一共分为四个阶段:
详细介绍
当页面第一次页面加载时会触发哪几个钩子函数?答:beforeCreate、created、beforeMount、mouted这几个钩子函数
父子组件生命周期顺序
加载渲染过程
:父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted更新过程
:父beforeUpdate->子beforeUpdate->子updated->父updated销毁过程
:父beforeDestroy->子beforeDestroy->子destroyed->父destroyedcomputed:
购物车商品结算的时候
watch:
Observer
: 对数据对象进行遍历,包括子属性对象的属性,利用Object.defineProperty()对属性都加上setter和getter。Compile
: 解析Vue模板指令,将模板中的变量都替换成数据,然后初始化渲染视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,调用更新函数进行数据更新。Watcher
: Watcher订阅者是Observer和Complie之间通信的桥梁,主要的任务是订阅Observer中的属性值变化的消息,当收到属性值变化的消息时,触发解析器Complie中对应的更新函数。Dep
: 订阅器采用发布订阅-订阅 设计模式,用来收集订阅者Watcher,对监听器Observer和订阅者Watcher进行统一管理。总结
定义:Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
通过defineProperty
两个属性,get
及set
小结
API
方法无法监听到Proxy
的监听是针对一个对象的,那么对这个对象的所有操作会进入监听操作,这就完全可以代理所有属性了
在ES6
系列中,我们详细讲解过Proxy
的使用,就不再述说了
Proxy
直接可以劫持整个对象,并返回一个新对象,我们可以只操作新的对象达到响应式目的Object.defineProperty
只能遍历对象属性进行劫持Proxy
不兼容IE,也没有 polyfill
, defineProperty
能支持到IE9Proxy
可以直接监听数组的变化(push
、shift
、splice
)Proxy
有多达13种拦截方法,不限于apply
、ownKeys
、deleteProperty
、has
等等,这是Object.defineProperty
不具备的正因为defineProperty
自身的缺陷,导致Vue2
在实现响应式过程需要实现其他的方法辅助(如重写数组方法、增加额外set
、delete
方法)
方式 | Vue2 | Vue3 |
---|---|---|
父传子 | props | props |
子传父 | $emit | emits |
父传子 | $attrs | attrs |
子传父 | $listeners | 无(合并到 attrs方式) |
父传子 | provide/inject | provide/inject |
子组件访问父组件 | $parent | 无 |
父组件访问子组件 | $children | 无 |
父组件访问子组件 | $ref | expose&ref |
兄弟传值 | EventBus | mitt |
props:props是组件通信中最常用的通信方式之一。父组件通过v-bind传入,子组件通过props接收,(props中数据流是单项的,即子组件不可改变父组件传来的值 在组合式API中,如果想在子组件中用其它变量接收props的值时需要使用toRef将props中的属性转为响应式。)
emit: 子组件可以通过emit发布一个事件并传递一些参数,父组件通过v-on进行这个事件的监听
ttrs和listeners: 子组件使用$attrs可以获得父组件除了props传递的属性和特性绑定属性 (class和 style)之外的所有属性。
provide/inject
parent/children
expose&ref:$refs可以直接获取元素属性,同时也可以直接获取子组件实例
EventBus/mitt
mitt.js
,原理还是 EventBusVuex或者Pinia: 组件还可以借助Vuex或者Pinia状态管理工具进行通信(但是组件之间的通信一般不建议这样做,因为这样就会出现组件不能复用的问题)。
nextTick
:是vue内置的一个api,在页面渲染完成后执行回调函数中的逻辑。接受一个回调函数作为参数。nextTick 是异步操作,且属于微任务。 所以会比 类似于setTimeout这样的延迟函数 更快执行。
function myNextTick(fn) { let app = document.getElementById('app') // 使用MutationObserver方法监听dom var observerOptions = { childList: true, // 观察目标子节点的变化,是否有添加或者删除 attributes: true, // 观察属性变动 subtree: true, // 观察后代节点,默认为 false }; // 要保证fn在dom更新完成后再调用 // 创建一个DOM监听器 let observer = new MutationObserver((el,obs) => { //当被监听的DOM节点更新完成时,该回调会触发 fn() }) //将目标节点和callback绑定,并定义observerOptions来配置需要监听dom的哪些变化 observer.observe(app,observerOptions) }
keep-alive 是缓存不活动的组件官方文档
keep-alive 当作标签使用包惠组件和路由出口
生命周期actived 和deactived
keep-alive 之所以能缓存是因为两个钩子函数 actived 和deactived,当组件激活就会触发 actived,组件失活就会触发deactived
因为不加 keep-alive,组件不会被缓存,每次切换组件就会造成数据重新加载和页面的重新渲染,造成不必要的性能消耗(数据重新加载、页面重新渲染)两个属性
官方解析:Vue 实例的数据对象。Vue 会递归地把 data 的 property 转换为 getter/setter,从而让 data 的 property 能够响应数据变化。当一个组件被定义,data
必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。
2.理解组件中的 data 必须是一个函数:
学习附件:点此下载
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。