范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

前端必读Vue响应式系统大PK(上)

  响应式系统(Reactivity systems)是现代前端框架的关键部分之一。应用系统的的高度交互性、动态性和响应能力全靠它支持。每个Web开发人员而言都应该了解这一系统的功能和实践操作。
  原理
  响应系统是一种使自动使数据源(模型)与数据表示(视图)层自动保持同步的机制。每次模型更改时,都会重新渲染视图。
  以一个简单的Markdown编辑器为例。通常编辑器有两个窗格:一个窗格用于编写Markdown代码(用于修改基础模型),另一个窗格用于预览已编译的HTML(显示已更新的视图)。当我们在书写窗格中写东西时,它会立即在预览窗格中自动预览。这个例子比较简单,在实际情况中会复杂很多。
  在许多情况下,我们要显示的数据取决于其他数据。在这种情况下,需要跟踪相关数据,并根据跟踪情况来更新数据。例如,我们有一个fullName,该属性由firstName和lastName属性组成。修改其任何依赖项后,fullName将自动重新评估,并在视图中显示结果。
  了解什么是响应式系统后,在了解Vue 3中的响应系统如何工作以及如何在实践中使用之前,让我们一起来快速回顾一下Vue 2中的响应系统内容及其注意事项。Vue 2的响应式系统简介
  Vue 2中的响应或多或少会被"隐藏"。无论我们放置在data对象中的是什么,Vue都会使其隐式反应(reactive implicitly)。这样虽然可以使开发人员的工作更加轻松,但灵活度却会不可避免的降低。
  在幕后,Vue 2使用ES5 Object.defineProperty将data对象的所有属性转换为getter和setter。对于每个组件实例,Vue创建一个依赖关系观察程序实例,观察者会记录组件渲染期间依赖收集/跟踪的任何属性。当属性触发依赖项的设置器时,将通知观察者,并将组件重新渲染并更新视图。但是却也会有一些问题存在。变更检测警告
  由于Object.defineProperty方法的限制,Vue无法检测到某些数据更改。包括:给对象添加属性或把对象移除属性(例如obj.newKey = value)按索引设置数组项(例如arr[index] = newValue)修改数组的长度(例如arr.length = newLength)
  不过为了解决这些问题, Vue为提供了Vue.set API方法,该方法向响应对象添加了一个属性,确保新属性也是响应性的,从而触发了视图更新。
  用下述实例讨论该情况:
  < p  id =" app ">
  < h1 > Hello! My name is {{ person.name }}. I"m {{ person.age }} years old. h1 >
  < button  @click =" addAgeProperty "> Add "age" property button >
  < p > Here are my favorite activities: p >
  < ul >
  < li  v-for =" item, index in activities "   :key =" index ">
  {{ item }}
  < button  @click =" editActivity(index) "> Edit button >
  li >
  ul >
  < button  @click =" clearActivities "> Clear the activities list button >
  p >
  const  App  =   new   Vue ({
  el :   "#app" ,
  data :   {
  person :   {
  name :   "David"
  },
  activities :   [
  "Reading books" ,
  "Listening music" ,
  "Watching TV"
  ]
  },
  methods :   {
  // 1. Add a new property to an object
  addAgeProperty ()   {
  this . person . age  =   30
  },
  // 2. Setting an array item by index
  editActivity ( index )   {
  const  newValue  =   prompt ( "Input a new value" )
  if   ( newValue )   {
  this . activities [ index ]   =  newValue
  }
  },
  // 3. Modifying the length of the array
  clearActivities ()   {
  this . activities . length  =   0
  }
  }
  });
  在上面的示例中,我们会发现这三种方法都不起作用。我们不能向该person对象添加新属性,无法使用activities的索引来编辑数组中的项目,也不能修改activities数组的长度。
  优化如下:
  const  App  =   new   Vue ({
  el :   "#app" ,
  data :   {
  person :   {
  name :   "David"
  },
  activities :   [
  "Reading books" ,
  "Listening music" ,
  "Watching TV"
  ]
  },
  methods :   {
  // 1. Adding a new property to the object
  addAgeProperty ()   {
  Vue . set ( this . person ,   "age" ,   30 )
  },
  // 2. Setting an array item by index
  editActivity ( index )   {
  const  newValue  =   prompt ( "Input a new value" )
  if   ( newValue )   {
  Vue . set ( this . activities ,  index ,  newValue )
  }
  },
  // 3. Modifying the length of the array
  clearActivities ()   {
  this . activities . splice ( 0 )
  }
  }
  });
  在此示例中,我们用Vue.setAPI方法将新age属性添加到person对象,并从活动数组中选择/修改特定项目。在最后一种情况下,使用JavaScript内置splice方法。
  这个做法完全可行但却略显笨拙,而且会导致前后代码不一致。而Vue 3就解决了这个问题。
  我们用下面示例继续看:
  const  App  =   {
  data ()   {
  return   {
  person :   {
  name :   "David"
  },
  activities :   [
  "Reading books" ,
  "Listening music" ,
  "Watching TV"
  ]
  }
  },
  methods :   {
  // 1. Adding a new property to the object
  addAgeProperty ()   {
  this . person . age  =   30
  },
  // 2. Setting an array item by index
  editActivity ( index )   {
  const  newValue  =   prompt ( "Input a new value" )
  if   ( newValue )   {
  this . activities [ index ]   =  newValue
  }
  },
  // 3. Modifying the length of the array
  clearActivities ()   {
  this . activities . length  =   0
  }
  }
  }
  Vue . createApp ( App ). mount ( "#app" )
  可以看到在Vue 3中,所有方法都可以正常工作。
  在Vue 2.6中,引入的Vue.observable API方法,一定程度的公开了响应式系统,使开发人员可以体验到响应式系统的内容。实际上,这和Vue内部用来包装data对象是完全相同的方法,对于在简单场景创建小的跨组件状态存储很有用。但依旧没办法和Vue3的响应式系统相比,接下来就为大家详细介绍。
  注意:由于Object.defineProperty方法是仅限ES5且不可调整的功能,因此Vue 2不支持IE8及以下版本。Vue 3响应式系统如何工作
  为了充分利用ES6 Proxy and Reflect API ,Vue 3中的响应式系统已被完全重写。新版本新增响应式API,该API使系统比以前更加灵活和强大。
  Proxy API允许开发人员拦截和修改目标对象上的更低级对象操作。代理(proxy)是对象的克隆/包装(clone/wrapper),并提供特殊功能(称为target),这些功能响应特定的操作并覆盖JavaScript对象的内置行为(称为traps)。如果仍然需要使用默认行为,则可以使用相应的Reflection API,其名称顾名思义就是反映Proxy API的方法。这里有一个示例,用来了解如何在Vue 3中使用这些API:
  let  person  =   {
  name :   "David" ,
  age :   27
  };
  const  handler  =   {
  get ( target ,  property ,  receiver )   {
  // track(target, property)
  console . log ( property )   // output: name
  return   Reflect . get ( target ,  property ,  receiver )
  },
  set ( target ,  property ,  value ,  receiver )   {
  // trigger(target, property)
  console . log ( ` ${ property } :  ${ value } ` )   // output: "age: 30" and "hobby: Programming"
  return   Reflect . set ( target ,  property ,  value ,  receiver )
  }
  }
  let  proxy  =   new   Proxy ( person ,  handler );
  console . log ( person )
  // get (reading a property value)
  console . log ( proxy . name )   // output: David
  // set (writing to a property)
  proxy . age  =   30 ;
  // set (creating a new property)
  proxy . hobby  =   "Programming" ;
  console . log ( person )
  要创建一个新的代理,使用new Proxy(target, handler)构造函数。它带有两个参数:目标对象(person对象)和处理程序对象,该对象定义将拦截哪些操作(get和set操作)。在handler对象中, get和set陷阱来跟踪何时读取属性以及何时修改/添加属性。设置控制台语句以确保运行正确。
  在get和set陷阱采用下列参数:target:代理包装的目标对象property:属性名称value:属性值(此参数仅用于设置操作)receiver:进行操作的对象(通常是代理)
  Reflect API方法与其相应的代理方法接受相同的参数
  注释中track函数和trigger函数特定用于Vue,用于跟踪何时读取属性以及何时修改/添加属性。
  在示例的最后一部分,用控制台语句输出原始person对象。然后用另一份声明中读取属性name的proxy对象。接下来,修改age属性并创建一个新hobby属性。最后,再次输出该对象以查看它是否正确更新。
  以上就是Vue3响应式系统的完整工作流程,但在实际工作中会复杂得多。
  使用Vue 3响应式系统,还有一些注意事项:仅适用于支持ES6 +的浏览器响应代理不等于原始对象总结
  以上我们将Vue2和Vue3中响应式系统部分进行了比较,并对响应式系统的工作原理进行了说明,在后面的文章中,我们会进一步为大家介绍Vue3中响应式系统的API,敬请期待。
  更多技术相关内容,也欢迎点击下方"了解更多"访问葡萄城技术博客。

白话NBA雄鹿即便不夺冠也值得尊敬,热火已经名存实亡文大白大家好,我是大白。欢迎来到我的白话频道。今天聊一下雄鹿和热火这组季后赛对决。昨天这场球,雄鹿出人意料地屠杀热火,把季后赛总比分强势打成2比0。对于这组对决,我先表达两个基本观白话NBA快船战胜太阳,隆多的到来让快船真正有实力抗衡湖人文大白大家好,我是大白。欢迎来到我的白话频道。今天说一下快船和太阳这个球,顺便也说一下湖人和热火这个球。昨天晚上,我去外地给人做辅导,我的一个客户是一个上市公司的CEO,他要去争取白话NBA篮网输热火错不在纳什,主要责任在欧文文大白大家好,我是大白。欢迎来到我的白话频道。今天说一下篮网和热火这个球。今天这个球,是一场很好看的绝杀球,制胜功臣就是阿德巴约。阿德巴约最近几场打得不是特别好,上一场输给森林狼,凛冽寒风中有什么保暖好看的衣物呢?从头到脚一整套实穿推荐随着天气一夜入冬,很多人都自己从短袖T恤换成了保暖棉服,朋友圈里甚至有人把羽绒衣和保暖睡衣都翻出来了。很多人又开始在各大APP上在找秋冬季服饰了吧,正好我最近新入手了几件衣服,穿起湿气,大概是南方人一生的敌人吧,我家的抗湿干燥电器小盘点大家都知道南方梅雨季节的可怕,但谁又能想到,浙江89月的天气居然是这样的。在89号台风的影响下,又热又闷。衣服晒不干鞋子要长毛被褥黏糊糊,潮湿的空气我感觉已经无法忍受了。面对这连天100万元起新款宝马X7上市取消无线充电功能10月22日,宝马旗下的新款X7车型正式上市,推出6款车型可选,官方指导价区间为100万元164。8万元。作为小改款车型,新车在外形方面并没有明确调整,前脸依然是家族化的双肾型进气虾拍档跨境电商功能大全,可定制开发贴牌虾拍档是一款专业服务于跨境电商Shopee平台的软件系统,功能强大且齐全,那么就为大家介绍虾拍档几个主要的功能吧!一一键采集,精品编辑全网主流平台提供支持,编辑功能更加优化商品编辑跨境电商ERP功能大全,免费注册虾拍档虾拍档ERP主要用那些功能,第一前端铺货,系统可以批量采集,批量上传产品,批量修改价格,批量建好产品属性模板,批量修改标题,描述,关键词,图片翻译,文本翻译,订单同步,订单发货,订跨境虾皮ERP系统功能介绍,管理店铺更省心今天介绍一款致力于东南亚市场的虾皮ERP辅助工具,上架产品更快,店铺管理更简单,更有货代仓储系统,贴单解决方案,存仓,商品管理,订单同步等,ERP支持独立数据私有化部署。此款软件在老主机换新颜酷冷至尊MB320L机箱带你进入光污染行列前言从我入手的第一台品牌电脑起,已经有15年了,之后又更新换代了笔记本,对电子产品来说,配置不错的电脑的使用寿命是一般在58年,之后会随时电子元件的老化和一些系统更新不支持等而被淘碰瓷克星双录出彩70迈记录仪魔方A400随着社会的发展,私家车也是越来越多,但难免不了遇到交通事故,当双方产生纠纷时,行车记录仪就显得尤为重要。如今不光有前视录像,现在还有后视录像停车录像,这些都能起到不小的作用。最近笔
国产智能手机新的突破一加在印度高端手机市场超越三星苹果根据市场调研机构Counterpoint的最新调查显示,2018第二季度印度高端手机市场,一加以40的占有率,首次超越三星(34)和苹果(14),成为首个占据印度高端手机市场份额第iPhone14屏幕再次大改居中挖孔药丸,颜值下滑了?最近一段时间,虽然苹果发布了手机耳机笔记本等多款新品,不过这些产品的外观设计也是饱受争议,包括iphone13的小刘海AirPods3的新造型MacBookPro的刘海屏,有不少人绝地求生吃鸡的游戏,到底用什么配置好呢?国丰给你推荐一套绝地求生这款游戏现在是游戏界的明星了,这款游戏虽然很火爆但是画面游戏质量等优化还是很差的,一般的电脑是无法玩这个游戏的。下面小编就给大家介绍一款本店经常装的吃鸡配置,希望对大家有点神人小伙把电脑主机改造成钢铁侠亮瞎眼,风扇即是喷射口对于艺术家来说,各种物品在他们眼中都可以变成艺术品,这不有一个小伙子将电脑机箱改造成11钢铁侠套装,制作出地表最狂电脑!当你第一眼看见这个钢铁侠套装时,可能会心想哇,多么精美的作品秋天给孩子做一碗这不放肉的汤,开胃养胃食材蘑菇或者香菇,嫩豆腐,鸡蛋,姜,酱油,芝麻油,盐,葱,米醋,玉米淀粉,胡椒粉1。首先是蘑菇泡发洗净切片,豆腐切小块2。鸡蛋打散在碗里,姜切几片,切好葱花备用。3。锅内热油,爆香给你一千万,让你在这样隔绝外界的房间里住一年,你愿意吗?法国摄影师拍摄了这样一组照片,一个大铁笼,简单的环境布置,像动物园给动物提供的住所一样,让人类在里面居住,是像动物园的笼子,但是有一点,这里没有人来观看,连个蚊子都没有,饭菜也是机六十多岁的刘晓庆,透亮的大手镯,保养如此好才是最低调的炫富!在娱乐圈有个响当当的人。演技精湛,不管在早期还是现在,她也算得上是前辈了。现在虽然不在拍戏,但依然活跃在观众的视线里。她就是刘晓庆这不,这几天,刘晓庆在一直在出席金城莎莎会周年活动名模嫁香港富豪结婚生子,被投诉也要坚持母乳喂养澳门模特徐绮雯产下5斤的可爱儿子Carlton,升级做妈妈的徐绮雯不顾模特身材,坚持做母乳妈妈,并多次公开分享母乳喂养的益处与乐趣。谈到近日有不少母亲在外喂母乳时遭到歧视,徐绮雯自那些年被你玩坏的课本,你还留着吗?当年有你吗?我想知道你这康有为牌洗发水在哪里买的喜欢就关注下吧杜大人送给你个丝袜MM,哈哈哈喜欢就关注下吧话说李爷爷当年是搞音乐的,不是搞药材的么?喜欢关注下吧小子别走,下课后虎门削你喜欢关注那英差点毁了她的一生,她被罗大佑赞为天才,不放弃今成大赢家那英被称为歌坛天后,这些名号无法满足那英,成为中国新歌声6届的导师,那英当年淘汰了一位音乐天才,如今的名气可以和那英相提并论,甚至名气比那英还火,她就是歌坛新人中的一个传奇艾怡良。微信为什么在支付领域干不过支付宝,就从这次扫码领红包说起在2014年之前,红包是一道独特传统的风景。自2014年春节一包走红后,微信红包的使用也从春节等特定场景,变为放鞭炮送玫瑰包粽子品月饼之外的过节新标配。微信红包的收发数量也在一路飙