Vue2.0 双向绑定的原理与缺陷?
原理
Object.defineProperty、getter、setter 标准回答 Vue响应式指的是:组件的data发生变化,立刻触发试图的更新
原理:Vue采用数据劫持结合发布者-订阅者模式的方式来实现数据的响应式,通过对data里面的对象属性进行遍历劫持数据的getter和setter,
当数据发生改变时,会触发对应的setter方法 通过dep.notice()去通知订阅者watcher,watcher接受到消息之后在去触发patch比较新老dom,
在去触发页面的更新
缺点
Object.defineProperty的缺点
一次性递归到底开销很大,如果数据很大,大量的递归导致调用栈溢出
不能监听对象的新增属性和删除属性
无法正确的监听数组的方法,当监听的下标对应的数据发生改变时
解决方法
运用this.$forceUpdate()强制刷新。
使用vm.$set(vm.items, indexOfItem, newValue)
将原数据 obj 进行深拷贝一下,然后再对拷贝后的数据 obj1 进行操作,然后再把操作后的数据obj1 赋值给原数据 obj
第一种情况,可以使用数组的splice方法,arr.splice(index, 1, item)
Object.defineProperty的不足
Object.defineProperty(obj, key, {enumberable:true,configurable:true,get {},set(value) {}});
vue是通过对Data中的属性进行遍历,数据劫持,通过getter(监听数据读取)和setter(监听数据修改),getter在读取数据的时候收集watcher作为依赖,setter在数据发生变化时通知watcher触发视图更新。
更新数组内容时是不会触发界面更新的。只有一些改变数组的方法push(),pop(),shift(),unshift(),splice(),sort(),reverse() 才会触发。对象里面的数组除外。
vue3.0的Proxy
替代了原有的 Object.defineProperty
Proxy和Object.defineProperty的区别是:后者定义的是一个对象上某个值得表现,前者是一个对象行为得表现,不局限某个属性,能观察到对象中属性的增加和删除,可以弥补后者的不足。
Vue2.0 双向绑定的原理与缺陷?的更多相关文章
- vue2.0 双向绑定原理分析及简单实现
Vue用了有一段时间了,每当有人问到Vue双向绑定是怎么回事的时候,总是不能给大家解释的很清楚,正好最近有时间把它梳理一下,让自己理解的更清楚,下次有人问我的时候,可以侃侃而谈. 一.首先介绍Obje ...
- Vue2.0源码阅读笔记--双向绑定实现原理
上一篇 文章 了解了Vue.js的生命周期.这篇分析Observe Data过程,了解Vue.js的双向数据绑定实现原理. 一.实现双向绑定的做法 前端MVVM最令人激动的就是双向绑定机制了,实现双向 ...
- Vue2.0实现双向绑定的原理
一.几种实现双向绑定的做法 目前几种主流的mvc(vm)框架都实现了单向数据绑定,而我所理解的双向数据绑定无非就是在单向绑定的基础上给可输入元素(input.textare等)添加了change(in ...
- vue双向绑定的原理及实现双向绑定MVVM源码分析
vue双向绑定的原理及实现双向绑定MVVM源码分析 双向数据绑定的原理是:可以将对象的属性绑定到UI,具体的说,我们有一个对象,该对象有一个name属性,当我们给这个对象name属性赋新值的时候,新值 ...
- vue数据双向绑定的原理、虚拟dom的原理
vue数据双向绑定的原理https://www.cnblogs.com/libin-1/p/6893712.html 虚拟dom的原理https://blog.csdn.net/u010692018/ ...
- 最近老是有兄弟问我,Vue双向绑定的原理,以及简单的原生js写出来实现,我就来一个最简单的双向绑定,原生十行代码让你看懂原理
废话不多说直接看效果图 代码很好理解,但是在看代码之前需要知道Vue双向绑定的原理其实就是基于Object.defineProperty 实现的双向绑定 官方传送门 这里我们用官方的话来说Object ...
- Vue实现双向绑定的原理以及响应式数据
一.vue中的响应式属性 Vue中的数据实现响应式绑定 1.对象实现响应式: 是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集 ...
- Vue双向绑定实现原理demo
一.index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- vue实现数据双向绑定的原理
一.知识准备Object.defineProperty( )方法可以直接在一个对象上定义一个新属性,或者修改一个已经存在的属性,并返回这个对象.Object.defineProperty(obj,pr ...
- 视图模板引擎——Vue【双向绑定】原理剖析
首先我们来了解一下MVC.MVP.MVMM这三大架构模式在前端角度上的理解. MVC分别是 Model(模型).View(视图).Controller(控制器)三个模块.View(视图层)最主要完成前 ...
随机推荐
- 图解B树及C#实现(3)数据的删除
目录 前言 从叶子节点删除数据 从非叶子节点删除数据 提前扩充只有 t-1 的 Item 的节点:维持 B树 平衡的核心算法 从左兄弟节点借用 Item 从右兄弟节点借用 Item 与左兄弟节点或者右 ...
- linux环境编程(3): 使用POSIX IPC完成进程间通信
1. 写在前面 之前的文章总结了使用管道进行进程间通信的方法,除了pipe和fifo,Linux内核还为我们提供了其他更高级的IPC方式,包括共享内存,消息队列,信号量等,本篇文章会通过一个具有完整逻 ...
- 在日报、读后感、小说、公文模版、编程等场景体验了一把chatGPT
总结/朱季谦 在日报.读后感.小说.公文模版.编程等场景体验了一把chatGPT,说下体会. 昨天经过一顿操作猛如虎的捣鼓,终于在Mac笔记本上将chatGPT的访问环境搭建了起来,忍不住立马开始玩起 ...
- 接水问题(NOIP 2010 PJT2)
这个的思路就是让各个水龙头所用的时间尽可能地接近,可以先向优先队列中推入前m个数,由于开的是小根堆最小的数在前面我们把它拿出来,加上下一个人所需的时间.如此反复,直到都接完水,最大值就是答案. #in ...
- Nginx08 通过扩容提升整体吞吐量 nginx平滑升级-添加sticky模块和使用
1 扩容方式介绍 一个单一站点,想要扩,可以从硬件软件等多个方面来进行. 1 单机垂直扩容:硬件资源增加 2 水平扩展:集群化 3 细粒度拆分:分布式 3-1 数据分区 3-2 上游服务SOA化(原生 ...
- Activiti02流程基本功能使用
主要分为一下几个步骤: 1.画图 2.部署流程-把图的信息转入到数据表格中 3.创建流程实例-开始一个流程-实际发起了一个流程 4.执行任务:获取任务+完成任务 1.画图 画了一个简单的流程图,图形文 ...
- js 全屏代码实现方法
1 /* 全屏方法 2 * ========= 3 <button class="roll-nav roll-right fullscreen"> 4 <i cl ...
- P8_组件-view和scroll-view组件的基本用法
组件 小程序中组件的分类 小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构.官方把小程序的组件分为了 9 大类,分别是: 视图容器 基础内容 表单组件 导航组件 媒体组件 ...
- Spring Boot自动配置原理懂后轻松写一个自己的starter
目前很多Spring项目的开发都会直接用到Spring Boot.因为Spring原生开发需要加太多的配置,而使用Spring Boot开发很容易上手,只需遵循Spring Boot开发的约定就行了, ...
- 三星为其基于 RISC-V的 Tizen平台移植.NET
最近.NET团队在这篇文章中介绍了对.NET移植的一般政策:https://devblogs.microsoft.com/dotnet/why-dotnet/#binary-distributions ...