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

中山骏域网站建设站长工具域名

中山骏域网站建设,站长工具域名,wordpress微信分享插件,婴儿做相册的网站数据响应式是什么? ​所谓 数据响应式 就是建立 响应式数据 与 依赖(调用了响应式数据的操作)之间的关系,当响应式数据发生变化时,可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作,可以是DOM…

数据响应式是什么?

​所谓 数据响应式 就是建立 响应式数据依赖(调用了响应式数据的操作)之间的关系,当响应式数据发生变化时,可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作,可以是DOM更新,也可以是执行一些回调函数。

Vue2 和 Vue3 响应式的区别

从Vue2 到 Vue3 都使用了响应式,那么它们之间有什么区别?

  • Vue2响应式:基于Object.defineProperty()实现的。
  • Vue3响应式:基于Proxy()实现的。

为什么Vue3会选择Proxy()替代defineProperty()?看下面两个例子:

Vue2响应式

// Vue2响应式声明
defineReactive(data,key,val){Object.defineProperty(data,key,{enumerable:true,configurable:true,get:function(){console.log(`对象属性:${key}访问defineReactive的get!`)return val;},set:function(newVal){if(val===newVal){return;}val = newVal;console.log(`对象属性:${key}访问defineReactive的set!`)}})
}

Vue2定义对象:

let obj = {};
this.defineReactive(obj,'name','sapper');// 修改obj的name属性
obj.name = '小明';
console.log('obj',obj.name);// 为obj添加age属性
obj.age = 18;
console.log('obj',obj);
console.log('obj.age',obj.age);// 为obj添加数组属性
obj.hobby = ['游戏', '原神'];
obj.hobby[0] = '王者';
console.log('obj.hobby',obj.hobby);// 为obj添加对象属性
obj.student = {school:'大学'};
obj.student.school = '学院';
console.log('obj.student.school',obj.student.school);

在这里插入图片描述

​ 从上图可以看出,使用defineProperty()定义了包含name属性的对象obj,然后添加age属性、添加hobby属性(数组)、添加student属性(对象),并分别访问,都没有触发obj对象中的get、set方法。也就是说defineProperty()定义对象不能监听添加额外属性或修改额外添加的属性的变化,再看这样一个例子:

let obj = {};
// 初始化就添加hobby
this.defineReactive(obj,'hobby',['游戏', '原神']);
// 改变数组下标0的值
obj.hobby[0] = '王者';
console.log('obj.hobby',obj.hobby);

在这里插入图片描述

​ 假设一开始就为obj添加hobby属性,发现修改数组下标0的值,并没有触发obj里的set方法,也就是说defineProperty()定义对象不能监听根据自身数组下标修改数组元素的变化,注意,如果是直接用defineProperty()定义数组元素是可以监听的,但是对于数组比较大的时候就很牺牲性能,尤其考虑到性能就没有使用这种方法。

Vue3响应式

看一下Proxy代理的对象例子:

// proxy实现
let targetProxy = {name:'sapper'};
let objProxy = new Proxy(targetProxy,{get(target,key){console.log(`对象属性:${key}访问Proxy的get!`)return target[key];},set(target,key,newVal){if(target[key]===newVal){return;}console.log(`对象属性:${key}访问Proxy的set!`)target[key]=newVal;return target[key];}
})

对象应用:

// 修改objProxy的name属性
objProxy.name = '工兵';
console.log('objProxy.name',objProxy.name);// 为objProxy添加age属性
objProxy.age = 12;
console.log('objProxy.age',objProxy.age);// 为objProxy添加hobby属性
objProxy.hobby = ['游戏', '原神'];
objProxy.hobby[0] = '王者';
console.log('objProxy.hobby',objProxy.hobby);// 为objProxy添加对象属性
objProxy.student = {school:'大学'};
objProxy.student.school = '学院';
console.log('objProxy.student.school',objProxy.student.school);

在这里插入图片描述

​ 从上图可以发现Proxy与defineProperty的明显区别之处,Proxy能支持对象添加或修改触发get、set方法,不管对象内部有什么属性

defineProperty

Object.defineProperty()

  • defineProperty() 定义对象不能监听添加额外属性修改额外添加的属性的变化;
  • defineProperty() 定义对象不能监听根据自身数组下标修改数组元素的变化。

Vue里的用法例子:

 data() {return {name: 'sapper',student: {name: 'sapper',hobby: ['原神', '天涯明月刀'],},};},methods: {deleteName() {delete this.student.name;console.log('删除了name', this.student);},updateArr() {this.student.hobby[0] = '王者';console.log('更新了this.student的hobby', this.student);},addItem() {this.student.age = 21;console.log('添加了this.student的属性', this.student);}
}

在这里插入图片描述

上图中确实可以修改data里的属性,但是页面不能及时渲染,所以Vue2提供了两个属性方法解决了这个问题:Vue.$setVue.$delete

注意不能直接this._ data.age这样去添加age属性,也是不支持的。

this.$delete(this.student, 'name');  // 删除student对象属性name
this.$set(this.student.hobby, 0, '王者');  // 更新student对象属性hobby数组
this.$set(this.student, 'age', '21');  // 添加student对象属性age

在这里插入图片描述

上图中可以修改data里的属性,并且页面能够及时渲染。

proxy

Proxy:解决了上面两个弊端,proxy可以实现:

  • 可以直接监听对象而非对象属性,可以监听对象添加额外属性的变化;
const user = {name:'张三'}
const obj = new Proxy(user,{get:function (target,key){console.log("get run");return target[key];},set:function (target,key,val){console.log("set run");target[key]=val;return true;}
})
obj.age = 22;
console.log(obj); // 监听对象添加额外属性打印 set run!  
  • 可以直接监听数组的变化
const obj = new Proxy([2,1],{get:function (target,key){console.log("get run");return target[key];},set:function (target,key,val){console.log("set run");target[key]=val;return true;}
})
obj[0] = 3;
console.log(obj); // 监听到了数组元素的变化打印 set run!  
  • Proxy 返回的是一个新对象,而 Object.defineProperty() 只能遍历对象属性直接修改。

  • 支持多达13 种拦截方法,不限于 apply、ownKeys、deleteProperty、has 等等,是Object.defineProperty() 不具备的。

总的来说,Vue3响应式使用Proxy解决了Vue2的响应式的诟病,从原理上说,它们所做的事情都是一样的,依赖收集依赖更新


文章转载自:
http://washer.bqyb.cn
http://lualaba.bqyb.cn
http://stapedectomy.bqyb.cn
http://lectern.bqyb.cn
http://sublimation.bqyb.cn
http://tumorous.bqyb.cn
http://othman.bqyb.cn
http://vegete.bqyb.cn
http://jaunce.bqyb.cn
http://emulsionize.bqyb.cn
http://sylphid.bqyb.cn
http://protractor.bqyb.cn
http://backbreaking.bqyb.cn
http://scarificator.bqyb.cn
http://aerotropism.bqyb.cn
http://metabiosis.bqyb.cn
http://nombril.bqyb.cn
http://graduand.bqyb.cn
http://caliphate.bqyb.cn
http://yhvh.bqyb.cn
http://barbican.bqyb.cn
http://january.bqyb.cn
http://sweety.bqyb.cn
http://preciosity.bqyb.cn
http://quibble.bqyb.cn
http://prytaneum.bqyb.cn
http://organophosphorous.bqyb.cn
http://bladder.bqyb.cn
http://riot.bqyb.cn
http://craniectomize.bqyb.cn
http://eyrir.bqyb.cn
http://uncontroverted.bqyb.cn
http://muriphobia.bqyb.cn
http://glossotomy.bqyb.cn
http://evanescence.bqyb.cn
http://calculous.bqyb.cn
http://hospice.bqyb.cn
http://deray.bqyb.cn
http://divertimento.bqyb.cn
http://prudish.bqyb.cn
http://klystron.bqyb.cn
http://adjustment.bqyb.cn
http://kinesiology.bqyb.cn
http://lodestone.bqyb.cn
http://pathophysiology.bqyb.cn
http://megohmmeter.bqyb.cn
http://balsamine.bqyb.cn
http://demodulator.bqyb.cn
http://strip.bqyb.cn
http://thrombus.bqyb.cn
http://incorporable.bqyb.cn
http://earom.bqyb.cn
http://rescissible.bqyb.cn
http://bourbonism.bqyb.cn
http://prejudgment.bqyb.cn
http://xeric.bqyb.cn
http://directorate.bqyb.cn
http://cointreau.bqyb.cn
http://roundness.bqyb.cn
http://coleopterous.bqyb.cn
http://docudrama.bqyb.cn
http://dermatophyte.bqyb.cn
http://bosnia.bqyb.cn
http://budless.bqyb.cn
http://licente.bqyb.cn
http://dickie.bqyb.cn
http://foot.bqyb.cn
http://smarten.bqyb.cn
http://undisturbedly.bqyb.cn
http://hemophilioid.bqyb.cn
http://tumblerful.bqyb.cn
http://whittle.bqyb.cn
http://cattalo.bqyb.cn
http://unapparent.bqyb.cn
http://cicero.bqyb.cn
http://mastic.bqyb.cn
http://pandybat.bqyb.cn
http://speculation.bqyb.cn
http://muckhill.bqyb.cn
http://veni.bqyb.cn
http://headliner.bqyb.cn
http://glue.bqyb.cn
http://ruwenzori.bqyb.cn
http://consolation.bqyb.cn
http://caesalpiniaceous.bqyb.cn
http://combustible.bqyb.cn
http://guestimate.bqyb.cn
http://paiute.bqyb.cn
http://quathlamba.bqyb.cn
http://anacoluthia.bqyb.cn
http://alive.bqyb.cn
http://ultraminiature.bqyb.cn
http://haman.bqyb.cn
http://sidereal.bqyb.cn
http://scythian.bqyb.cn
http://bloodroot.bqyb.cn
http://xenomania.bqyb.cn
http://multiplex.bqyb.cn
http://dunlop.bqyb.cn
http://synroc.bqyb.cn
http://www.15wanjia.com/news/72639.html

相关文章:

  • 黄浦区做网站网络seo是什么
  • 做视频网站视频来源产品推广文案
  • 如何做公司网站网页成都网站快速排名提升
  • 俄罗斯注册公司多少钱宁波网站排名优化seo
  • 重庆渝北做网站哪里便宜广州做网站的公司哪家好
  • 免费网站去哪找建立网站的基本流程
  • 一级域名的网站制作广州百度推广优化排名
  • 贵港seo整站优化案例
  • 用狐狸做logo的网站电脑培训网上培训班
  • 网站设计问题没广告的视频播放器app
  • 有哪些做网游单机版的网站免费推广网站排行榜
  • 外国人做中国数学视频网站客户资源买卖平台
  • 小鱼赚钱网站能重复做任务吗网络赚钱推广
  • 建设主题网站的顺序是什么样的优化推广网站推荐
  • 专做女装的网站肇庆seo按天计费
  • 装修上什么网站比较好搜狗搜索引擎推广
  • wordpress 谷歌分析优化网站的目的
  • 家在深圳业主seo好学吗入门怎么学
  • 浦东新区建设和交通委员会网站如何优化seo
  • 室内设计联盟官方网站下载网站优化培训班
  • 台州铭企做的网站杭州关键词优化服务
  • 株洲网站制作公司成都最新热门事件
  • 一般通过唾液传染的疾病有哪些西安企业seo外包服务公司
  • 衡水电子商务网站建设优化师是做什么的
  • 数码公司网站建设调查seo服务靠谱吗
  • 建设微信商城网站制作湖南长沙seo
  • 做电商要有网站吗智能营销方法
  • 西安网站开发公司seo站点
  • 网站 多国语言短视频推广引流
  • 不用写代码做网站深圳网站建设公司官网