当前位置: 首页 > news >正文

广西建设职业技术学院教育网站正规网站建设定制

广西建设职业技术学院教育网站,正规网站建设定制,长沙建网站联系电话,商城网站怎么做的什么是响应式 Js代码是自上而下执行的,结合下面代码看,代码执行后,会打印两次double的结果,结果也都是2,即使修改了代码中count的值后,double的值也不会发生任何改变。 let count 1 let double count * …

什么是响应式

        Js代码是自上而下执行的,结合下面代码看,代码执行后,会打印两次double的结果,结果也都是2,即使修改了代码中count的值后,double的值也不会发生任何改变。

let count = 1
let double = count * 2
console.log(double)
count = 2
console.log(double)

double的值由count的值乘以2所得,若想让double能够在count变化时也变化,那就要在每次修改countd的值时,重新计算double。如下面代码

let count = 1
// 计算过程封装成函数
let getDouble = n=>n*2 //箭头函数
let double = getDouble(count)
console.log(double)count = 2
// 重新计算double,这里我们不能自动执行对double的计算
double = getDouble(count)
console.log(double)

 若可以将getDouble函数自动执行,我们使用某种机制把count包裹一层,每当count进行修改时,就去同步更新double的值,那就有了double自动跟着count变化而变化的感觉,这就是响应式的雏形。

响应式的原理

        Vue中用过defineProperty、Proxy和value setter三种响应式解决方案。

 defineProperty API   

        结合例子来说明,下面定义一个对象obj,使用defineProperty代理count属性。这样就对obj对象的value属性实现了拦截,读取count属性时执行get函数,修改count属性时执行set函数,并在set函数内部重新计算了double。这样就实现了简易的响应式功能。

let getDouble = n=>n*2
let obj = {}
let count = 1
let double = getDouble(count)Object.defineProperty(obj,'count',{get(){return count},set(val){count = valdouble = getDouble(val)}
})
console.log(double)  // 22222
obj.count = 2
console.log(double) // 4444  有种自动变化的感觉

  defineProperty  API作为Vue2实现响应式的原理,语法上也有一些缺陷,比如如下代码中,删除obj.count属性,set函数就不会执行,double还是之前的值,这也是为什么Vue2中,需要$delete一个专门的函数去删除数据。

delete obj.count
console.log(double) // doube还是4

Proxy

        Vue3的响应式机制就是基于Proxy实现的,从Proxy这个名字也能看出是代理的意思,Proxy的重要意义在于它解决了Vue2响应式的缺陷。看下面代码,通过new Proxy代理obj这个对象,然后通过get、set和deteleProperty函数代理了对象的读取、修改和删除操作,从而实现了响应式的功能。

let proxy = new Proxy(obj,{get : function (target,prop) {return target[prop]},set : function (target,prop,value) {target[prop] = value;if(prop==='count'){double = getDouble(value)}},deleteProperty(target,prop){delete target[prop]if(prop==='count'){double = NaN}}
})
console.log(obj.count,double)
proxy.count = 2
console.log(obj.count,double) 
delete proxy.count
// 删除属性后,我们打印log时,输出的结果就会是 undefined NaN
console.log(obj.count,double) 

 Proxy是针对对象来监听的,而不是针对某个具体属性,所以不仅可以代理那些定义时不存在的属性,还可以代理更丰富的数据结构,比如Map、Set等,并且还能通过deleteProprety实现对删除操作的代理。

value setter

Vue3中还有一种响应式实现的逻辑,就是利用对象的get和set函数来进行监听,这种响应式的实现方式,只能拦截某一个属性的修改,这也是Vue3中ref的实现,在下面代码中,拦截了count的value属性,并且拦截了set操作,也能实现了类似的功能。

let getDouble = n => n * 2
let _value = 1
double = getDouble(_value)let count = {get value() {return _value},set value(val) {_value = valdouble = getDouble(_value)}
}
console.log(count.value,double)
count.value = 2
console.log(count.value,double)

 三种实现原理的对比

实现原理definePropertyProxyvalue setter
实际场景Vue2响应式Vue3  reactiveVue3 ref
优势兼容性基于Proxy实现真正的拦截实现简单
劣势数组和属性删除等拦截不了兼容不了IE11只拦截了value属性
实际应用Vue2Vue3复杂数据结构Vue3简单数据结构

 

http://www.yayakq.cn/news/712438/

相关文章:

  • 个人网站模板怎么做友情链接交换的方法
  • 郑州免费网站制作保健品企业网站
  • asp装修公司网站源码服务器搭建云手机
  • 移动互联网网站开发黄龙云 加强网站建设
  • 广西建设科技协会网站网站建设网站制作
  • 网站信息核验单淘宝网卖家中心入口
  • 小说网站开发的目的游戏代理一个月能赚多少钱
  • 手表交易网站晋城购物网站开发设计
  • 网站资料北京软件开发公司名单1000家
  • 建设一个视频网站需要什么时候开始芜湖网站优化公司
  • 常州辉煌网络网站制作焦作网站设计多少钱
  • 如何利用div做网站网站备案现状
  • 注册公司网站模版wordpress 4.4.1 中文
  • 南京做企业号微网站营销58同城招聘网找工作附近
  • 电商设计有前景吗seo快速培训
  • 三合一做网站wordpress图片特效插件
  • 网站搜索引擎优化方案上虞市建设风机厂网站
  • 个人网站设计首页界面河南最新建设工程信息
  • 国外flash网站模板品牌宣传有哪些途径
  • 某网站项目策划书网页设计与制作教程的教学目标
  • 那个相亲网站做的比较好怎么合作做网站
  • 网站页面框架设计windows优化大师免费
  • 做商城网站哪家好代写文章的平台有哪些
  • 网站建设 预算免费建站的网址
  • 分析网站建设前期的seo准备工作顶做抱枕网站
  • 网站建设 连云港怎样在别人网站做加强链接
  • 用帝国cms做门户网站哪个网站使用vue 做的
  • 小程序开发平台需要网站吗长沙3合1网站建设价格
  • 19互动网站建设网页qq登陆首页
  • 芜湖网站建设网站制作公司ps做网站时画布宽度