前端必读Vue响应式系统大PK(上)
响应式系统(Reactivitysystems)是现代前端框架的关键部分之一。应用系统的的高度交互性、动态性和响应能力全靠它支持。每个Web开发人员而言都应该了解这一系统的功能和实践操作。
原理
响应系统是一种使自动使数据源(模型)与数据表示(视图)层自动保持同步的机制。每次模型更改时,都会重新渲染视图。
以一个简单的Markdown编辑器为例。通常编辑器有两个窗格:一个窗格用于编写Markdown代码(用于修改基础模型),另一个窗格用于预览已编译的HTML(显示已更新的视图)。当我们在书写窗格中写东西时,它会立即在预览窗格中自动预览。这个例子比较简单,在实际情况中会复杂很多。
在许多情况下,我们要显示的数据取决于其他数据。在这种情况下,需要跟踪相关数据,并根据跟踪情况来更新数据。例如,我们有一个fullName,该属性由firstName和lastName属性组成。修改其任何依赖项后,fullName将自动重新评估,并在视图中显示结果。
了解什么是响应式系统后,在了解Vue3中的响应系统如何工作以及如何在实践中使用之前,让我们一起来快速回顾一下Vue2中的响应系统内容及其注意事项。Vue2的响应式系统简介
Vue2中的响应或多或少会被隐藏。无论我们放置在data对象中的是什么,Vue都会使其隐式反应(reactiveimplicitly)。这样虽然可以使开发人员的工作更加轻松,但灵活度却会不可避免的降低。
在幕后,Vue2使用ES5Object。defineProperty将data对象的所有属性转换为getter和setter。对于每个组件实例,Vue创建一个依赖关系观察程序实例,观察者会记录组件渲染期间依赖收集跟踪的任何属性。当属性触发依赖项的设置器时,将通知观察者,并将组件重新渲染并更新视图。但是却也会有一些问题存在。变更检测警告
由于Object。defineProperty方法的限制,Vue无法检测到某些数据更改。包括:给对象添加属性或把对象移除属性(例如obj。newKeyvalue)按索引设置数组项(例如arr〔index〕newValue)修改数组的长度(例如arr。lengthnewLength)
不过为了解决这些问题,Vue为提供了Vue。setAPI方法,该方法向响应对象添加了一个属性,确保新属性也是响应性的,从而触发了视图更新。
用下述实例讨论该情况:
pidapp
h1Hello!Mynameis{{person。name}}。Im{{person。age}}yearsold。spanh1
buttonclickaddAgePropertyAddagepropertyspanbutton
pHerearemyfavoriteactivities:spanp
ul
livforitem,indexinactivities:keyindex
{{item}}
buttonclickeditActivity(index)Editspanbutton
spanli
spanul
buttonclickclearActivitiesCleartheactivitieslistspanbutton
spanp
constAppnewVue({
el:app,
data:{
person:{
name:David
},
activities:〔
Readingbooks,
Listeningmusic,
WatchingTV
〕
},
methods:{
1。Addanewpropertytoanobject
addAgeProperty(){
this。person。age30
},
2。Settinganarrayitembyindex
editActivity(index){
constnewValueprompt(Inputanewvalue)
if(newValue){
this。activities〔index〕newValue
}
},
3。Modifyingthelengthofthearray
clearActivities(){
this。activities。length0
}
}
});
在上面的示例中,我们会发现这三种方法都不起作用。我们不能向该person对象添加新属性,无法使用activities的索引来编辑数组中的项目,也不能修改activities数组的长度。
优化如下:
constAppnewVue({
el:app,
data:{
person:{
name:David
},
activities:〔
Readingbooks,
Listeningmusic,
WatchingTV
〕
},
methods:{
1。Addinganewpropertytotheobject
addAgeProperty(){
Vue。set(this。person,age,30)
},
2。Settinganarrayitembyindex
editActivity(index){
constnewValueprompt(Inputanewvalue)
if(newValue){
Vue。set(this。activities,index,newValue)
}
},
3。Modifyingthelengthofthearray
clearActivities(){
this。activities。splice(0)
}
}
});
在此示例中,我们用Vue。setAPI方法将新age属性添加到person对象,并从活动数组中选择修改特定项目。在最后一种情况下,使用JavaScript内置splice方法。
这个做法完全可行但却略显笨拙,而且会导致前后代码不一致。而Vue3就解决了这个问题。
我们用下面示例继续看:
constApp{
data(){
return{
person:{
name:David
},
activities:〔
Readingbooks,
Listeningmusic,
WatchingTV
〕
}
},
methods:{
1。Addinganewpropertytotheobject
addAgeProperty(){
this。person。age30
},
2。Settinganarrayitembyindex
editActivity(index){
constnewValueprompt(Inputanewvalue)
if(newValue){
this。activities〔index〕newValue
}
},
3。Modifyingthelengthofthearray
clearActivities(){
this。activities。length0
}
}
}
Vue。createApp(App)。mount(app)
可以看到在Vue3中,所有方法都可以正常工作。
在Vue2。6中,引入的Vue。observableAPI方法,一定程度的公开了响应式系统,使开发人员可以体验到响应式系统的内容。实际上,这和Vue内部用来包装data对象是完全相同的方法,对于在简单场景创建小的跨组件状态存储很有用。但依旧没办法和Vue3的响应式系统相比,接下来就为大家详细介绍。
注意:由于Object。defineProperty方法是仅限ES5且不可调整的功能,因此Vue2不支持IE8及以下版本。Vue3响应式系统如何工作
为了充分利用ES6ProxyandReflectAPI,Vue3中的响应式系统已被完全重写。新版本新增响应式API,该API使系统比以前更加灵活和强大。
ProxyAPI允许开发人员拦截和修改目标对象上的更低级对象操作。代理(proxy)是对象的克隆包装(clonewrapper),并提供特殊功能(称为target),这些功能响应特定的操作并覆盖JavaScript对象的内置行为(称为traps)。如果仍然需要使用默认行为,则可以使用相应的ReflectionAPI,其名称顾名思义就是反映ProxyAPI的方法。这里有一个示例,用来了解如何在Vue3中使用这些API:
letperson{
name:David,
age:27
};
consthandler{
get(target,property,receiver){
track(target,property)
console。log(property)output:name
returnReflect。get(target,property,receiver)
},
set(target,property,value,receiver){
trigger(target,property)
console。log({property}:{value})output:age:30andhobby:Programming
returnReflect。set(target,property,value,receiver)
}
}
letproxynewProxy(person,handler);
console。log(person)
get(readingapropertyvalue)
console。log(proxy。name)output:David
set(writingtoaproperty)
proxy。age30;
set(creatinganewproperty)
proxy。hobbyProgramming;
console。log(person)
要创建一个新的代理,使用newProxy(target,handler)构造函数。它带有两个参数:目标对象(person对象)和处理程序对象,该对象定义将拦截哪些操作(get和set操作)。在handler对象中,get和set陷阱来跟踪何时读取属性以及何时修改添加属性。设置控制台语句以确保运行正确。
在get和set陷阱采用下列参数:target:代理包装的目标对象property:属性名称value:属性值(此参数仅用于设置操作)receiver:进行操作的对象(通常是代理)
ReflectAPI方法与其相应的代理方法接受相同的参数
注释中track函数和trigger函数特定用于Vue,用于跟踪何时读取属性以及何时修改添加属性。
在示例的最后一部分,用控制台语句输出原始person对象。然后用另一份声明中读取属性name的proxy对象。接下来,修改age属性并创建一个新hobby属性。最后,再次输出该对象以查看它是否正确更新。
以上就是Vue3响应式系统的完整工作流程,但在实际工作中会复杂得多。
使用Vue3响应式系统,还有一些注意事项:仅适用于支持ES6的浏览器响应代理不等于原始对象总结
以上我们将Vue2和Vue3中响应式系统部分进行了比较,并对响应式系统的工作原理进行了说明,在后面的文章中,我们会进一步为大家介绍Vue3中响应式系统的API,敬请期待。
更多技术相关内容,也欢迎点击下方了解更多访问葡萄城技术博客。
速度教学反思八年级物理《速度》一节是认识物体运动一章的重要内容,无论对速度概念的建构,还是对运动快慢的描述,以及对速度及其变形公式的综合应用,要求都是比较高的,这也将对学生今后的物理学习产……
箭不虚发造句箭不虚发是一个汉语成语,意思是箭射得准,每发必中。意同箭无虚发。下面小编给大家带来箭不虚发造句,欢迎大家阅读。箭不虚发【读音】jinbxf【出处】……
奴使的造句奴使拼音【注音】:nushi奴使解释【意思】:书奴役。奴使造句:1、因此,毗瑟奴派的最高实现就是使其接近《吠陀经》超出人类经验的体验。2、在……
关于小学一年级语文所见小池的教学设计教学预设目标:1、有朗读古诗的兴趣,能从诗中感受到夏天的情趣,小学语文一年级下:《所见》《小池》教学设计。2、认识所、牧等12个生字,会写诗、林等6个字。3、……
小学语文看企鹅优秀教案教学目标:1能专心听老师讲故事。听懂故事发生在什么地方,有些什么人,事情的具体经过是怎样的。2在分步回述的基础上,能连贯地、有条理地回讲整个故事。3懂得在公共……
使用诀别造句的句子1。诀别了亲人,他登上了开往前线的列车。2。与青春诀别的关键时刻,最容易创作出关于青春最棒的作品。3。对于真爱而言,分离是一种暂停而非诀别,因为它最后会以幸福收尾而……
思品教案同情还是取笑教学目标认知:知道对人应当尊重,拿同学的缺陷、短处起绰号,或取笑别人,是对他人的不尊重,是不道德的。情感:1对取笑他人的行为感到不满、气愤。2对被……
八年级语文我的母亲教学反思的范文周三下午在教胡适的《我的母亲》时,我课前让学生欣赏了满文军的歌曲《懂你》,有的同学不自觉地跟着轻和着,那样的投入,那样的认真,我抓住时机引导学生:母爱,一个饱含温柔深挚情意的永……
机械效率物理教案设计及教学实录【教学目标】一、知识与技能1知道利用斜面拉物体时,有用功与总功的计算方法,会计算斜面的机械效率。2会测定斜面的机械效率,并会运用控制变量法的实验方法进行探究实……
世界之窗教学设计【课时目标】1知道黄、白、黑三个人种的主要特点及其主要分布区域。2了解不同人种中的杰出人物,明白各个人种都为世界创造了财富和文明。【重点难点】重点:知道……
幼儿园小班吹气球教案导语:孩子的生活乐趣等着我们去激发,我们要用适当的教学方式帮助孩子,下面小编为你整理的幼儿园小班吹气球教案,希望对你有所帮助!活动准备大小不一的瓶子若干,瓶口套有气……
北京版一年级数学下册统计和可能性的教学反思新课标将统计与可能性这部分内容分成了三个大块,从一年二期就安排了简单的收集和统计的知识,让学生从一年级开始就初步了解一些简单的统计方法,了解生活中事物的确定性和不确定性。这节课……
探索月亮的奥秘教学的一些做法和思考映日荷花语文综合性学习,在于拓宽语文学习和运用的领域,注重跨学科的学习和现代科技手段的运用,使学生在不同内容和方法的相互交叉、渗透和整合中开阔视野,提高学习效率,初步获得……
一年级语文我们身边的垃圾教学设计一年级语文《我们身边的垃圾》教学设计1教材说明:《我们身边的垃圾》是义务教育课程标准实验教科书一年级下册(人教版)中第三单元中口语交际的训练内容。这一单元的学习内容……
大班晨间活动教案大全导语:让孩子们感受到体育活动带来的欢乐,愿意参加体育活动。以下小编为大家介绍大班晨间活动教案大全文章,欢迎大家阅读参考!大班晨间活动教案大全1设计思路小班的孩子年龄……
以失魂落魄一词造句的模板1、他每天失魂落魄,到处游走,彷佛在逃避什么似的,令人生疑。2、他今天一副失魂落魄的样子。3、小明一看到厨房冒出火花便失魂落魄地喊着:失火了,大家快逃!4、他……
非常的近义词是什么非常,汉语词汇。fichng。是很、不同寻常的的意思。口语中经常用到,是汉语中最常见的词之一。下面是小编收集整理的非常的近义词是什么,欢迎阅读非常的近义词是什么突出……
水是什么形状教学设计一、教学目标:1、通过对水的观察,学生能利用自己的感官和简单的器材,通过观察活动,收集整理关于水的形状的资料,并能在已有的知识、经验和现有信息的基础上,通过讨论、思考,得……
大班健康教案牙齿上的洞洞活动目标:1、知道酸会腐蚀牙齿;2、能说出龋齿三种以上的危害;3、看动画片,学习牙防五步曲,知道正确的护牙常识;4、培养幼儿良好的卫生习惯。活动准……
大班抢椅子教学反思幼儿期是处于生长发育十分迅速的时期,这有利于幼儿培养发展良好的身体素质。下面是小编为大家收集整理的大班抢椅子教学反思,欢迎阅读。大班抢椅子教学反思一今天我班的主题活动是抢……
成功的法则阅读答案的内容成功的法则有一天,一只小井蛙(对朝)来井边饮水的画眉鸟说:朋友们都笑我坐井观天,见识短浅,这太不公平了!这回我(立下树下)雄心壮志,订好学习计划,两年内成为一名知识渊博的……
上教版(第七册)美术教案色彩的明度教学目的:感受色彩美。上教版(第七册)美术教案色彩的明度认识同一种颜色的特点。用深浅不同的颜色作一幅画。上教版(第七册)美术教案色彩的明度难点……
创造回忆阅读理解答案创造回忆王鼎钧上帝在天上坐着,天使在宝座旁站着,俯视下界,但见人群忙忙碌碌,熙熙攘攘。天使好奇地问:这些人在干什么?他们在寻找一种叫做回忆的东西。过了一……
用辘辘造句【注音】:lulu辘辘解释【意思】:轻象声词,形容车轮声:牛车发出笨重的声饥肠。辘辘造句:1、而女人却看出了男孩的饥肠辘辘,她给了男孩一大杯牛奶。……